コマンドラインでのWekaの利用法(その1)
Wekaは,ExplorerやKnowledge FlowなどのGUIを通しての利用だけではなく,通常のJavaクラスと同様にAPIやコマンドラインからも利用可能です.
Perlなどのスクリプト言語から,複数の訓練データやテストデータを指定して同じアルゴリズムを実行するのに便利です.
このような使い方は,Webをインタフェースとして,バックエンドでWekaを利用する際によく用いられるのではないでしょうか.
今回は,分類学習アルゴリズムとしてよく用いられる決定木を実行することを念頭に説明します.
準備
以下,用いる記号の意味を列挙しておきます.
- $…コマンドラインの始まり
…weka.jarまでのパス …訓練データとするArff形式のファイル(クラス属性は一番最後の属性) …テストデータとするArff形式のファイル(クラス属性は一番最後の属性) …シリアライズされた分類学習モデル …分類予測付のArff形式ファイル
まず,準備として,コマンドライン(シェル)からJVMであるjavaが起動することを確認してください.
Weka3.6以上では,SunのJava1.5以上が必要です.以下のように確認してみてください.
$ java -version
コマンドラインでの決定木(J4.8)の実行
Wekaの分類器クラス(weka.classifiers.*)では,共通して訓練データの指定に-t,テストデータに-Tというオプションを利用します.
他に,クロスバリデーション(交差検証)を指定する-x,逆にクロスバリデーションを抑制する-no-cvなどが共通です.
実行する際のコマンドは,以下のようになります.*1
$ java -cp <weka.jar> weka.classifiers.trees.J48\ -t <training.arff> $ java -cp <weka.jar> weka.classifiers.trees.J48\ -t <training.arff> -T <test.arff>
しかし,これを指定しただけだと,どのインスタンスがどのクラスとして分類予測されたかを得ることができません.
そこで,一旦訓練データ(全体)に対して生成された分類学習モデルをシリアライズしたファイルとして保存し,このモデルを用いて分類予測を行います.
シリアライズされた分類学習モデルを出力するためには,-dというオプションを用います.
$ java -cp <weka.jar> weka.classifiers.trees.J48\ -t <training.arff> -d <output_model>
ここで生成された分類学習モデルを用いて,各インスタンスの分類予測結果を得るためには,以下のコマンドを実行します.-pは,分類予測に用いる属性の範囲を示しています.
このとき,訓練データとテストデータでは,属性集合を同一として,各名義属性の値については,和集合をとっておいたほうがトラブルが少なくなります.
$ java -cp <weka.jar> weka.classifiers.trees.J48\ -T <test.arff> -l <output_model> -p first-last
これにより,Tab区切りの出力を得ることができます.
あとは,この出力を加工することで,スクリプトが目的とする分類予測を利用することになります.
Arff形式ファイルへの予測結果の付与
ここでは,任意のArff形式ファイルに予測結果を付与したArff形式ファイルをフィルタによって生成する方法を紹介します.
分類予測の付与に用いるフィルタはweka.filters.supervised.attribute.AddClassificationというフィルタです.
このフィルタでは,-iで分類予測対象となるArff形式ファイル,-cでクラス属性の番号(本例ではlast),-Wによる分類学習アルゴリズムのクラス名が必須オプションです.
各学習アルゴリズムに対するオプションは-W以下のダブルクォート(”)内,入力ファイルは-iとして1ファイルだけ指定可能という点に注意が必要です.
訓練データに分類予測結果を付与したArff形式ファイル
$ java -cp <weka.jar> weka.filters.supervised.attribute.AddClassification\ -W "weka.classifiers.trees.J48"\ -i <training.arff> -c last -o <predicted.arff>
訓練データとは別のテストデータに分類予測結果を付与したい場合は,以下の2つのコマンドを実行する必要があります.
$ java -cp <weka.jar> weka.classifiers.trees.J48\ -t <training.arff> -d <output_model> $ java -cp <weka.jar> weka.filters.supervised.attribute.AddClassification \ -serialized <output_model>\ -i <test.arff> -c last -o <predicted.arff>
*1:決定木の実行オプションは省略してあります.