saito

記者紹介

saitoxu(さいとぅ)

株式会社Carat 最高技術責任者 京都大学大学院修了。新卒でITベンチャーに就職し、BtoBのWebサービス開発に従事。キカガクOnlineでは機械学習を学ぶ初心者が、次のステップを踏み出すのに役立つ情報を発信していく予定。

svm

機械学習の代表的手法のひとつである、サポートベクターマシンを使ったクラス分類のプログラムを書いてみます。

サポートベクターマシン(SVM)とは

サポートベクターマシン(SVM)はクラス分類や回帰に使われるアルゴリズムです。
機械学習の代表的手法と言えるでしょう。
理論については下記のスライドが分かりやすいと思います。

例題

それではSVMを使ってクラス分類のプログラムを書いてみましょう。
データは下記から取得し、今回は一部だけを使うことにします。

あやめのデータ
※ちなみにこのデータセットは非常に有名で、機械学習はもちろん統計などにもよく使われています。

今回はあやめの花のがく片とがく片の幅のデータから、あやめの品種の分類を行います。
一部を抜粋したところ、下記のようなグラフになりました。

graph
※セトナとバーシクルはあやめの品種です

これは次の図のようにうまく線形分類できそうです。

graph2

※線形・非線形についてはこちらの記事をどうぞ↓

プログラム

それではプログラムを書いてみましょう。
プログラムには以前紹介したscikit-learnを使います。
これを使ってわずか10行でSVMを使った分類機を作れます。

プログラムは以下の通りです。

# coding: utf-8
from sklearn import svm  # skleanのライブラリからsvmを読み込み

X = [[5.1, 3.5], [4.9, 3], [4.7, 3.2], [4.6, 3.1], [5, 3.6], [5.4, 3.9], [4.6, 3.4],
     [7, 3.2], [6.4, 3.2], [6.9, 3.1], [5.5, 2.3], [6.5, 2.8], [5.7, 2.8], [6.3, 3.3]] # [がく片幅, がく片]
y = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] # 0はセトナ, 1はバーシクル
clf = svm.SVC()  # skleanで準備されているモデルを選択
clf.fit(X, y)  # 準備したデータでモデルの学習を行う

print(clf.predict([[5.9, 3]]))  # バーシクルのデータを入力してバーシクルと判定されるか検証

補足になりますが、機械学習を使用する際、「セトナ」や「バーシクル」といった文字で扱うのではなく、「セトナは0」「バーシクルは1」のように数値を割り振っておきます。

実行結果

では上記のプログラムを実行してみます。
新しいデータには、品種がバーシクル(数値は1)のデータを選択しました。

$ python svm.py
[1]

正しくバーシクルと分類されています。
本来はより多くのテストデータを使って分類能力の評価を行うべきですが、まずプログラムが正しく動作できることを確認しました。

おわりに

駆け足でしたが、サポートベクターマシンのプログラムを紹介しました。
他のデータセットなどを使って、みなさんも試してみてください!