Page List

Search on the blog

2013年10月5日土曜日

LIBSVMを使ってみた

 LIBSVM[1, 2]を使ってみた。

ダウンロード方法は以下参照。
http://www.csie.ntu.edu.tw/~cjlin/libsvm/#download

Javaで使用する方法を説明します。ここでは、データセットirisを使います。
まずirisのデータセット(iris.scale)を以下のサイトからダウンロードします。

http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html#iris

ちなみに上のページにはいろいろなデータセット(LIBSVM用にフォーマット済)が用意されています。

ダウンロードしたiris.scaleを開くと行数が150行あるのが分かります。1行=1データなので、これを適当にtrain dataとtest dataに分けます。今回は120データをtrain dataに、30データをtest dataにします。このとき、ラベルが均等になるように注意してください。ラベルは各行の1番左の値です。
train data用のファイルをiris.train、test data用のファイルをiris.testとします。

まず以下のコマンドで学習を行います。
java -classpath libsvm.jar  svm_train iris.train

学習が完了すると画面にモデル情報が表示されます。また、カレントディレクトリにiris.train.modelというファイルが生成されます。

次にテストデータの識別を行います。
java -classpath libsvm.jar  svm_predict iris.test iris.train.model iris.predict.out

コマンド引数は左から、テストデータファイル、識別に使用するモデル、識別結果出力ファイルです。識別が完了すると画面に識別率が表示されます。またirisi.predict.outに各データの識別結果(ラベル)出力されます。

ちなみに今回の識別率は、96.67%でした。

LIBSVMはソースコードも公開されているので読んでみようかなと思います。マルチクラス識別のところの手法が何を使っているか(One-Against-Oneとか、One-Against-Allとか)とか、二次計画問題をどのように解いてるかとか気になります。

ちなみにリファクタリングされたバージョンもあるようです[3]。ソース読むならこっちの方がいいかもしれません。

参考
[1] http://www.csie.ntu.edu.tw/~cjlin/libsvm/
[2] http://www.youtube.com/watch?v=gePWtNAQcK8
[3] http://dev.davidsoergel.com/trac/jlibsvm/

0 件のコメント:

コメントを投稿