所以我尝试评估分类器在测试实例上的性能,当我尝试获取 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) 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(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 for Evaluation ) 时,它说 areaUnderROC 需要通过 evaluateClassifier 方法设置。不存在这样的方法。其他类似的方法(例如 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 文件中读取的。通常,如果测试或训练出现问题,就会在此处抛出错误。
最佳答案
再一次,我有了自己问题的答案。如果有人不同意这个答案,请告诉我。 areaUnderROC 的 weka 文档已经有一个拼写错误(它引用了一种不存在的方法 evaluateClassifier),使我误入歧途。我认为还有一个误导性解释的错误。 areaUnderROC 为两个值工作(不抛出异常):0 和 1。因此,与其获取类索引(我用作 Instances 对象中的类的属性的索引),它真正想要的是哪个类(两个类别中的一个)被认为是积极的。鉴于文档中的变量名称,我认为乍一看不明白这一点是合理的。我还认为,由于它的解释与确实采用类索引(而不是 0 或 1)的方法的解释是平行的,因此它也具有误导性。
关于使用 Weka 的 Evaluation.areaUnderROC 时出现 Java NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406406/