昨天,我使用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的结果。它们是不一样的,有人可以找出我代码中的错误,还是提供其他不错的评估方法?谢谢大家!
答案 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 中的结果相同,就像以下操作一样。
打开 Weka 软件
进入 Experimenter 模块
单击新建按钮以在“设置”标签
在结果目标,数据集和算法
在“运行”选项卡中单击“ 开始”按钮,每个折叠的结果将保存在结果目标
总而言之,这两种方法肯定会返回两种不同的结果,根据其办公网站https://weka.wikispaces.com/Generating+cross-validation+folds+(Java+approach)给出的源代码,上述方法应获得一致的结果,但事实恰恰相反,也许这是Weka的错误。