2016-07-24 87 views
0

KNN我定義我的訓練和測試集如下:留一出交叉驗證中的R

colon_samp <-sample(62,40) 
colon_train <- colon_data[colon_samp,] 
colon_test <- colon_data[-colon_samp,] 

而且KNN功能:

knn_colon <- knn(train = colon_train[1:12533], test = colon_test[1:12533], cl = colon_train$class, k=2) 

這裏是我的LOOCV循環KNN:

newColon_train <- data.frame(colon_train, id=1:nrow(colon_train)) 
id <- unique(newColon_train$id) 

loo_colonKNN <- NULL 
for(i in id){ 
    knn_colon <- knn(train = newColon_train[newColon_train$id!=i,], test = newColon_train[newColon_train$id==i,],cl = newColon_train[newColon_train$id!=i,]$Y) 
    loo_colonKNN[[i]] <- knn_colon 
} 
print(loo_colonKNN) 

當我打印loo_colonKNN它給了我40個預測(即40車組的預測),但是,我希望它給我62個預測(原始數據集中的所有n個樣本)。我該如何去做這件事?

謝謝。

+0

作爲一個附註,對於'k'選擇一個奇數是不是最好的,這樣它就永遠不會被確定下來。 – zacdav

回答

0

只需將再次調用knn功能,使用不同的test參數:

[...] 
knn_colon2 <- knn(train = newColon_train[newColon_train$id!=i,], 
        test = newColon_test[newColon_test$id==i,], 
        cl = newColon_train[newColon_train$id!=i,]$Y) 

這是由KNN造成的是一種非參數,例如基於模型:數據本身是模型,因此「訓練「僅僅保留了」稍後「預測的數據,並且不需要任何計算密集的模型擬合程序。因此,多次調用訓練過程以將其應用於多個測試集是沒有問題的。

但請注意,CV的想法是每次只對左側分區進行評估,因此查看所有樣本可能並不是您想要做的。而不是自己編碼,你最好使用例如knn.cv函數或插入符號框架,而這些框架提供了所有的API在partitioning, resampling, etc.中,因此在這些任務中非常方便。