我已经定义了我的训练和测试集如下:
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个样本)。我该怎么做呢?
谢谢。
答案 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,因此在这些任务中非常方便。