调试交叉验证码

时间:2013-10-21 04:07:46

标签: r machine-learning

我正在尝试手工进行10倍交叉验证。我的数据集名为spam

我的代码如下:

n <- nrow(spam) #4600 rows in spam data set
ncp <- length(spam.rpart2$cptable[,"CP"]) #20 CP values
group <- rep(1:10,ceiling(n/10))[1:n] #fill 4600 values with 1 to 10
permid <- sample(1:n) #permute numbers
cvtable <- matrix(NA, n, ncp) 

for(j in 1:20) {
    for(i in 1:10) {
    trainingset <- permid[group!=i]
    testset <- permid[group==i]
    spam.rpart.test <- rpart(spam ~ ., 
                             method = "class",
                             cp = spam.rpart2$cptable[j,"CP"],
                             data = spam[trainingset,])
    cvtable[testset,j] <- predict(spam.rpart.test, 
                                  data=spam[testset,])[,1]
#incorrect dimensions!
     }
}

但是,我在第三到最后一行遇到麻烦。预测值应仅预测460个值,但它给出了4160个值,因此for循环代码未运行。我收到以下错误:

Error in cvtable[testset, j] <- predict(spam.rpart.test, data = spam[testset,  : 
  number of items to replace is not a multiple of replacement length

1 个答案:

答案 0 :(得分:0)

您希望指定newdata来预测每?predict.rpart,否则您将获得模型中保存的训练集的预测。更正的代码可能如下所示:

cvtable[testset, j] <- predict(spam.rpart.test, 
                              newdata=spam[testset,])[,1]

谜团是错误信息应标记4140替换条目,而不是4160。

相关问题