LIBSVMをjavaで使ってみる

はじめに

SVM(サポートベクターマシーン)を使うことになった
大まかに仕組みはわかってる(線形に対して直角のベクトルを最大化???)が、
実装は面倒なのでライブラリを使うことに

ggったら
LIBSVM
www.csie.ntu.edu.tw
とやらがあったのでこれを使うことにした

プログラム言語の種類は割とある
必要なのはjavaなんで下の方のリンクからDL

とりあえずREADMEの中身

Quick Start

とりあえずSVMをやりたいならeasy.pyを使ってねって書いてある
Usageもある

Installation and Data Format

最初の方は、trainとかpredictは引数なしでやればusage見れるとかなんとか
トレーニングセットやテストセットは次のようにしないといけない

クラス分類の場合
<クラス番号> <インデックス>:<データ値> <インデックス>:<データ値>
...
回帰の場合
<任意の実数?> <インデックス>:<データ値> <インデックス>:<データ値>
...

サンプルはheart_scaleに書いてある
区切りは改行('¥n')と空白
<インデックス>:<データ値>は恐らく、特徴量の番号とその値だと思われる
なので<クラス番号>はその特徴量の値における正解クラスかな

trainを実行するとmodelができて、modelをテストセットとpredictすると精度が出るらしい
他にもスケーリングしてくれるツールもあると書いてある

各Usage

コマンドラインでの使い方一覧

Tips

スケールしてとか、うまくいかない場合はとか、みたいな感じ

Examples

やり方が書いてある

Precomputed Kernels

なんか事前に計算して、テストセットとかを分けなくて済む?
みたいなことが書いてある

それ以降の内容

ライブラリの内容とかその他もろもろ

サンプルを動かしてみる

Macなんでターミナルから以下のようにコマンド

%javac svm_train.java
%javac svm_predict.java

クラスファイル(?)ができあがるので続けて

%java svm_train heart_scale

とすると、推定結果(ターミナル上)とモデル(.modelファイル)が出て来る
最後に、モデルを使って精度を確認する

%java svm_predict heart_scale heart_scale.model output.txt

2つ目の引数は、本当はテスト用のデータセットだが面倒なので元のファイルのまま
精度がターミナル上に表示され、クラスの振り分け結果は新規作成されるoutput.txtに格納される

実際のデータでやるときには

値域を揃えるため、スケーリングが必要(toolにあるはず)
推測用とテスト用のデータセットを作る、きちんと分けた方が確かな精度がわかる、はず

そんな感じ