機械学習記11日目続き ~ サポートベクターマシン(SVM)

 サポートベクターマシンSVM)は、2クラスの識別アルゴリズムでは「強力」と言われているようですが、アルゴリズムがとても複雑です。正直、私はまだよくわかっていません。

 ただ、理解できた範囲内で説明すると、SVMの特徴には「マージン最大化」と「カーネルトリック」があるということです。

 「マージン」とは、識別面と2つのクラスの間の距離のことです。このマージンが最大になるようにすることで、「汎化能力を最大にしよう」ということのようです(図1)。

f:id:hackU0001:20190302134726p:plain

図1.マージン最大化

 

 それほど学習しなくても評価データ(未知のデータ)の判別精度が高い学習モデルを「汎化能力が高い」といいます。つまり、SVMはマージン最大化によって、未知のデータに対して判別精度が高いアルゴリズムだというわけですね。

 ただし、マージン最大化は、あくまでも線形分離可能なデータに対してのみ有効です。そして、SVMは「カーネルトリック」という手法を取り入れることで、線形分離が難しい問題に対処しています。

 「カーネルトリック」とは、高次元空間上で線形分析を行う機能です。これまでのような2次元の分析ではなく、3次元、4次元へと写像して線形分析を行うらしいのですが、これ以上は数学の知識不足により理解できませんでした。

 とりあえず、学習モデルが生成できれば、何とかなるのではないかということで、実装を始めたいと思います。

 

svm.SVC

 非線形な識別を可能にする学習モデルを作るには、svm.SVCを使います。書式は図2のようになります。

f:id:hackU0001:20190302142212p:plain

図2.svm.SVCの書式

f:id:hackU0001:20190302142845p:plain

 

SVMで画像の識別

 機械学習のテストは、ロジスティック回帰と同じ手順です。ただし、学習モデルはsvm.SVCを使います。パラメータのgamma=0.001は、kernelが 'rbf' (デフォルト)の場合の決定境界の複雑度合いを表し、大きいほど複雑になります。

 また、C=100.は誤分類を許容する尺度です。これらの引数の値は、digitsデータセットに対する適正値がわからなかったので、とりあえず入門書などのサンプル数値を参考にしています。

 それでは、svmをインポートして、svm.SVCの学習モデルを生成します。

f:id:hackU0001:20190302143638p:plain

 

 学習モデルが生成できたら、学習させます。

f:id:hackU0001:20190302143938p:plain

f:id:hackU0001:20190302144101p:plain

 

 <学習完了>

f:id:hackU0001:20190302144744p:plain

 

 学習が完了したので、精度を評価します。

f:id:hackU0001:20190302145359p:plain

 

  ロジスティック回帰と比べて、精度はかなり高い気がします。それぞれの数字の正解、不正解を確認します。

f:id:hackU0001:20190302150306p:plain

f:id:hackU0001:20190302150431p:plain

 

 成績が大きく向上しています。SVM最強説は、ホントかもしれません。

 もっとも、パラメータの調整やデータの種類でスコアは異なるので、他のアルゴリズムでもパターンを変えてテストする必要はありそうです。

 明日のブログでは、ニューラルネットワーク教師なし学習に挑戦していきたいと思います。