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

时间:2012-05-02 00:57:58

标签: java weka

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

  

显示java.lang.NullPointerException       at weka.classifiers.evaluation.ThresholdCurve.getROCArea(ThresholdCurve.java:268)       at weka.classifiers.Evaluation.areaUnderROC(Evaluation.java:382)       在Classifier_Search.runAda(Classifier_Search.java:74)       在Classifier_Search.acrossTest(Classifier_Search.java:142)       在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)       在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 for Evaluation(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文件中读取它们。通常,如果测试或火车出现问题,则会抛出错误。

1 个答案:

答案 0 :(得分:3)

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