3

そのため、テスト インスタンスで分類器のパフォーマンスを評価しようとしています。ROC の下の領域を取得しようとすると、次のエラーがスローされます。

Java.lang.NullPointerException で weka.classifiers.evaluation.ThresholdCurve.getROCArea(ThresholdCurve.java:268) で weka.classifiers.Evaluation.areaUnderROC(Evaluation.java:382) で Classifier_Search.runAda(Classifier_Search.java:74) で Classifier_Search .acrossTest(Classifier_Search.java:142) at Classifier_Search.main(Classifier_Search.java:511) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl .invoke (不明なソース) で java.lang.reflect.Method.invoke (不明なソース) で edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)

エラーをスローしているコードは次のとおりです。

Evaluation eval = new Evaluation(train);
String[] options = {"-P 100", "-S 1", "-I " + it, "-W weka.classifiers.trees.DecisionStump"};
AdaBoostM1 cls = new AdaBoostM1(); 
cls.setOptions(options);
cls.buildClassifier(train);
eval.evaluateModel(cls, test);
int index = test.classIndex();
return eval.areaUnderROC(index);

評価用のjavadoc (評価用の javadoc ) を調べると、 evaluateClassifier メソッドで areaUnderROC を設定する必要があると書かれています。そのような方法は存在しません。他の同様のメソッド (falsePositive など) は問題なく機能します。誰かがこの問題に遭遇しましたか? OldNabble (Weka のヘルプ サイト) で何も見つかりません。

ありがとう!

編集:明確にするために、テストとトレーニングは両方とも、次のコードで作成されたインスタンス オブジェクトです。

private static Instances readFile(File filename) throws IOException
{
CSVLoader loader = new CSVLoader();
loader.setSource(filename);
Instances data = loader.getDataSet();
data.setClassIndex(data.numAttributes() - 1);
return data;
}

それらは .csv ファイルから読み取られます。通常、test または train に問題がある場合、ここでエラーがスローされます。

4

1 に答える 1

3

繰り返しになりますが、私は自分自身の質問に対する答えを持っています。誰かがこの答えに同意しない場合は、私に知らせてください。すでに 1 つのタイプミスがある areaUnderROC の weka ドキュメント (存在しないメソッド evaluateClassifier を参照しています) は、私を間違った方向に導きました。誤解を招く説明という形で別のエラーがあると思います。areaUnderROC は、0 と 1 の 2 つの値に対して (例外をスローすることなく) 機能します。そのため、クラス インデックス (Instances オブジェクトでクラスとして使用している属性のインデックス) を取得するのではなく、実際に必要なのはどのクラス ( 2 つのクラスの) をポジティブと見なします。ドキュメント内の変数名を考えると、これを一見理解できないのは理にかなっていると思います。また、その説明はメソッドの説明と並行しているためクラス インデックス (0 または 1 ではなく) を使用すると、誤解を招きます。

于 2012-05-02T14:02:46.453 に答える