我正在尝试手工进行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
答案 0 :(得分:0)
您希望指定newdata
来预测每?predict.rpart
,否则您将获得模型中保存的训练集的预测。更正的代码可能如下所示:
cvtable[testset, j] <- predict(spam.rpart.test,
newdata=spam[testset,])[,1]
谜团是错误信息应标记4140替换条目,而不是4160。