make_circlesのデータセットを用いてSVMを実施する【グリッドサーチ,交差検証】
この記事のポイント
  • RBFカーネルを使ったSVMによる非線形分離を実施.
  • make_circleのnoiseの異なるデータで検証.
  • グリッドサーチと交差検証(クロスバリデーション)も扱う.

こんにちは.けんゆー(@kenyu0501_)です.

https://twitter.com/kenyu0501_/status/1167323135542063105

やっぱりRBFカーネルでSVMを試すときには,こういった線形分離不可能なデータの方が見栄えが良いですよね.
闇雲にやってて分かりにくい対象を使っていましたが,反省しています.

この記事では,線形分離不可能なデータを使ってSVMでクラス分類を解きます.
使用するデータは,Scikit-learnのmake_circlesのデータです.
(参考:Scikit-learnのデータセットについて【make_blobs, make_moons, make_circles】)

クラスの異なるデータ群が,円状に配置されているデータですね.
外側と内側に分布しているので,直線での分離ができないわけです.

この記事では,rbfカーネルを使用します.
さらに,グリッドサーチ,クロスバリデーションも行なって,ハイパーパラメータ(γとC)のチューニングも実施します.

プログラムについて

先に,pythonによるプログラムを公開しておきます.

データの切り分け

SVMを実施するときには,トレーニングデータ(80%)テストデータ(20%)に分けます.
今回は,パラメータのチューニングも行うので,トレーニングデータからさらに20%をバリデーション(評価)データとして分けます.

データ全体の構図(データセットから解析まで)

扱うデータを,先ほど示したような感じでデータを切り分け,トレーニングデータバリデーションデータを使って,ハイパーパラメータのチューニングを行います.
ハイパーパラメータのチューニングは,グリッドサーチクロスバリデーションです.
(関連:rbfカーネルのハイパーパラメータをグリッドサーチとベイズ最適化で探す【irisデータセット】)

make_circlesのnoiseを色々と変えてSVMの実装

make_circleのデータセットにノイズを適当に入れて,SVMの結果がどのようになるのかを可視化しようと思います.

noise = 0.1

noiseの混入が少ないので,円状のデータセットはまだ形状を保っていますね.
この時のSVMの結果を見ると,かなり汎化性能が高いです.
グリッドサーチに関しても,どこのパラメータをとっても結果が良いことがわかります.

noise = 0.2

noise = 0.2にすると,内側の青いデータ群と,外側の赤いデータ群がちょっと入り組んだような形になります.
この時は,汎化性能が90%になりました.
それでもそこそこ機能しています.

noise = 0.3

noise = 0.3 になると,かなり複雑ですね.
グリッドサーチの結果も,全体的に,かなり汎化性能が低くなっていることがわかります.
一番良い箇所で,77.5%でした.

ペンのすけ

興味のある人はやってみてねー!

サポートベクターマシンの解説動画

ペンのすけ

参考にしてみてくださいー!