关于使用 R 对 KNN 进行 k 折交叉验证的问题
Question regarding k fold cross validation for KNN using R
我正在尝试对多个 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 值的测试错误率是 same.This 对我来说似乎很奇怪。所以我假设我的代码有问题。
谁能帮我解决这个问题?
谢谢
删除 set.seed(123)
,这会导致重复错误率。
set.seed
用于可重复性,确保任何随机网格搜索或参数估计保持不变,这意味着用于拟合 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 值的测试错误率是 same.This 对我来说似乎很奇怪。所以我假设我的代码有问题。
谁能帮我解决这个问题?
谢谢
删除 set.seed(123)
,这会导致重复错误率。
set.seed
用于可重复性,确保任何随机网格搜索或参数估计保持不变,这意味着用于拟合 knn
模型的所有参数估计在执行过程中都是相同的,导致相同的预测,因此也有相同的错误率。