2013-10-21 93 views
1

我正在嘗試手動進行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

有沒有你喜歡用手做這個,而不是使用已經存在的一個原因(很好的實施)通過像'caret'這樣的軟件包的CV選項? – David

+0

我正在嘗試編碼! – user2303557

+0

我使用rpart()函數的方式有問題嗎?我花了數小時調試,似乎無法解決這個問題......謝謝! – user2303557

回答

0

你想指定newdata預測,每?predict.rpart,否則你得到的預測。更正後的代碼可能看起來像:

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

奧祕是錯誤消息應標誌4140替換條目,而不是4160