web-dev-qa-db-ja.com

コマンドラインでWekaを学ぶ

私はWekaにかなり慣れておらず、コマンドラインでWekaにさらに慣れていません。ドキュメントが貧弱で、やるべきことがいくつかあるのを理解するのに苦労しています。たとえば、2つの.arffファイルを取得します。1つはトレーニング用、もう1つはテスト用で、テストデータに欠落しているラベルの予測の出力を取得します。

これどうやってするの?

私はこのコードをスターティングブロックとして持っています

Java -classpath weka.jar weka.classifiers.meta.FilteredClassifier
-t "training_file_with_missing_values.arff"
-T "test_file_with_missing_values.arff"
-F weka.filters.unsupervised.attribute.ReplaceMissingValues -- -c last
-W weka.classifiers.functions.MultilayerPerceptron -- -L 0.3 -M 0.2 -H a

そのコードを実行すると、「Illegal option -c last」が表示されますが、その理由はわかりません。また、テキストデータから数千の特徴がある場合、NNは遅すぎる傾向があるため、MLPを使用するつもりはありません。私はそれを別の分類子に変更する方法を知っています(NBまたはlibSVMのように)。

ただし、StringToWordVectorフィルター(および、クラスを最初の属性ではなく最後にするためのReorderフィルター)も追加する必要があるため、1回の呼び出しで複数のフィルターを追加する方法がわかりません。

次に、各クラスの予測ラベルを実際に出力するにはどうすればよいですか?そして、それらを初期データと一緒にarffに保存します。

16
Reily Bourne

Wekaは実際にはドキュメントの輝かしい例ではありませんが、それでも彼らのサイトでそれに関する貴重な情報を見つけることができます。 Primer から始める必要があります。テキストファイルを分類したいので、 WEKAによるテキスト分類 もご覧ください。新しい Wekaドキュメントサイト もあります。

[Edit:Wikispacesはシャットダウンし、Wekaはまだ他の場所にサイトを表示していないので、リンクを変更して、 Googleキャッシュ。誰かがこれを読んで、新しいWeka Wikiが起動した場合は、リンクを編集してこのメ​​モを削除してください。]

質問に投稿したコマンドラインにエラーが含まれています。あなたは私の答えから別の質問にそれをコピーしたことを知っていますが、私もそれに気づきました。 ReplaceMissingValueフィルターが気に入らないため、-- -c lastを省略する必要があります。

入門書には次のように書かれています。

weka.filters.supervised

クラス階層でweka.filters.supervisedの下にあるクラスは、supervisedフィルタリング用です。つまり、クラス情報を利用します。クラスは-cを介して割り当てる必要があります。WEKAのデフォルトの動作では、-c lastを使用します。

ただし、ReplaceMissingValueは、StringToWordVectorと同様に、教師なしフィルターです。

複数のフィルター

複数のフィルターを追加することも問題ありません。それがMultiFilterの目的です。ただし、コマンドラインは少し面倒になる可能性があります(NNよりもはるかに高速であるため、ここではRandomForestを選択しました)。

Java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
  -t ~/weka-3-7-9/data/ReutersCorn-train.arff \
  -T ~/weka-3-7-9/data/ReutersCorn-test.arff \
 -F "weka.filters.MultiFilter \
     -F weka.filters.unsupervised.attribute.StringToWordVector \
     -F weka.filters.unsupervised.attribute.Standardize" \
 -W weka.classifiers.trees.RandomForest -- -I 100 \

予測をする

入門書が予測を取得することについて言っていることは次のとおりです。

ただし、分類子の予測に関するより詳細な情報が必要な場合、-p#は、1ベースの属性IDの範囲(なしの場合は0)とともに、各テストインスタンスの予測のみを出力します。

-p 0のような一般的なオプションを、呼び出すクラスの直後に配置することをお勧めします。そのため、コマンドラインは次のようになります。

Java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
  -t ~/weka-3-7-9/data/ReutersCorn-train.arff \
  -T ~/weka-3-7-9/data/ReutersCorn-test.arff \
  -p 0 \
 -F "weka.filters.MultiFilter \
     -F weka.filters.unsupervised.attribute.StringToWordVector \
     -F weka.filters.unsupervised.attribute.Standardize" \
 -W weka.classifiers.trees.RandomForest -- -I 100 \

WEKA分類器/フィルターの構造

しかし、ご覧のとおり、WEKAをコマンドラインから呼び出すと非常に複雑になる可能性があります。これは、WEKA分類器とフィルターのツリー構造によるものです。コマンドラインごとに実行できる分類子/フィルターは1つだけですが、必要に応じて複雑に構成できます。上記のコマンドの場合、構造は次のようになります。

FilteredClassifierは、トレーニングデータセットのフィルターを初期化し、トレーニングデータとテストデータの両方をフィルター処理してから、トレーニングデータでモデルをトレーニングし、指定されたテストデータを分類します。

FilteredClassifier
 |
 + Filter
 |
 + Classifier

複数のフィルターが必要な場合は、1つのフィルターのみであるMultiFilterを使用しますが、指定された順序で他の複数のフィルターを呼び出します。

FilteredClassifier
 |
 + MultiFilter
 |  |
 |  + StringToWordVector
 |  |
 |  + Standardize
 |
 + RandomForest

コマンドラインからこのようなものを実行することの難しい部分は、オプション名が同じであることが多いため、必要なオプションを適切なクラスに割り当てることです。たとえば、-FオプションはFilteredClassifierMultiFilterにも使用されるため、引用符を使用して、どの-Fがどのフィルターに属するかを明確にする必要がありました。

最後の行では、RandomForestに属するオプション-I 100を直接追加できないことがわかります。これは、オプションFilteredClassifierに割り当てられるためです。 Illegal options: -I 100を取得します。したがって、その前に--を追加する必要があります。

データファイルへの予測の追加

予測されたクラスラベルの追加 も可能ですが、さらに複雑です。これを1つのステップで実行することはできませんが、最初にモデルをトレーニングして保存してから、これを使用して新しいクラスラベルを予測して割り当てる必要があります。

モデルのトレーニングと保存:

Java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
  -t ~/weka-3-7-9/data/ReutersCorn-train.arff \
  -d rf.model \
  -F "weka.filters.MultiFilter \
      -F weka.filters.unsupervised.attribute.StringToWordVector \
      -F weka.filters.unsupervised.attribute.Standardize" \
  -W weka.classifiers.trees.RandomForest -- -I 100 \

これにより、トレーニングされたFilteredClassifierのモデルがファイルrf.modelにシリアル化されます。ここで重要なことは、初期化されたフィルターもシリアル化されることです。そうしないと、フィルター処理後にテストセットに互換性がなくなります。

モデルをロードし、予測を行い、保存します。

Java -classpath weka.jar weka.filters.supervised.attribute.AddClassification \
  -serialized rf.model \
  -classification \
  -remove-old-class \
  -i ~/weka-3-7-9/data/ReutersCorn-test.arff \
  -o pred.arff \
  -c last
41
Sentry