我正在尝试将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而不是上面的分隔。
答案 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 中的一般概念是找到正确的 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")