关于使用R对KNN进行k折交叉验证的问题

时间:2019-03-24 20:48:13

标签: r machine-learning cross-validation knn

我正在尝试对k的多个值进行5折交叉验证。我在ISLR包中使用了OJ数据集。

到目前为止,我的代码

library(ISLR)
library(class)
ks=c(1:5)
err.rate.test <- numeric(length = 5)
folds <- cut(seq(1,nrow(OJ)),breaks=5,labels=FALSE)

for (j in seq(along = ks)) {
  set.seed(123)
  cv.knn <- sapply(1:5, FUN = function(i) {
    testID <- which(folds == i, arr.ind = TRUE)
    test.X <- OJ[testID, 3]
    test.Y <- OJ[testID, 1]
    train.X <- OJ[-testID, 3]
    train.Y <- OJ[-testID, 1]
    knn.test <- knn(data.frame(train.X), data.frame(test.X), train.Y, k = ks[j])
    cv.test.est <- mean(knn.test != test.Y)
    return(cv.test.est)
  })
  err.rate.test[j] <- mean(cv.knn)

}


err.rate.test
[1] 0.3757009 0.3757009 0.3757009 0.3757009 0.3757009

该代码未给出任何错误。但是由于某种原因,我对每个k值的测试错误率都相同,这对我来说似乎很奇怪。所以我认为我的代码有问题。

有人可以帮我弄清楚吗?

谢谢

1 个答案:

答案 0 :(得分:4)

删除set.seed(123),这会导致重复错误率。

set.seed用于重现性,确保任何随机网格搜索或参数估计均保持不变,这意味着适用于knn模型的所有参数估计在整个执行过程中均相同,因此具有相同的预测,因此具有相同的错误率。