実装関連事項

各種プログラミング言語の基本的な書き方やソフトウェア等の使用方法について.

Linuxマシンへのインストール

LIBSVMは国立台湾大学のグループによって作られたサポートベクターマシンのライブラリ.最初に,$HOEM/build のようなディレクトリを作り,そこに移動し,以下のコマンドでソースコードをダウンロードする.

$ wget http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+tar.gz -O libsvm.tgz

これを解凍する.

$ tar zxvf libsvm.tgz

生成されたディレクトリに移動する.コンフィグファイルはついていないので,以下のコマンド一発でビルドする.生成されたバイナリファイルを PATH が通ったディレクトリに移動させてインストールは終了.

$ make

パッケージ内容

LIBSVMのメインのプログラムは以下の3つ.以下の3つでデータのスケーリング,予測器およびモデルの構築,テストデータの分類および評価を行うことができる.

プログラム詳細
svm-scaleトレーニングおよびテストデータセットをスケーリングする.
svm-trainレーニングデータセットから予測器を作成する.
svm-predict作成した予測器にテストデータセットを供することで,読み込みデータを予測分類する.

その他にも有用なツールが揃っている.特に,grid.py を用いたパラメーターの最適化は予測器の作成のために非常に役立つ.

プログラム詳細
svm-toySVM がどのようにデータを分類するのかをグラフィックで観れるツール.必要性が感じられない.
chechdata.pyデータフォーマットが LIBSVM に対応しているかどうかをチェックする.
easy.pyトレーニングデータセット (およびテストデータセット) を読み込むことで,スケーリングにはじまり予測器の作成 (およびテスト) まで機械学習の全ての工程を自動的に実行する.
fselect.pyF-score によるフィーチャーセレクションを行う.
grid.pyラジアル基底関数カーネルを用いた場合のパラメーターの最適化を簡単に行う.
subset.pyデータセットからランダムにサブセットを抜き出す.

LIBSVMによる機械学習の手順

LIBSVMを用いたサポートベクターマシン解析は非常に簡単に行うことができる.最も簡単には以下の数ステップで完了する.また,付属のツール 'easy.py' は以下の工程を1行のコマンドですべて実行できる.

1. データを LIBSVM の読み込み形式に合せて整形

LIBSVMのデータフォーマットに合せて生データを整形する.公式ページから csv ファイルを LIBSVM 用に変換するツールをダウンロードすることができるが,完成度が低いので実際には自身で適当なスクリプトを書く必要がある.データフォーマットが合っているかどうかは checkdata.py で確認できる.

2. 整形済みデータのスケーリング

データを指定した範囲でスケーリングする.ここでは svm-scale を用いる.トレーニングデータセットのスケーリングを行い,それによって出力されるスケーリングパラメーターファイルを用いて,テストデータセットのスケーリングも行う.スケーリングパラメーターファイルには各特徴ベクトルの最大値と最小値が記録されている.トレーニングデータセットおよびテストデータセットのスケーリングは必ずこのパラメータファイルを用いて,同じ基準で行う.

3. スケール済みトレーニングデータを用いたグリッドサーチによる機械学習のパラメーターの最適化

用いるSVMのタイプ,カーネルのタイプおよび用いるデータセットに応じて,機械学習の最適パラメーターを用いて予測器を作成する必要がある.そこで,トレーニングデータセットを用い,各パラメーターを網羅的に少しずつ変化させ,そのときの性能を測定することを繰り返し,最終的に経験的に機械学習の精度を最大化させるパラメーターの組み合わせを求める.

LIVSVMには grid.py というグリッドサーチを自動で行うツールが付属している.この grid.py では SVM タイプが C-SVC かつカーネルが RBF カーネル (ラジアル基底関数カーネル,ガウシアンカーネル) の場合において最適化すべきパラメーター (Cost および Gamma) のみ最適化できる.最適化に際してはクロスバリデーションが用いられる.

4. 最適化パラメーターを用いた予測器の作成

予測器の作成は svm-train を用いて行う.svm-train には上で最適化したパラメーターとスケール済みのトレーニングデータセットを読み込ませる.用いるカーネルの指定等もここで行う.

スケール済みテストデータの予測器によるテスト

上で作成した予測器を用いて'svm-predict によるテストデータセットの予測分類を行う.テストデータセットはトレーニングデータセットと同様にスケーリングされている必要がある.

データフォーマット

LIBSVM で使用するデータフォーマットは,データがN個のフィーチャーとラベルからなる場合,以下の形式.エントリーの特徴量 (フィーチャーベクトル) およびそのラベル (レスポンスベクトル) は各エントリーを1行に表記する.index,value および label を含むすべてのデータは数値である必要がある.index は1から始まる連番の整数.

<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
.
.
.
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>

Rのデータセット iris は以下のようなデータである.以下のデータを LIBSVM のデータ形式に変換する.

setosa 5.1 3.5 1.4 0.2
setosa 4.9 3.0 1.4 0.2
setosa 4.7 3.2 1.3 0.2
.
.
.
virginica 5.9 3.0 5.1 1.8

これを LIBSVM の入力形式に合わせると以下のようになる.このとき,setosa は0,virginica は1で表す.

0 1:5.1 2:3.5 3:1.4 4:0.2
0 1:4.9 2:3.0 3:1.4 4:0.2
0 1:4.7 2:3.2 3:1.3 4:0.2
.
.
.
1 1:5.9 2:3.0 3:5.1 4:1.8

以下のように value の値が0であった場合,その場合の index および value の表記は省略する.

setosa 5.1 0 0 0.2

上と同様にラベル setosa を 0 に置換した場合の変換後の表記は以下のようになる.表記を省略しているだけなので,index の値は1からはじまる連番である必要がある.すなわち,0のときも index の値は加算する.

0 1:5.1 4:0.2

データファイルの最後の行には改行を入れる必要がある.改行がないとエラーが出る.データフォーマットが正しいかどうかは LIBSVM 付属の checkdata.py によって確認できる.

$ checkdata.py iris.txt

最適化パラメーターについて

LIBSVM では予測器またはモデルの構築において,いくつかの SVM タイプおよびカーネルタイプを選択することができるが,用いる SVM タイプおよびカーネルタイプによって最適化すべきパラメーターが異なる.用いる SVM のタイプの違いによって最適化すべきパラメーターは以下の表のようになる.各パラメーターは svm-train において,cost は -c オプション,nu は -n オプションにて指定する.

costnu
C-SVCO
nu-SVCO
one-class SVMO
epsilon-SVRO
nu-SVROO

用いるカーネルのタイプの違いによって最適化すべきパラメーターは以下のように異なる.各パラメーターは svm-train において,degree は -d オプション,gamma は -g オプション,coef0 は -r オプションにて指定する.

degreegammacoef0
liner
polynomialOOO
radial basisO
sigmoidOO

つまり,ラジアル基底関数で分類学習を行う場合は,cost と gamma のみを最適化すれば良い.

Hatena Google+