13

次のように手動で作成したトレーニング データを使用して IBK 分類子をトレーニングしました。

ArrayList<Attribute> atts = new ArrayList<Attribute>();
ArrayList<String> classVal = new ArrayList<String>();
classVal.add("C1");
classVal.add("C2");
atts.add(new Attribute("a"));
atts.add(new Attribute("b"));
atts.add(new Attribute("c"));
atts.add(new Attribute("d"));
atts.add(new Attribute("@@class@@", classVal));

Instances dataRaw = new Instances("TestInstances", atts, 0);
dataRaw.setClassIndex(dataRaw.numAttributes() - 1);
double[] instanceValue1 = new double[]{3,0,1,0,0};
dataRaw.add(new DenseInstance(1.0, instanceValue1));

double[] instanceValue2 = new double[]{2,1,1,0,0};
dataRaw.add(new DenseInstance(1.0, instanceValue2));

double[] instanceValue3 = new double[]{2,0,2,0,0};
dataRaw.add(new DenseInstance(1.0, instanceValue3));

double[] instanceValue4 = new double[]{1,3,0,0,1};
dataRaw.add(new DenseInstance(1.0, instanceValue4));

double[] instanceValue5 = new double[]{0,3,1,0,1};
dataRaw.add(new DenseInstance(1.0, instanceValue5));

double[] instanceValue6 = new double[]{0,2,1,1,1};
dataRaw.add(new DenseInstance(1.0, instanceValue6));

次に、分類子を作成します。

IBk ibk = new IBk();
try {
    ibk.buildClassifier(dataRaw);

} catch (Exception e) {
    e.printStackTrace();
}

ラベルのないクラスで新しいインスタンスを作成し、このインスタンスを分類したいのですが、次のことを試してみましたがうまくいきませんでした。

IBk ibk = new IBk();
try {
    ibk.buildClassifier(dataRaw);
    double[] values = new double[]{3,1,0,0,-1};
    DenseInstance newInst = new DenseInstance(1.0,values);
    double classif = ibk.classifyInstance(newInst);
    System.out.println(classif);
} catch (Exception e) {
    e.printStackTrace();
}

次のエラーが表示されます

weka.core.UnassignedDatasetException: DenseInstance doesn't have access to a dataset!
at weka.core.AbstractInstance.classAttribute(AbstractInstance.java:98)
at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:74)
at TextCategorizationTest.instancesWithDoubleValues(TextCategorizationTest.java:136)
at TextCategorizationTest.main(TextCategorizationTest.java:33)

新しいインスタンスの作成中に何か間違ったことをしているようです。ラベルのないインスタンスを正確に作成するにはどうすればよいですか?

前もって感謝します

4

3 に答える 3

15

データセットに関連付けられていない新しいインスタンスを分類すると、このエラーが表示されます。を使用して、作成するすべての新しいインスタンスをInstancesオブジェクトに関連付ける必要がありますsetDataset

//Make a place holder Instances
//If you already have access to one, you can skip this step
Instances dataset = new Instances("testdata", attr, 1);
dataset.setClassIndex(classIdx);

DenseInstance newInst = new DenseInstance(1.0,values);

//To associate your instance with Instances object, in this case dataset
newInst.setDataset(dataset); 

この後、新しく作成されたインスタンスを分類できます。

double classif = ibk.classifyInstance(newInst);

http://www.cs.tufts.edu/~ablumer/weka/doc/weka.core.Instance.html

詳細な実装リンク

于 2015-01-25T19:46:15.117 に答える
13

The problem is with this line:

double classif = ibk.classifyInstance(newInst);

When you try to classify newInst, Weka throws an exception because newInst has no Instances object (i.e., dataset) associated with it - thus it does not know anything about its class attribute.

You should first create a new Instances object similar to the dataRaw, add your unlabeled instance to it, set class index, and only then try classifying it, e.g.:

Instances dataUnlabeled = new Instances("TestInstances", atts, 0);
dataUnlabeled.add(newInst);
dataUnlabeled.setClassIndex(dataUnlabeled.numAttributes() - 1);        
double classif = ibk.classifyInstance(dataUnlabeled.firstInstance());
于 2012-08-29T19:11:42.673 に答える
-1

WEKA ドキュメントの 203 ~ 204 ページを参照してください。それは私を大いに助けました!(Weka マニュアルは、weka インストール フォルダーにある pdf ファイルです。docmentation.html を開くと、pdf マニュアルが表示されます。)

第 17 章 (WEKA API の使用 / メモリ内でのデータセットの作成) のコード リストの一部のスニペットをコピーして貼り付けると、タスクの解決に役立ちます。

于 2013-03-27T23:59:09.823 に答える