mar*_*fer 4 r machine-learning data-mining weka
这是我的问题的一个例子
library(RWeka)
iris <- read.arff("iris.arff")
Run Code Online (Sandbox Code Playgroud)
执行nfolds以获得分类器的正确准确度.
m<-J48(class~., data=iris)
e<-evaluate_Weka_classifier(m,numFolds = 5)
summary(e)
Run Code Online (Sandbox Code Playgroud)
这里提供的结果是通过使用部分数据集构建模型并使用另一部分进行测试获得的,因此可以提供准确的精度
现在我执行AdaBoost来优化分类器的参数
m2 <- AdaBoostM1(class ~. , data = temp ,control = Weka_control(W = list(J48, M = 30)))
summary(m2)
Run Code Online (Sandbox Code Playgroud)
这里提供的结果是通过使用相同的数据集来构建模型以及用于评估模型的相同数据集获得的,因此精度不能代表我们使用模型评估其他实例的实际精度.然而,此过程有助于优化构建的模型.
主要问题是我无法优化构建的模型,同时使用未用于构建模型的数据对其进行测试,或者仅使用nfold验证方法来获得正确的精度.
我猜你误解了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
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,摘要都会根据训练数据为您提供评估,而该功能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
Run Code Online (Sandbox Code Playgroud)
如果您想要一个基于交叉验证更新的模型,您将不得不使用其他算法,例如randomForest()来自randomForest包.它基于交叉验证收集一组最佳树.它也可以与RWeka包一起使用.
编辑:更正的代码以进行真正的交叉验证.使用subset参数evaluate_Weka_classifier()也会产生影响.