【发布时间】:2018-12-01 21:43:12
【问题描述】:
昨天我在weka中用2种方式实现了10折交叉验证,但是结果不一致。
方式一:直接调用方法eval.crossValidateModel(),
J48 j48 = new J48();
j48.buildClassifier(ins); // ins is the Instances object
Evaluation eval = new Evaluation(ins);
eval.crossValidateModel(j48, ins, 10, new Random(1)); // 10-fold cross validation
... // get results by eval.getXX(0) or eval.getXXX(1)
方式2:在每个折叠中使用方法testCV()和trainCV(),
ins.randomize(new Random(1)); // ins is the Instances object
ins.stratify(10); // randomize the dataset then split into 10 folds
for(int i=0; i<10; i++){
Instances trainData = ins.trainCV(10, i);
Instances testData = ins.testCV(10, i);
J48 j48 = new J48();
j48.buildClassifier(trainData);
Evaluation eval = new Evaluation(trainData);
eval.evaluateModel(j48, testData);
... // get results by eval.getXX(0) or eval.getXXX(1)
}
根据weka api docs,上述2种方式应该有相同的结果,即方式2的平均结果(例如,精度,召回)应该等于方式1的结果。但事实是它们不一样,任何人都可以找出我代码中的错误,或者提供其他不错的评估方法吗?谢谢大家!
【问题讨论】:
-
我还注意到有一些GUI解决方案可以获取每个折叠Weka: Results of each fold in 10-fold CV的结果,结果也与使用
crossValidateModel的结果不一致。
标签: weka cross-validation