在R

时间:2016-07-24 14:55:54

标签: r loops machine-learning cross-validation knn

我已经定义了我的训练和测试集如下:

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)

这是KNN的LOOCV循环:

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个样本)。我该怎么做呢?

谢谢。

1 个答案:

答案 0 :(得分: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是一个非参数的,基于实例的模型引起的:数据本身就是模型,因此&#34;培训&#34;只是持有&#34;以后的数据&#34;预测并且不需要任何计算密集的模型拟合程序。因此,多次调用培训程序将其应用于多个测试集是没有问题的。

但请注意,CV的想法是每次仅评估左侧分区,因此查看所有样本可能不是您想要做的。而且,不是自己编码,你可能最好使用例如相反,knn.cv函数或插入符号框架为partitioning, resampling, etc.提供了API,因此在这些任务中非常方便。