如何在带有KNN的R中使用LOOCV?

时间:2018-06-30 20:21:43

标签: r cross-validation knn

我正在尝试将KNN与癌症数据结合使用。刚开始,我仅将分离数据用于训练和测试集中,但得到了意外的结果。所以我想用LOOCV来确定。

我发现只有LOOCV具有广义线性模型。

例如glm.fit = glm(mpg ~ horsepower, data=Auto)

那么如何在R和KNN中使用LOOCV?

编辑

我的代码

wdbc<- read.table("http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data",sep=",",stringsAsFactors = FALSE)

wdbc<-wdbc[-1]

normalize <- function(x) {return ((x-min(x)) / (max(x) - min(x)))}

wdbc_n <- as.data.frame(lapply(wdbc[2:31], normalize))
wdbc_train<-wdbc_n[1:469,]
wdbc_test<-wdbc_n[470:569,]

我上传了数据,但排除了第一列,即类标签。然后,我将数据分为训练和测试集。但是,我想在分隔中使用LOOCV而不是上面的分隔。

1 个答案:

答案 0 :(得分:2)

  

knn.cv软件包中的class函数基于 留出一个交叉验证 。以下该函数的实现为您提供了full数据的 LOOCV 预测(即,无需分离训练和测试)。

library(class)

knn.cv(train = wdbc_n, 
      cl = as.factor(wdbc[,1]), 
      k = 4, prob = FALSE,                        # test for different values of k
      use.all = TRUE)

引用 knn.cv: R documentation

knn 中的一般概念是找到正确的 k (即最近邻居的数量)用于预测。这是使用交叉验证完成的。

  

一种更好的方法 是使用 caret软件包来执行 cv 在网格上以获得最佳k值。像这样:

library(caret)

train.control <- trainControl(method  = "LOOCV")

fit <- train(V1~ .,
             method     = "knn",
             tuneGrid   = expand.grid(k = 1:20),
             trControl  = train.control,
             metric     = "Accuracy",
             data       = cbind(V1 = as.factor(wdbc[,1]), wdbc_n))

输出:适合

        k-Nearest Neighbors 

569 samples
 30 predictor
  2 classes: 'B', 'M' 

No pre-processing
Resampling: Leave-One-Out Cross-Validation 
Summary of sample sizes: 568, 568, 568, 568, 568, 568, ... 
Resampling results across tuning parameters:

  k   Accuracy   Kappa    
   1  0.9525483  0.8987965
   2  0.9595782  0.9132927
   3  0.9701230  0.9355404
   4  0.9683656  0.9318146
  ........................
  13  0.9736380  0.9429032
  14  0.9718805  0.9391558
  15  0.9753954  0.9467613
  16  0.9683656  0.9314173
  17  0.9736380  0.9429032
  18  0.9630931  0.9197531
  19  0.9648506  0.9236488
  20  0.9630931  0.9197531

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was k = 15.

qplot(fit$results$k,fit$results$Accuracy,geom = "line",
      xlab = "k", ylab = "Accuracy")

Accuracy Vs K