如何嵌套for循环实现K-NN分类器5折交叉验证k=1~10准确率计算
依赖包安装
如果首次运行需要先安装依赖包,运行以下命令:
install.packages(c("dplyr", "caret", "class"))
实现逻辑说明
- 先完成iris数据集的加载和特征归一化
- 设置随机种子保证运行结果可复现
- 生成5折交叉验证的样本分组索引
- 采用嵌套循环实现需求:外层遍历k=2到10的所有取值,内层遍历5折交叉验证的每一折计算单折准确率,最终取5次准确率的平均值作为当前k值的性能指标
- 输出所有k值对应的平均准确率结果
完整可运行代码
# 加载依赖包 library(datasets) library(dplyr) library(caret) library(class) # 设置随机种子,保证结果可复现 set.seed(123) # 导入iris数据集 data(iris) # 定义归一化函数 normalize <- function(x) { return ((x - min(x))/(max(x) - min(x))) } # 对前4列特征做归一化处理 iris_normalized <- iris %>% mutate_at(1:4, normalize) # 生成5折交叉验证的分组索引 cv <- createFolds(y = iris_normalized$Species, k = 5) # 初始化结果存储向量 acc_result <- c() # 外层循环:遍历k=2到10 for (k in 2:10) { # 存储当前k值下每一折的准确率 fold_accuracy <- c() # 内层循环:遍历5折的每一折 for (test_rows in cv) { # 拆分训练集、测试集的特征和标签 train_x <- iris_normalized[-test_rows, 1:4] train_y <- iris_normalized[-test_rows, 5] test_x <- iris_normalized[test_rows, 1:4] test_y <- iris_normalized[test_rows, 5] # 训练KNN模型并预测 pred <- knn(train = train_x, test = test_x, cl = train_y, k = k) # 计算当前折的准确率 cm <- confusionMatrix(pred, as.factor(test_y)) fold_accuracy <- c(fold_accuracy, cm$overall[1]) } # 计算当前k值的平均准确率,存入结果向量 current_acc <- mean(fold_accuracy) acc_result[paste0("k=", k)] <- current_acc # 打印当前k值的结果 cat("k =", k, " 平均准确率:", round(current_acc, 4), "\n") } # 输出所有k值的准确率结果 print("所有k值对应的平均准确率如下:") print(acc_result)
结果说明
运行代码后会依次打印k=2到10每个取值对应的5折交叉验证平均准确率,你可以根据结果选择最优的k值用于后续的KNN模型构建。
内容的提问来源于stack exchange,提问作者FannyPackFanatic
相关产品推荐
相关产品推荐

