我正在尝试对多个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值的测试错误率都是相同的。这对我来说似乎很奇怪。所以我认为我的代码可能有问题。
谁能帮我找出问题所在?
回答:
移除 set.seed(123)
,这是导致错误率重复的原因。
set.seed
用于确保可重复性,使得任何随机网格搜索或参数估计保持不变,这意味着用于拟合knn
模型的所有参数估计在每次执行时都是相同的,导致相同的预测和因此相同的错误率。