WEKA中十倍交叉验证的结果不可靠

时间:2018-06-22 12:01:04

标签: weka cross-validation

昨天,我使用2种方法在weka中实现10倍交叉验证,但结果不一致。

方法1:直接调用方法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文档,以上两种方法应具有相同的结果,即方法2的平均结果(例如,精度,召回率)应等于方法1的结果。它们是不一样的,有人可以找出我代码中的错误,还是提供其他不错的评估方法?谢谢大家!

2 个答案:

答案 0 :(得分:3)

如果您查看n_range = {'n_neighbors': range(1,100)} knn_search = GridSearchCV(estimator = KNeighborsClassifier(), param_grid=n_range, scoring='f1_micro') knn_search.fit(features_vector, train_labels) 方法的代码(取决于您的版本,委托对象),您会发现它使用weka.classifiers.Evaluation.crossValidateModel方法。此外,您需要使用完整数据集的类优先级来初始化weka.core.Instances.trainCV(int,int,Random)对象。

这是更新的代码:

Evaluation

答案 1 :(得分:1)

Way1 是Weka GUI中广泛使用的基本方法,因此crossValidationModel()可以使用 Weka Explorer 给出相同的平均结果,例如以下操作。

1。打开 Weka 服装

2。进入 Explorer 模块

3。在“预处理” 标签中选择数据集

4。在“分类” 选项卡中选择 J48 10倍交叉验证

5。单击开始按钮在分类器输出窗口中获取结果

方法2 是一种替代方法,我们可以获取每一折的结果。每个折叠的结果与 Weka Experimenter 中的结果相同,就像以下操作一样。

  1. 打开 Weka 软件

  2. 进入 Experimenter 模块

  3. 单击新建按钮以在“设置”标签

  4. 中新建一个简单实验
  5. 结果目标数据集算法

  6. 中设置参数
  7. 在“运行”选项卡中单击“ 开始”按钮,每个折叠的结果将保存在结果目标

  8. 中定义的文件中

总而言之,这两种方法肯定会返回两种不同的结果,根据其办公网站https://weka.wikispaces.com/Generating+cross-validation+folds+(Java+approach)给出的源代码,上述方法应获得一致的结果,但事实恰恰相反,也许这是Weka的错误。