機械学習記11日目続き ~ サポートベクターマシン(SVM)
サポートベクターマシン(SVM)は、2クラスの識別アルゴリズムでは「強力」と言われているようですが、アルゴリズムがとても複雑です。正直、私はまだよくわかっていません。
ただ、理解できた範囲内で説明すると、SVMの特徴には「マージン最大化」と「カーネルトリック」があるということです。
「マージン」とは、識別面と2つのクラスの間の距離のことです。このマージンが最大になるようにすることで、「汎化能力を最大にしよう」ということのようです(図1)。
それほど学習しなくても評価データ(未知のデータ)の判別精度が高い学習モデルを「汎化能力が高い」といいます。つまり、SVMはマージン最大化によって、未知のデータに対して判別精度が高いアルゴリズムだというわけですね。
ただし、マージン最大化は、あくまでも線形分離可能なデータに対してのみ有効です。そして、SVMは「カーネルトリック」という手法を取り入れることで、線形分離が難しい問題に対処しています。
「カーネルトリック」とは、高次元空間上で線形分析を行う機能です。これまでのような2次元の分析ではなく、3次元、4次元へと写像して線形分析を行うらしいのですが、これ以上は数学の知識不足により理解できませんでした。
とりあえず、学習モデルが生成できれば、何とかなるのではないかということで、実装を始めたいと思います。
非線形な識別を可能にする学習モデルを作るには、svm.SVCを使います。書式は図2のようになります。
▶SVMで画像の識別
機械学習のテストは、ロジスティック回帰と同じ手順です。ただし、学習モデルはsvm.SVCを使います。パラメータのgamma=0.001は、kernelが 'rbf' (デフォルト)の場合の決定境界の複雑度合いを表し、大きいほど複雑になります。
また、C=100.は誤分類を許容する尺度です。これらの引数の値は、digitsデータセットに対する適正値がわからなかったので、とりあえず入門書などのサンプル数値を参考にしています。
それでは、svmをインポートして、svm.SVCの学習モデルを生成します。
学習モデルが生成できたら、学習させます。
<学習完了>
学習が完了したので、精度を評価します。
ロジスティック回帰と比べて、精度はかなり高い気がします。それぞれの数字の正解、不正解を確認します。
成績が大きく向上しています。SVM最強説は、ホントかもしれません。
もっとも、パラメータの調整やデータの種類でスコアは異なるので、他のアルゴリズムでもパターンを変えてテストする必要はありそうです。
明日のブログでは、ニューラルネットワークと教師なし学習に挑戦していきたいと思います。