You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:18:03