如何使每个折叠的结果进行10倍交叉验证

时间:2017-07-06 05:07:41

标签: java weka cross-validation

实际上,我知道有一种GUI方法可以在weka,see here中对每个折叠的结果进行10次交叉验证,但我正在使用weka api进行编程。

不幸的是,来自java程序的我的结果My results与weka的探索GUI results中的结果完全不同。我的代码是下面的部分图像描述,

Instances data1 = DataSource.read("D:/Users/.../XX.arff"); // upload the dataset
data1.setClassIndex(data1.numAttributes()-1); // set class index
data1.randomize(new Random(1))
data1.stratify(10); // stratify the dataset into 10 folds
for(int i=0; i<10; i++){
    Instances train = data1.trainCV(10, i);
    Instances test = data1.testCV(10, i);
    RandomForest rf = new RandomForest();
    rf.buildClassifier(train);  
    Evaluation eval = new Evaluation(train);
    eval.evaluateModel(rf, test);
    ... // then I compute each folds' results using eval.XXX()
}

上面的10倍交叉验证代码计算得到的结果与标准weka GUI得到的结果不同,我不知道我的代码哪个部分错了?任何人都可以遇到和我一样的问题吗?

1 个答案:

答案 0 :(得分:0)

是的,在浪费了这么多时间探索为什么平均10倍的结果与WEKA的最终10倍交叉验证结果不匹配之后,我终于找到了3分,

  

1)我的Java代码是正确的,这意味着 randomize()分层() trainCV() testCV()使用正确。

     

2)WEKA中10倍交叉验证的结果与每次折叠结果的平均值不相等。

     

3)通过混淆矩阵计算WEKA中10倍交叉验证的结果。

对于第三点,例如,在每个折叠中,WEKA将获得precisionrecallf-measureAUCROC,{{ 1}}这样的度量以及混淆矩阵,定义为cm(i)。然后,10倍交叉验证的最终结果也可以得到混淆矩阵CM,其定义为,

errorRate

最后,CM = cm(1) + cm(2) + ... cm(10) precisionrecallf-measureAUC这样的衡量标准是由这个混淆矩阵CM计算出来的,这真的让我高兴了很多@ ^ @。