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

R语言循环调用cv.kknn报apply维度错误,如何输出MAE汇总表

报错原因分析
  • kcv是cv.kknn函数中控制交叉验证折数的参数,取值必须满足 2 ≤ kcv ≤ 数据集总行数。你测试的参数包含500、1000两个大值,如果你导入的信用卡数据集总行数小于1000甚至小于500,过大的折数会导致拆分交叉验证集时出现单折样本量为0的情况,触发weightClass维度计算错误,就是你遇到的报错。
  • 你已经把响应变量V11转成了因子类型,此时cv.kknn会按分类任务处理,返回的结果结构和回归任务不同,你直接取model_simple5[2]计算MAE的逻辑本身不成立,MAE是回归任务的评估指标,分类任务应该用准确率、混淆矩阵这类指标。
修复方案
  1. 首先运行nrow(data_CCard)确认数据集总行数,kcv的取值不能超过这个数值
  2. 如果你要做回归任务,删掉把V11转成因子的代码;如果是分类任务,把评估指标从MAE替换为分类准确率
  3. 优化结果存储逻辑,避免list拼接引发的类型错误
修复后代码
# 导入数据
data_CCard = read.table("/Users/credit_card_data.txt", stringsAsFactors = FALSE, header = FALSE)
# 回归任务删掉下行代码,分类任务保留
# data_CCard$V11 =as.factor(data_CCard$V11)
set.seed(188)

# 确认数据集行数,调整parameter最大值不要超过样本量
cat("数据集总行数为:", nrow(data_CCard), "\n")
# 先移除超过常规样本量的500、1000,确认运行正常后再按需调整参数范围
parameter = c(10,30,50,70,90,100) 
result_df = data.frame(kcv = numeric(), MAE = numeric())

library(kknn)
# 循环测试
for (i in seq_along(parameter)){
  current_kcv = parameter[i]
  model_simple5 = cv.kknn(V11 ~., 
                         data = data_CCard,
                         kcv = current_kcv,
                         scale= TRUE)
  # 回归任务正确计算MAE:cv.kknn返回第一列为真实值,第二列为预测值
  current_mae = mean(abs(model_simple5[,1] - model_simple5[,2]))
  result_df = rbind(result_df, data.frame(kcv = current_kcv, MAE = current_mae))
}

# 输出结果表格
print(result_df, row.names = FALSE)
额外注意事项
  • 如果确实需要测试1000这类大kcv值,必须保证数据集行数≥1000,否则kcv最大只能取到数据集总行数,对应留一交叉验证
  • 直接初始化数据框逐行追加结果,比用cbind拼接list再转数值类型的写法更稳妥,不容易出现隐式类型错误

内容的提问来源于stack exchange,提问作者blackjacc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:24:01