2015年2月8日日曜日

機械学習ライブラリ"LIBSVM"の話

LIBSVMの話をします。
自律ロボットにおいて障害物が何であるかを認識するために、予め学習したデータと比較して判断をしたい。そんな時があります。
そこで使うのが"機械学習"です。
そんな機械学習で一番メジャーなのがSVMだと勝手に思ってます。しかし、"機械学習"というと難解そうな気がしますよね。
そんな難しそうなSVMを簡単に使えるSVMのライブラリがLibSVMだと思います。 評価用のアプリケーションも付属ですし。適当なディレクトリにダウンロードしてmakeするだけ。簡単!

唐突ですが、ざっくりとメモ程度に使い方を説明していきたいと思います!
ちなみに動作環境はUbuntu13.04です。

LibSVM自体は本家よりダウンロードします。
http://www.csie.ntu.edu.tw/~cjlin/libsvm/

ダウンロードしたら適当なところで展開し、makeします。これだけで使えるようになるはずです。
それでは使い方です。

まず、学習用のファイルを作ります。ファイルの体裁は次のように作成します。
1 1:0.1 2:0.3 3:0.2
-1 1:0.4 2:0.8 3:0.9

一番左にはラベル、そのうしろにスペース区切りで番号順に特徴ベクトルの値を入れます。
このファイルを使って学習します。
学習ファイルを作ったらスケーリングします。スケーリングでは、各特徴ベクトルの値のMin,Maxで正規化しています。
その正規化に使われる最高値、最小値をメモったものがrangeファイルになります。
このrangeファイルは、実装するときにも使うので必ず必要となります。
通常のスケーリングではrangeファイルとスケーリングされたファイルは別々に作られますが、下記コマンドでrangeファイルの生成とスケーリングを一括でやってくれます。
./svm-scale -l -1 -u 1 -s sample.range sample.txt > sample_scaled.txt

オプションの"-s"は保存を意味します。"-s"のあとはrangeファイルの名前になります
スケーリングファイルが作成できたら、次は学習に必要なパラメータを推定します。 パラメータ推定には便利なPythonのアプリが用意されています。これを使いましょう。
これは交差検証によりパラメータを推定していきます。交差検証を簡単に説明すると、入力データを学習用、評価用に分けて学習、評価を繰り返してパラメータを推定していきます。
./tools/grid.py sample_scaled.txt

この時、スケーリングしていないファイルだとエラーになります。
また、grid.pyのソース内にある

nr_local_worker = 1

の数字を変更することで、数字の個数のCPUにより並列して計算してくれるようになります。

また、パラメータの走査範囲を変更したいときはオプションを使います。
./tools/grid.py -log2c 0,5,1 -log2g 5,0,-1 sample_scaled.txt

この時注意することは、log2cの方は"-(マイナス)"方向に入力しなければなりません。

パラメータが求められたらそれを使って学習していきます。
./svm-train -c 32.0 -g 8.0 sample_scaled.txt sample_model.model > sample_model_param.txt

学習時のパラメータ等は後々プログラムに導入するときとかに使うことがあるのでメモっておくのが良いと思います。てことでテキストファイルに書き出してます^^

これで基本的な学習は完了です。簡単ですね。
作成されたモデルの精度検証には"predict"を使います。デフォルトだと少し使いづらいので、あとで書き直します^^
とりあえずはデフォルトで説明していきます。と言っても実行するだけなのですが...w

まず、予測に必要なのは評価用のテスタデータです。学習用のファイルとは別に同様の体裁でテストデータを作ります。
それに対して学習モデルのスケーリングパラメータ(正規化に用いる最小値、最高値)を使ってスケーリングします。

./svm-scale -l -1 -u 1 -r sample.range test.txt > test_scaled.txt

オプションの"-r"は読み込みです。
ここで、スケーリングパラメータを読み込む意味は、学習と同様のスケーリングをしてあげないと学習の意味が全くなくなるからです。
そして、スケーリングされたテストデータに対し予測をします。
./svm-predict test_scaled.txt sample_model.model > test_predict.txt

これで、作成したモデルがどのくらい有効なのかを判断します。

基本的な使い方は以上です!こんなに簡単に使えると、小難しいイメージの機械学習も取っ付きやすいですね^^


次に、実装について話したいと思います。単純に入力データを判別するだけなら、上記のやり方だけでOKです。
しかしながら、自律ロボットに実装して使いたいので、それ用のソースコードが必要になります。
でも簡単なもので動いちゃうのがLibSVMのいいところです。
では、説明していきます!


以下、執筆中...。
もうしばらくお待ちください。