【機械学習】サポートベクターマシン(SVM)を使用して、乳癌かどうか調べてみる
サポートベクターマシン(SVM)について
サポートベクターマシン(以下SVM)とは、教師ありの機械学習の一手法です。 SVMは、現在知られている機械学習の手法の中で、認識性能が優れた学習モデルの一つです。 その理由は、未学習データに対して高い識別性能を得るための工夫があるためです。 学習サンプルから「マージン最大化」という基準で線形入力素子を利用して 2 クラスのパターン識別器を構成します。
SVMの具体的な例
○と●という2種類のデータがあるとして、そのデータをどのように分けるかを考えたとき、境界線を引くことが考えられます。
下記のグラフを見てみましょう。
- H3は二つのクラスのいくつかの点を正しく分類していません。
- H1とH2は二つのクラスのいくつかの点を正しく分類しています。
- H2がH1よりもっと大きいマージンを持って分類することを確認することができます。
※wikipediaより。
この識別平面からもっとも近い既知パターンとの距離(マージン)を最大になるように決定するのが最良の結果となります。 これがSVMの「マージン最大化」という方針です。 SVMを使えば未知のパターンに対しても正しく分類できる確率が高いと言われてます。
PHPでSVMを使えるようにする
CentOSでインストールする場合はこんな感じです。
sudo yum install libsvm libsvm-devel sudo pecl install svm-0.1.9
php.iniに下記を加える
extension=svm.so
これで準備ができました。
SVMを使って乳がんかどうかを調べる
スタンフォード大学の機械学習コースでも同じような例があったので試してみます。
乳がんであることは色んな要因があると考えられます。
今回はSVMのテストなので、2次元ベクトルとして、年齢としこりの大きさで考えてみましょう。
イメージが下記のグラフです。
X軸がしこりの大きさ、Y軸が年齢、赤が悪性、青が良性です。
実際のサンプルデータがないので便宜的に右上が悪性、左下が良性としてプログラムで作成してしまいます。
<?php $data = []; for ($i = 0;$i < 100;$i++) { // 良性 $size = mt_rand(0,4); $age = mt_rand(0,40); $data[] = [0,$size,$age]; // 悪性 $size = mt_rand(5, 10); $age = mt_rand(50, 80); $data[] = [1,$size,$age]; } // データを学習してモデルを生成 $svm = new SVM(); $model = $svm->train($data); // 良性テスト $pre = $model->predict([1,30]); echo $pre. "\n"; // 悪性テスト $pre = $model->predict([8,70]); echo $pre. "\n";
実行してみます。
$ php svm-test.php 0 1
うまくいきましたね!実際は乳房の腫瘍の塊の厚み、腫瘍の細胞のサイズの均一性、腫瘍の細胞の形状の均一性などなど、様々な要素が絡み合いますが、基本的な考え方は一緒です。 実際のデータを元に算出してみたいですね。