サポートベクターマシン入門[PythonでLibSVM,機械学習]
今回はSVMのお話。
ブログ移行なので記事内容は古い(2012年11月11日)です。
SVM(Support Vector Machine)
教師ありとは 事前に答えが分かっているデータ(教師)のことで、教師あり学習とは教師データ(事前知識)を使ってマシンに学習を行うことです。図1で簡単にSVMの仕組みを示します。
図1:SVMの仕組み
SVMの手順
1.まず教師データとして学習データを用意します。
データには『正しい(-1)か間違い(-1)か』というパラメータと対象のデータが必要です。パラメータリストはデータリストが+1か-1かということをデータリストN個分 入力します。
例: [パラメータリスト] , [[データリスト1],[データリスト2],・・・,[データリストN]]
2.この学習データをマシン(SVM)に送くってマシンが学習します。
マシンは受け取った学習データを解析して、モデルを作成します。
3.実験データ(正しいかどうか判別したいデータ)をマシンに送って、結果を受け取ります。
マシンがモデルを構築したら実験データを送って、モデルと比較して正しいか、間違っているかの判定結果を返ってきます。
SVMをPythonで実装してみる。
ここからプログラムの話をします。今回のSVMライブラリはLibSVMを用います。
LibSVMのインストール方法は本家で確認してください。簡単に導入できます。 (Python,Java,Perlなど色々な言語に対応しています)
#coding:utf-8
import sys
sys.path.append('LibSVMをダウンロードしたディレクトリ/libsvm-3.12/python/')
from svm import *
from svmutil import *
data1 = [[1,-2,3],[1,-4,5,1234],[342,342,435345,43534,4352,-4]] #データ
label1 = [-1,-1,-1] #データの正負(±1のラベル)
prob = svm_problem(label1 , data1) # データとラベルを合成
param = svm_parameter('-s 0 -t 0') # 学習方法の設定
m = svm_train(prob, param) #学習
result = svm_predict([-1,-1],[[34,453.5],[45356,-10]] , m) #未知データの適用
#モデルをファイルに書き出す モデルを後で確認したい場合
svm_save_model('test.model', m)
print result[0],result[1],result[2]
プログラム説明
import sys
sys.path.append('LibSVMをダウンロードしたディレクトリ/libsvm-3.12/python/')
まず、プログラムをどこのディレクトリ下でも動くように、libsvmのライブラリのパスを繋いでおきます。LibSVMのディレクトリ下とか、STARTUPPYTHONとかでパスを繋いでおけば不要です。
from svm import *
from svmutil import *
つぎに、SVMの関数が呼べるように、importします。
data1 = [[1,-2,3],[1,-4,5,1234],[342,342,435345,43534,4352,-4]] #データ
label1 = [-1,-1,-1] #データの正負(±1のラベル)
次にデータとラベルを作成します。データはfloat型のリストをデータ数用意してリストにします。そのデータ数に対応したラベル(正しい:+1、間違い:-1)を作ります。
※データはFloat型です。Stringとかでは実行できません。
つまり、テキストデータの学習をする場合は、形態素解析して、形態素ごとに番号(code)を振って、codeの数値で学習させます。
prob = svm_problem(label1 , data1) # データとラベルを合成
param = svm_parameter('-s 0 -t 0') # 学習方法の設定
そしたら、SVMの関数(svm_problem)でデータとラベルを組み合わせます。それに加えて、SVM関数(svm_parameter)で学習方法を決めます。このパラメータも本家に書いてありますので、参照してください。
これで学習のための準備はOKです。
m = svm_train(prob, param) #学習
ではマシンに学習させましょう。SVMの関数(svm_train)で学習が実行されます。
result = svm_predict([-1,-1],[[34,453.5],[45356,-10]] , m) #未知データの適用
学習ができたら学習精度を検証しましょう。SVMの関数(svm_predict)を使います。引数の意味は以下のような感じになります。
svm_predict(期待する結果のラベル, 実験データ, モデルデータ)
これは、実験データをモデルデータと比較し、得られた結果のラベルと期待する結果のラベルを比較して、どのくらい正しいかを出力します。
※補足 モデルデータの保存
#モデルをファイルに書き出す モデルを後で確認したい場合
svm_save_model('test.model', m)
SVM関数(svm_save_model)でモデルをファイルに保存することができます。どういうモデルになったかを確認したいときは上記のように、ファイルに掃き出しておくことをお勧めします。
print result[0],result[1],result[2]
結果はリストで返ってきますので、出力します。
Accuracy = 50% (1/2) (classification)
この場合、学習が期待する結果を十分に出せていないということになりますので、SVM学習のパラメータを変えたり、学習データを増やす必要があるということになります。
説明は以上です。参考になれば幸いです。
Support Vector Machineに関する書籍紹介

- 作者: ネロクリスティアニーニ,ジョンショー‐テイラー,Nello Cristianini,John Shawe‐Taylor,大北剛
- 出版社/メーカー: 共立出版
- 発売日: 2005/03
- メディア: 単行本
- 購入: 8人 クリック: 135回
- この商品を含むブログ (41件) を見る
Amazonのレビューにある通り、日本語に難ありです。初歩の理解を深めたい場合は、上の本より他のサイトやSlideShareなどを参考にされることをお勧めします。ただ、上達していくためには必要になるかもしれません。(ちなみに英語版もあります)
個人的にはビジョップ本がお勧めです。

- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/04/05
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 33回
- この商品を含むブログ (10件) を見る

- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/02/29
- メディア: 単行本
- 購入: 6人 クリック: 14回
- この商品を含むブログを見る

パターン認識と機械学習の学習―ベイズ理論に挫折しないための数学
- 作者: 光成滋生,竹迫良範
- 出版社/メーカー: 暗黒通信団
- 発売日: 2012/07
- メディア: 単行本
- 購入: 8人 クリック: 228回
- この商品を含むブログ (5件) を見る
ただし、非常に高いので、まずは図書館等で読んで見てください。もう一つ、プログラミングで実際に動かして理解を深めたい方はオライリー本がお勧めです。

- 作者: Drew Conway,John Myles White,萩原正人,奥野陽,水野貴明,木下哲也
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/12/22
- メディア: 大型本
- 購入: 2人 クリック: 41回
- この商品を含むブログ (10件) を見る