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

R语言机器学习建模时训练验证集维度错误解决方案

报错根因

两个低级错误:

  • 索引写错:拆分数据集时你操作的是存储所有数据集的列表n.heart.ds,不是当前循环对应的第i个数据集。R里列表是一维对象,你用二维的[行号,列号]语法去索引一维列表,必然报维度不正确。
  • 列表初始化位置错了:你把建模、数据拆分环节要用的所有空列表全定义在for循环内部,每次循环迭代都会把之前存的结果清空重置,就算改了索引,跑第二个缺失率参数的时候第一个参数的结果会直接被覆盖。
修复步骤
  1. 把所有建模、拆分环节的空列表初始化代码,全部移到for循环外面,和前面MICE相关的列表定义放在一起,不要放在循环体里。要移出去的代码如下:
# MLA BINS
control <- vector(mode = "list", length = length(p))
results <- vector(mode = "list", length = length(p))
vimp <- vector(mode = "list", length = length(p))

#BINS
n.heart.ds <- vector(mode = "list", length = length(p))
tr.dat <- vector(mode = "list", length(p))
TrainSet <- vector(mode = "list", length = length(p))
ValidSet <- vector(mode = "list", length = length(p))
fitControl <- vector(mode = "list", length = length(p))
  1. 修改训练集、验证集的赋值逻辑,索引时明确指定取列表中第i个数据集,修正后的拆分代码:
#Data Splitting
set.seed(1237)
tr.dat[[i]] <- sample(nrow(n.heart.ds[[i]]), .7*nrow(n.heart.ds[[i]]), replace = FALSE)

# 补全[[i]]索引,定位到当前循环对应的插补后数据集
TrainSet[[i]] <- n.heart.ds[[i]][tr.dat[[i]],]
ValidSet[[i]] <- n.heart.ds[[i]][-tr.dat[[i]],]
额外注意

你现在特征筛选后删列是硬编码写死的-c(2,6,7,8,9,11),和前面RFE算法输出的选中特征完全没有关联,不同缺失率下插补得到的数据集跑RFE选出的特征大概率不一样,硬编码删列很容易导致后续建模出现列不匹配、标签列误删之类的问题,建议直接用predictors(results[[i]])拿到RFE选中的特征名,再做数据子集提取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:01:12