Machine Learning with Scikit Learn (Part IV)
Machine Learning with Scikit Learn (Part III)(2015/9/8)のつづき。5.2節ではSupport Vector Machine (SVM)が詳しく取り上げられている。
5.2 In Depth - Support Vector Machines
scikit-learnでは分類用のSupport Vector Classifierssklearn.svm.SVC
と回帰用のSupport Vector Regressorsklearn.svm.SVR
の2種類が用意されている。この節では主にSVCが取り上げられている。以後、SVMと言ったらSVCを指す。
SVMの識別関数
SVMの識別関数は下式のようになる。
ここで、はj番目の訓練データ、はテストサンプル、はカーネル関数を意味する。が訓練データから学習されるSVMのパラメータ。SVMのパラメータは訓練データと同じ数だけある。
SVMのパラメータを学習するといくつかのサンプルのみ0ではないが得られて、その他は0になる。この0でないを持つサンプルがサポートベクトルと呼ばれ、分類境界を決定する上で大きな役割を果たす。
SVMの識別関数の導出は以前PRMLを勉強したときにまとめた。下の記事の式(7.13)が上と同じ式。
カーネル関数
SVMはカーネル関数を変えることで挙動が変わる。scikit-learnには、
- 線形カーネル(
linear
) - 多項式カーネル(
poly
) - ガウスカーネル(
rbf
) - シグモイドカーネル(
sigmoid
)
が用意されている。独自のカーネル関数を定義することもできる。デフォルトではガウスカーネルが使われる。
ガウスカーネルはパラメータgamma
を取り、分類境界の滑らかさを表す。gamma
が小さいほど滑らかな境界が得られる。
SVMの正則化パラメータC
前回(2015/9/8)も取り上げたけどSVMではパラメータCを用いて正則化の強さを調整できる。このCはペナルティ項の重みを意味する。つまり、Cが大きいほど誤分類のペナルティが大きくなるため訓練データをなるべく分類しようとして過学習気味になる。一方、Cを小さくすると正則化が強まり、汎化性能が高まる。ただし、Cを小さくしすぎるとモデルが単純になりすぎて逆に性能が出なくなる。
ここら辺も前にPRMLでソフトマージンSVMを勉強したときにまとめた。
SVMのパラメータ
ここまでをまとめるとガウスカーネルを用いたSVMには、gamma
とC
という2つの調整すべきパラメータがある。このチュートリアルのノートブックには、これらのパラメータによって分類曲線がどう変わるかをインタラクティブに体験できるデモがついている。
上のつまみをいじるとリアルタイムにサポートベクトル(黒い枠付きの丸)と分類曲線が変わる(この記事のはスクリーンショットなのでできない)。iPython Notebookはこんなこともできるのか~面白いな。
練習問題
最後に手書き数字認識のデータを使ってSVMのパラメータをグリッドサーチで求めろという練習問題があったので解いてみた。下のような感じかな?SVCのカーネルはデフォルトがrbf
なので書かなくてもOK。
実行結果は、
{'C': 10, 'gamma': 0.001} 0.991833704529 0.993333333333
となる。パラメータはC = 10 & gamma = 0.001
のときが最適で、そのときのValidation Scoreは99.18%でTest Scoreは99.33%となる。SVMはニューラルネットが伸びてきたせいであまり注目されなくなった気がするけど分類精度はかなりのものだ。
Part Vにつづく。次はRandom Forest。