2010-10-06 33 views
3

这里是我的问题的一个例子使用r和weka。我怎样才能使用元算法与nfold评估方法?

library(RWeka) 
iris <- read.arff("iris.arff") 

执行nfolds获得分类的合适的精度。

m<-J48(class~., data=iris) 
e<-evaluate_Weka_classifier(m,numFolds = 5) 
summary(e) 

在此提供的结果是通过与数据集的一部分构建模型,并用另一部分测试它获得,因此提供了精确的精度

现在我执行AdaBoost算法来优化分类

的参数
m2 <- AdaBoostM1(class ~. , data = temp ,control = Weka_control(W = list(J48, M = 30))) 
summary(m2) 

这里提供的结果是通过使用相同的数据集来建立模型,也使用相同的数据集来评估它,因此精度不代表真实的生活精度,其中我们使用其他实例进行模型评估。不过,这个程序有助于优化所建模型。

主要问题是我无法优化建立的模型,同时使用未用于构建模型的数据对其进行测试,或者仅使用三重验证方法来获得适当的精度。

+1

我格式化了你的问题。您可能想要为您的问题尝试stats.stackexchange.com。 – 2010-10-06 10:50:37

+0

为什么e2 < - evaluate_Weka_classifier(m2,numFolds = 5)没有做你想要的任何理由? – 2010-10-06 11:01:26

+0

非常感谢Joris格式化问题。 – 2010-10-06 11:09:20

回答

4

我想你误解了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()中有效。

+0

非常感谢你的所有信息,你的回复非常好,我真的很赞赏它。 – 2010-10-24 22:47:33