【问题标题】:How to get each folds' results in 10-fold cross-validation如何在 10 倍交叉验证中获得每个折叠的结果
【发布时间】:2017-12-09 22:44:34
【问题描述】:

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

不幸的是,我在 java 程序中的结果 My results 与 weka 的 explore GUI results 中的结果完全不同。我的代码是下面给出的partenter图像描述,

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得到的结果不一样,不知道我的代码哪部分错了?有人能遇到和我一样的问题吗?

【问题讨论】:

  • 我想 WEKA 可能不会将 10 折中结果的平均值作为最终结果,我每折中的 10 精度为 0.333 0.556 0.625 0.667 0.714 0.750 0.833 0.833 0.833 1.000 ,但结果在10 倍交叉验证是0.707。哦~~
  • for 循环中的每个评估都是唯一的,因为变量是新分配的。你实际上得到了你想要的。
  • 这就是为什么我在每个 for 循环中实例化一个新的 Evaluation 对象 eval,但我无法得到我想要的 :( 。我快疯了......
  • 你能描述一下precision(in)和precision(out)是什么吗?
  • 嗨,@ShaurabhBharti、in 和 out 在我的分类中是 2 个类,所以 precision(in) 是 in 类中的精度,而 precision(out) 是 @987654335 中的精度@类。

标签: java weka cross-validation


【解决方案1】:

是的,在浪费了这么多时间探索10折的平均值与WEKA中最终10折交叉验证的结果不匹配的原因之后,我终于找到了3点,

1) 我的 Java 代码是对的,这意味着 randomize()、stratify()、trainCV() 和 testCV() 使用正确。

2) WEKA中10折交叉验证的结果不等于每折结果的平均值。

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

对于第三点,比如在每一折中,WEKA会得到precision、recall、f-measure、AUC、ROC、errorRate这样的度量以及混淆矩阵,定义为 cm(i)。那么,10折交叉验证的最终结果也可以得到一个混淆矩阵CM,定义为,

CM = cm(1) + cm(2) + ... cm(10)

最后precision、recall、f-measure、AUC、ROC这样的度量都是用这个混淆矩阵CM计算出来的,真是让我大吃一惊@^@。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2014-09-13
    • 2011-11-29
    • 2018-09-10
    • 2019-11-18
    • 2020-02-10
    • 1970-01-01
    • 2013-08-16
    • 2020-04-08
    相关资源
    最近更新 更多