R语言caret包实现KNN分类时k=1准确率突增问题求助
问题排查步骤
- 第一步:排查数据集重复样本
葡萄酒原始数据集本身存在少量完全重复的观测行,若未提前去重,K=1时模型可直接匹配训练集中完全相同的特征样本得到近乎完美的预测结果,导致准确率异常偏高。处理方法:在数据预处理阶段先对全数据集去重,代码如下:
# 合并红白葡萄酒数据后先去重 data <- distinct(data)
完成去重后再运行拆分、建模流程,查看最优k值是否恢复正常。
第二步:排查标签泄露问题
确认训练集特征中不存在和目标标签quality2高度相关的衍生变量:- 运行
colnames(datTrain)确认变量列表中未包含原quality变量、旧版质量分类变量等可直接推断标签的字段 - 检查是否有特征与目标标签的皮尔逊相关系数超过0.9,若存在则属于明显标签泄露,需移除对应特征
- 运行
第三步:验证交叉验证结果是否合理
手动调用原生KNN实现验证准确率,排除caret包配置错误问题:
library(class) # 对训练集特征标准化,测试集用训练集的均值和标准差做标准化避免泄露 train_x <- datTrain[, !colnames(datTrain) %in% "quality2"] train_y <- datTrain$quality2 test_x <- datTest[, !colnames(datTest) %in% "quality2"] test_y <- datTest$quality2 train_scaled <- scale(train_x) test_scaled <- scale(test_x, center = attr(train_scaled, "scaled:center"), scale = attr(train_scaled, "scaled:scale")) # 分别计算k=1和k=15的测试集准确率 acc_k1 <- mean(knn(train_scaled, test_scaled, train_y, k=1) == test_y) acc_k15 <- mean(knn(train_scaled, test_scaled, train_y, k=15) == test_y)
若手动计算结果中acc_k1仍远高于acc_k15,则问题出在数据集处理环节,否则需检查trainControl、tuneGrid等caret配置参数是否存在拼写错误。
内容的提问来源于stack exchange,提问作者Miranda Green
相关产品推荐
相关产品推荐

