$yuzu->log();

技術ネタなど。

【機械学習】サポートベクターマシン(SVM)を使用して、乳癌かどうか調べてみる

サポートベクターマシン(SVM)について

サポートベクターマシン(以下SVM)とは、教師ありの機械学習の一手法です。 SVMは、現在知られている機械学習の手法の中で、認識性能が優れた学習モデルの一つです。 その理由は、未学習データに対して高い識別性能を得るための工夫があるためです。 学習サンプルから「マージン最大化」という基準で線形入力素子を利用して 2 クラスのパターン識別器を構成します。

SVMの具体的な例

○と●という2種類のデータがあるとして、そのデータをどのように分けるかを考えたとき、境界線を引くことが考えられます。

下記のグラフを見てみましょう。

  • H3は二つのクラスのいくつかの点を正しく分類していません。
  • H1とH2は二つのクラスのいくつかの点を正しく分類しています。
  • H2がH1よりもっと大きいマージンを持って分類することを確認することができます。

f:id:yuzurus:20161010221723p:plain

wikipediaより。

この識別平面からもっとも近い既知パターンとの距離(マージン)を最大になるように決定するのが最良の結果となります。 これがSVMの「マージン最大化」という方針です。 SVMを使えば未知のパターンに対しても正しく分類できる確率が高いと言われてます。

PHPSVMを使えるようにする

CentOSでインストールする場合はこんな感じです。

sudo yum install libsvm libsvm-devel
sudo pecl install svm-0.1.9

php.iniに下記を加える

extension=svm.so

これで準備ができました。

SVMを使って乳がんかどうかを調べる

スタンフォード大学機械学習コースでも同じような例があったので試してみます。

www.coursera.org

乳がんであることは色んな要因があると考えられます。

今回はSVMのテストなので、2次元ベクトルとして、年齢としこりの大きさで考えてみましょう。

イメージが下記のグラフです。

X軸がしこりの大きさ、Y軸が年齢、赤が悪性、青が良性です。 f:id:yuzurus:20161010225737p:plain

実際のサンプルデータがないので便宜的に右上が悪性、左下が良性としてプログラムで作成してしまいます。

<?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

うまくいきましたね!実際は乳房の腫瘍の塊の厚み、腫瘍の細胞のサイズの均一性、腫瘍の細胞の形状の均一性などなど、様々な要素が絡み合いますが、基本的な考え方は一緒です。 実際のデータを元に算出してみたいですね。