使用 Weka 的 Evaluation.areaUnderROC 时出现 Java NullPointerException

标签 java weka

所以我尝试评估分类器在测试实例上的性能,当我尝试获取 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/

相关文章:

java - 正则表达式按分隔符分割,排除转义符并保留空字符串

java - Maven 被杀 - 不知道为什么

java - 将 Java 小程序嵌入我的网页的最佳方式是什么?

java - 使用 Weka 查找实例分配到的集群

在 Weka 中以编程方式使用 LibSVM 的 java 类路径错误

java - 在dao层和service层使用@Transactional有什么区别?

java - Android ListView 适配器崩溃问题/重复

java - 如何在 java 中使用 StringToWordVector (weka)?

java - Hadoop:无需 Writable 接口(interface)即可将对象作为输出值的简单方法

hadoop - 将 Mahout 模型输出导出为 Weka 输入