You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动