R语言中caret包训练mlp模型时单预测变量报错问题
这个问题我之前也碰到过,核心原因是单个预测变量的输入格式不对,不是mlp模型不支持单特征训练,咱们一步步拆解:
问题根源:输入维度不匹配
当你用Sonar[,1]提取单个变量时,R默认会把它简化成一维向量,而caret::train和mlp神经网络模型都期望输入是二维结构(比如数据框或矩阵,每行对应一个样本,每列对应一个特征)。
mlp模型在拟合时需要明确的特征维度信息,一维输入会导致内部的矩阵操作出错(比如错误提示里的x[modelIndex, , drop = FALSE]维度不正确),进而在交叉验证的重采样步骤中模型拟合失败,最终所有Accuracy指标都无法计算,就出现了你看到的报错。
你可以自己验证下三个输入的维度:
dim(SonarImput1) # 输出 (208, 60),二维结构 dim(SonarImput2) # 输出 (208, 2),二维结构 dim(SonarImput3) # 输出 NULL,因为是一维向量
解决方案:保留输入的二维结构
只需要修改单个变量的提取方式,让它保持二维结构就行,有两种简单方法:
方法1:使用drop=FALSE参数
在提取列的时候加上drop=FALSE,告诉R不要把单列数据简化成向量:
SonarImput3 <- Sonar[,1, drop=FALSE]
此时dim(SonarImput3)会输出(208, 1),是标准的二维数据框结构。
方法2:转换成矩阵
也可以把向量转换成二维矩阵:
SonarImput3 <- as.matrix(Sonar[,1])
这样得到的也是208行1列的二维结构,符合模型要求。
修改后的完整代码
library(caret) library(mlbench) data(Sonar) set.seed(107) SonarImput1 <- Sonar[,1:60] SonarImput2 <- Sonar[,1:2] SonarImput3 <- Sonar[,1, drop=FALSE] # 关键修改 SonarOutCome <- Sonar[,61] mlp <- caret::train(SonarImput1, SonarOutCome, method = "mlp", preProc = c("center", "scale")) mlp2 <- caret::train(SonarImput2, SonarOutCome, method = "mlp", preProc = c("center", "scale")) mlp3 <- caret::train(SonarImput3, SonarOutCome, method = "mlp", preProc = c("center", "scale"))
运行这段代码后,mlp3就能正常训练了——mlp模型完全支持单特征输入,只是要保证输入格式正确~
内容的提问来源于stack exchange,提问作者Kol Rocket




