3

所以我试图评估分类器在测试实例上的性能,当我尝试获取 ROC 下的区域时,会引发以下错误:

Java.lang.NullPointerException at weka.classifiers.evaluation.ThresholdCurve.getROCArea(ThresholdCurve.java:268) at weka.classifiers.Evaluation.areaUnderROC(Evaluation.java:382) at Classifier_Search.runAda(Classifier_Search.java:74) at Classifier_Search .acrossTest(Classifier_Search.java:142) 在 Sun.reflect.NativeMethodAccessorImpl 的 Classifier_Search.main(Classifier_Search.java:511) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl .invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at 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)时,它说 areaUnderROC 需要由 evaluateClassifier 方法设置。不存在这样的方法。其他类似的方法(例如 falsePositive)也可以正常工作。有没有人遇到过这个问题?我在 OldNabble(Weka 的帮助网站)上找不到任何东西。

谢谢!

编辑:澄清一下,测试和训练都是使用以下代码创建的 Instances 对象:

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 文件中读取的。通常,如果测试或训练有问题,则会在此处抛出错误。

4

1 回答 1

3

再一次,我有自己问题的答案。如果有人不同意这个答案,请告诉我。areaUnderROC 的 weka 文档已经有一个错字(它引用了一个方法,evaluateClassifier,它不存在),导致我走错了方向。我认为还有一个误导性解释形式的错误。areaUnderROC 对两个值有效(不抛出异常):0 和 1。因此,与其采用类索引(我使用的属性的索引作为 Instances 对象中的类),它真正想要的是哪个类(的两个类)认为是积极的。鉴于文档中的变量名称,我认为乍一看不理解这一点是合理的。也认为,因为它的解释与方法的解释是平行的取类索引(而不是 0 或 1),这也是一种误导。

于 2012-05-02T14:02:46.453 回答