Вчера я использовал 2 способа реализации 10-кратной перекрестной проверки в weka, но результаты противоречивы.
Способ 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 вышеуказанных способа должны иметь одинаковые результаты, т. е. средние результаты (например, точность, полнота) способа 2 должны быть равны результатам способа 1. Но правда в том, что они не совпадают. то же самое, может ли кто-нибудь выяснить ошибку в моем коде или предоставить другие хорошие методы оценки? Спасибо вам всем!
crossValidateModel
. - person Yongfeng   schedule 22.06.2018