読者です 読者をやめる 読者になる 読者になる

TakayukiKoyama Geek Blog

Create, Entertain, Experience

サポートベクターマシン入門[PythonでLibSVM,機械学習]

今回はSVMのお話。

ブログ移行なので記事内容は古い(2012年11月11日)です。

PythonLibSVMを動かしてみるお話です。

SVMSupport Vector Machine

 SVMとは「教師ありの機械学習手法」のことです。

 教師ありとは 事前に答えが分かっているデータ(教師)のことで、教師あり学習とは教師データ(事前知識)を使ってマシンに学習を行うことです。図1で簡単にSVMの仕組みを示します。

図1:SVMの仕組み

f:id:tkoyama1988:20131209123829j:plain

SVMの手順

1.まず教師データとして学習データを用意します。

 データには『正しい(-1)か間違い(-1)か』というパラメータと対象のデータが必要です。パラメータリストはデータリストが+1か-1かということをデータリストN個分 入力します。

 例: [パラメータリスト] , [[データリスト1],[データリスト2],・・・,[データリストN]]

2.この学習データをマシン(SVM)に送くってマシンが学習します。

 マシンは受け取った学習データを解析して、モデルを作成します。

3.実験データ(正しいかどうか判別したいデータ)をマシンに送って、結果を受け取ります。

 マシンがモデルを構築したら実験データを送って、モデルと比較して正しいか、間違っているかの判定結果を返ってきます。

SVMPythonで実装してみる。

 ここからプログラムの話をします。今回の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に関する書籍紹介

サポートベクターマシン入門

サポートベクターマシン入門

 Amazonのレビューにある通り、日本語に難ありです。初歩の理解を深めたい場合は、上の本より他のサイトやSlideShareなどを参考にされることをお勧めします。ただ、上達していくためには必要になるかもしれません。(ちなみに英語版もあります)

個人的にはビジョップ本がお勧めです。

パターン認識と機械学習 上

パターン認識と機械学習 上

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

パターン認識と機械学習の学習―ベイズ理論に挫折しないための数学

パターン認識と機械学習の学習―ベイズ理論に挫折しないための数学

 ただし、非常に高いので、まずは図書館等で読んで見てください。もう一つ、プログラミングで実際に動かして理解を深めたい方はオライリー本がお勧めです。

入門 機械学習

入門 機械学習

広告を非表示にする