R语言机器学习建模时训练验证集维度错误解决方案
报错根因
两个低级错误:
- 索引写错:拆分数据集时你操作的是存储所有数据集的列表
n.heart.ds,不是当前循环对应的第i个数据集。R里列表是一维对象,你用二维的[行号,列号]语法去索引一维列表,必然报维度不正确。 - 列表初始化位置错了:你把建模、数据拆分环节要用的所有空列表全定义在for循环内部,每次循环迭代都会把之前存的结果清空重置,就算改了索引,跑第二个缺失率参数的时候第一个参数的结果会直接被覆盖。
修复步骤
- 把所有建模、拆分环节的空列表初始化代码,全部移到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))
- 修改训练集、验证集的赋值逻辑,索引时明确指定取列表中第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
相关产品推荐
相关产品推荐

