なんだか雲行きの怪しい雑記帖

ぐだぐだ日記とメモと,あと不定期更新

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

今更LIBSVMについてちょっと

割りとよく使ってるが知らんかったことを中心


その前にLIBSVMってなんだ

公式ページ:LIBSVM -- A Library for Support Vector Machines
サポートベクトルマシン(SupportVectorMachine)を学習(したり評価したり)するためのライブラリ。

サポートベクトルマシンの説明は省きますが、LIBSVMを使えば

  • カーネルトリックを用いた非線形SVMの学習(自分で設計したカーネルも使用可能)

  • マルチクラス分類のSVMの学習(one vs oneとか※)

  • グリッドサーチなど学習するための便利(必須)なツールが標準装備(Pythonが必要)

  • 拡張やツールなどもそこそこ豊潤(LIBSVM Tools



※昔はone versus restによる実装だったそうですが,実験の結果精度がいいone versus oneのマルチクラス識別器になったそうです.
ソースはQ: What method does libsvm use for multi-class SVM ? Why don't you use the "1-against-the rest" method? で.
ちなみに,マルチクラスの場合でも「-b 1」により各カテゴリの事後確率も計算できますが,その手法については製作者らの論文「Probability Estimates for Multi-class Classification by Pairwise Coupling」を参照願います.


基本的な使い方(おさらい編)

Linux系使ってる人は玄人だと思うので,多分私がお役に立てる部分はないと思います.
なので,Windowsユーザを対象.

・何はともあれまずはビルド
ビルドしないとそもそもツールとして使えません.
コンパイラは色々あると思いますが,まぁ多分VisualStudio(VisualC++)だと思いますので,まずはVSのコマンドプロンプトを開きましょう.
 (分からない人は「スタートメニュー」→「Microsoft Visual Studio ○○」→「Visual Studio Tools」のフォルダ内あたりから探そう)

LIBSVMを解凍したディレクトリに移動します.

cd /d libsvm-3.17


そしたら,ビルドを実行.
MSVSだとmakeはnmakeコマンドなので,
  nmake -f Makefile.win

と打つだけ.

そうすると,「windows」ディレクトリ内にEXEやLIBファイルが生成されたと思います.


・テスト学習してみる
ツールを準備出来たわけですが,インストールしたてだとホントに何をしていいのか分からないものです.

データセットの用意はどうすればいいの?
ってかデータセットのファイルのフォーマット何よ?
ツールのコマンドは?
どうやってパラメータ調整すればいいの?

諸々疑問に思うことはあると思いますが,データセットに関してはLIBSVMはテスト用のものを用意してくれています.
LIBSVMフォルダの「heart_scale」がソレにあたります.

とりあえず学習させてみるには

.\windows\svm-train heart_scale

と打ってみましょう.

*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132

とでたら学習成功.
学習により「heart_scale.model」というモデルファイルが生成されていたりします.

「svm-train」の細かいパラメータとかは本家サイト少しスクロールしたところでも見て下さい.

データセットのフォーマットは「heart_scale」を見れば分かるね!
SVMの基本的な使い方的なところは「SlideShare -SVM実践ガイド (A Practical Guide to Support Vector Classification)-」などをとりあえずは見てみればいいんじゃないかな!!
理論等はご自身で検索した方がいい資料でると思いますので割愛



本題:気付いた細かいこと

・Windowsで「grid」または「easy」を使いたい時
SVMはパラメータ調整が精度向上には必須!
「grid」はグリッドサーチ、「easy」はスケーリングとグリッドサーチもやってくれる便利ツール

必要なモノ:Python、gnuplot
 Pythonver2.7がいいと思います
 gnuplotはWindows用のバイナリとして「wgnuplot」があるので、それをインストール

「tools/grid.py」と「tools/easy.py」をpythonに食わせればいいのですが、「grid」と「easy」は「svm-train」,「svm-predict」及び「svm-scale」のバイナリを必要とするので、事前にビルドしましょう
  (MSVCでビルドするなら上述、「nmake -f Makefile.win」でしたね)

 さて、ビルドしたら次は「grid」と「easy」にそのEXEのパスを教える必要があります
 READMEの方には引数で渡す方法が書いてありますが、面倒なのでソースに直書きするのがいいかなと思います。

 「tools/grid.py」と「tools/easy.py」、いずれにおいても
is_win32 = (sys.platform == 'win32')
if not is_win32:
svmscale_exe = "../svm-scale"
svmtrain_exe = "../svm-train"
svmpredict_exe = "../svm-predict"
grid_py = "./grid.py"
gnuplot_exe = "/usr/bin/gnuplot"
else:
# example for windows
svmscale_exe = r"..\windows\svm-scale.exe"
svmtrain_exe = r"..\windows\svm-train.exe"
svmpredict_exe = r"..\windows\svm-predict.exe"
gnuplot_exe = r"c:\tmp\gnuplot\binary\pgnuplot.exe"
grid_py = r".\grid.py"

 のような記述があるので、探しだして書き換えるだけ。
 絶対パスに書きなおすと色々楽になりますね.


・「grid」または「easy」をマルチコアで学習したい時
READMEに書いてあるのだが、ちょっと気付きにくいと思う

Windowsでは「tools/grid.py」、Linux系では「/usr/bin/svm-grid」内の
  ...
telnet_workers = []
ssh_workers = []
nr_local_worker = 1// ←HERE!
...

となっているところを好きな数値に書き換えるだけ.

ただしこの手法による学習は,一回の学習をマルチコア化するのではなく,パラメータ探索のためそれぞれのパラメータによる学習を別プロセスで並列に行う手法です
なので,瞬間的に必要となるメモリ量は並列化したい数に比例します

因みに書いてあるコードから推察出来る通り、SSHやTELNETでリモートのCPU使って計算とかも出来ます。
その辺はREADMEの方をどうぞ。(ぇ


・線形カーネル使うならLIBLINEAR
利点
 ・学習データは互換性アリ(というより同じ)
 ・学習速度が早い
   たとえLIBSVMで線形カーネルを指定したとしても,LIBLINEARより速度面で劣ります
 ・モデルファイルが小さい
   サポートベクトルの集合ではなく、射影ベクトルとバイアス値がモデルファイルとして出力されるため、
   特徴量ベクトルとほぼ同次元のベクトルが保存できるスペースだけ必要
   LIBSVMで学習した時より非常に小さくなります
欠点
 ・なぜかこっちはマルチクラス分類器には「one-versus-rest」な実装
   LIBSVM TOOLSにone-versus-oneによる実装が公開されているので,そっちが良い人はそっちを
 ・サポート…ベク…ター…?
   正確にどれがサポートベクトルになっているか把握するのは,ソースコードを改変する必要アリ
 ・バイアス使用がデフォルトでfalseなので(-b 0),うっかり何か違う学習ファイルが出来ることがある(経験談)


おまけ

C++からLibSVMのAPI呼んで学習したい時は,別記事で書いてしまったので,週アレ(11) C++で始めるLibSVMの方を参考
スポンサーサイト

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。