r - 神经网络:需要数字/复杂矩阵/向量参数
问题描述
我使用该包neuralnet
在 R 中构建分类模型。但是,我遇到了著名的错误:
Error in cbind(1, pred) %*% weights [[num_hidden_layers + 1]]:
requires numeric/complex matrix/vector arguments
这里还有很多其他类似的问题,但没有一个能解决我的问题。这些是我正在采取的步骤:
- 用于
model.matrix
创建虚拟列(确保没有列是因子或字符串) paste
按函数创建手动公式neuralnet
使用步骤 1 的 one-hot-encoded 数据集和步骤 2 中创建的公式进行训练
到这里为止,一切都很好。没有错误。该模型在 5000 次迭代后收敛。但是,当我使用compute
orpredict
函数对测试数据进行预测时,它给了我上述错误。
我很确定这些列是相同的并且具有相同的名称。此外,每个属性的类都是数字的。我告诉自己,也许测试集没有很好地转换model.matrix
,所以我在预测/计算函数中使用了相同的训练集!令人惊讶的是,它对相同的训练集给出了类似的错误!如果数据不是数字/复数矩阵,最初是如何训练的,现在无法预测?
PS:由于隐私问题,我无法共享数据。这是简化的代码:
trainset = model.matrix(~., data=train_roig)
NN_model = neuralnet(f, trainset[,-c(1:2)], hidden = c(4,2))
# NO ERROR
compute(NN_model, trainset[,-c(1:2)])
# GIVES ME THE ERROR
predict(NN_model, trainset[,-c(1:2)])
# GIVES ME THE SAME ERROR
仔细检查列名:
NN_model$model.list$variables == colnames(trainset[,-c(1:2)])
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
申请后检查trainset的结构model.matrix
:
str(trainset)
# num [1:134260, 1:19] 0 0 0 0 0 0 0 0 0 ...
# -attr(*, "dimnames") = list of 2
# ..$ : chr [1:134260] "1" "2" "3" "4" ...
# ..$ : chr [1:19] "Y" "n_trips" "age" "sexM" ...
解决方案
一个可能的问题是收敛。如果stepmax
达到数量但默认threshold
不满足,则模型不会产生任何权重。
用于plot(trainset)
确保生成权重。如果由于缺少权重而无法绘制您的网络,那么您需要增加threshold
orstepmax
以使模型适合。
此问题仅发生在neuralnet
. 我使用的其他函数,即使它们不收敛,也会在最后一步之前给你最后的权重。但是,此包仅在收敛时才释放权重。