2

Javaプログラム内からWEKA分類子を実装しようとしています。これまでのところ、すべてがうまく機能していますが、Weka GUIのトレーニングセットから分類器を構築する場合、分類の精度を向上させるためにStringToWordVectorIDF変換を使用しました。

新しいインスタンスのJava内から、インスタンスを分類子に渡す前に、新しいインスタンスの各トークン値に設定するIDF変換を計算するにはどうすればよいですか?

基本的なコードは次のようになります。

Instances ins = vectorize(msg);
Instances unlabeled = new Instances(train,1);
Instance inst = new Instance(unlabeled.numAttributes());

String tmp = "";

for(int i=0; i < ins.numAttributes(); i++) {
    tmp = ins.attribute(i).name();
    if(unlabeled.attribute(tmp)!=null)
      inst.setValue(unlabeled.attribute(tmp), 1.0); //TODO: Need to figure out the IDF transformed value to put here NOT 1!!
}

unlabeled.add(inst);

unlabeled.setClassIndex(classIdx);

.....cl.distributionForInstance(unlabeled.instance(i));

では、分類したい新しいインスタンスに正しい値を入れるように、これをコーディングするにはどうすればよいですか?

明確にするために、行をIDF変換番号にinst.setValue(unlabeled.attribute(tmp), 1.0);変更する必要があります...1.0

4

1 に答える 1

1

この目的のためにFilteredClassifierを使用する必要があります。コードスニペットは次のとおりです。


    StringToWordVector  strWVector = new StringToWordVector();   
    filteredClassifier fcls = new FilteredClassifier();
    fcls.setFilter(strWVector);
    fcls.setClassifier(new SMO());
    fcls.buildClassifier(yourdata)
     //rest of your code 


インスタンスを一度に渡すことができるため、これははるかに簡単です。FilteredClassifierが他のすべての詳細を処理します。コードはテストされていませんが、開始できます。

編集:あなたも次の方法で行うことができます。これはwekaチュートリアルのコードスニペットです。詳細については、http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Filter-Filtering%20on-the-flyバッチモードを参照してください。


Instances train = ...   // from somewhere
 Instances test = ...    // from somewhere
 Standardize filter = new Standardize();
 filter.setInputFormat(train);  // initializing the filter once with training set
 Instances newTrain = Filter.useFilter(train, filter);  // configures the Filter based on train instances and returns filtered instances
 Instances newTest = Filter.useFilter(test, filter);    // create new test se

HTH

于 2011-09-01T15:59:53.907 に答える