我猜你误解了 evaluate_Weka_classifier 的功能。在这两种情况下,evaluate_Weka_classifier 仅根据训练数据进行交叉验证。它不会改变模型本身。比较以下代码的混淆矩阵:
m<-J48(Species~., data=iris)
e<-evaluate_Weka_classifier(m,numFolds = 5)
summary(m)
e
m2 <- AdaBoostM1(Species ~. , data = iris ,
control = Weka_control(W = list(J48, M = 30)))
e2 <- evaluate_Weka_classifier(m2,numFolds = 5)
summary(m2)
e2
在这两种情况下,摘要都会根据训练数据为您提供评估,而函数evaluate_Weka_classifier()
会为您提供正确的交叉验证。无论是对于 J48 还是对于 AdaBoostM1,模型本身都会根据交叉验证进行更新。
现在关于 AdaBoost 算法本身:事实上,它确实使用某种“加权交叉验证”来得出最终分类器。错误分类的项目在下一个构建步骤中被赋予更大的权重,但对所有观察使用相同的权重进行评估。因此,使用交叉验证来优化结果并不真正符合自适应提升算法背后的总体思路。
如果您想要使用训练集和评估集进行真正的交叉验证,您可以执行以下操作:
id <- sample(1:length(iris$Species),length(iris$Species)*0.5)
m3 <- AdaBoostM1(Species ~. , data = iris[id,] ,
control = Weka_control(W = list(J48, M=5)))
e3 <- evaluate_Weka_classifier(m3,numFolds = 5)
# true crossvalidation
e4 <- evaluate_Weka_classifier(m3,newdata=iris[-id,])
summary(m3)
e3
e4
如果您想要一个基于交叉验证更新的模型,您将不得不使用不同的算法,例如randomForest()
来自 randomForest 包。它收集了一组基于交叉验证的最优树。它也可以与 RWeka 包结合使用。
编辑:为真正的交叉验证更正了代码。使用该subset
参数也有效果evaluate_Weka_classifier()
。