我想使用软件包neuralnet
和caret
对神经网络进行交叉验证。
可以从this post复制数据df
。
运行neuralnet()
函数时,有一个名为hidden
的参数,您可以在其中设置隐藏的层和神经元。假设我想要2个分别具有3和2个神经元的隐藏层。它将被写为hidden = c(3, 2)
。
但是,由于我想对其进行交叉验证,因此我决定使用出色的caret
软件包。但是当使用函数train()
时,我不知道如何设置层数和神经元。
有人知道我可以在哪里添加这些数字吗?
这是我运行的代码:
nn <- caret::train(DC1 ~ ., data=df,
method = "neuralnet",
#tuneGrid = tune.grid.neuralnet,
metric = "RMSE",
trControl = trainControl (
method = "cv", number = 10,
verboseIter = TRUE
))
顺便说一下,我在前面的代码中收到了一些警告:
predictions failed for Fold01: layer1=3, layer2=0, layer3=0 Error in cbind(1, pred) %*% weights[[num_hidden_layers + 1]] :
requires numeric/complex matrix/vector arguments
关于如何解决它的想法?
答案 0 :(得分:1)
在尖号中使用神经网络模型以指定三个受支持层中每个层中的隐藏单位数时,可以使用参数layer1
,layer2
和layer3
。我通过检查source来发现的。
library(caret)
grid <- expand.grid(layer1 = c(32, 16),
layer2 = c(32, 16),
layer3 = 8)
BostonHousing数据的用例:
library(mlbench)
data(BostonHousing)
仅需为示例选择数字列即可使它变得简单:
BostonHousing[,sapply(BostonHousing, is.numeric)] -> df
nn <- train(medv ~ .,
data = df,
method = "neuralnet",
tuneGrid = grid,
metric = "RMSE",
preProc = c("center", "scale", "nzv"), #good idea to do this with neural nets - your error is due to non scaled data
trControl = trainControl(
method = "cv",
number = 5,
verboseIter = TRUE)
)
零件
preProc = c("center", "scale", "nzv")
对于算法收敛至关重要,神经网络不喜欢未缩放的特征
它超级慢。
nn
#output
Neural Network
506 samples
12 predictor
Pre-processing: centered (12), scaled (12)
Resampling: Cross-Validated (5 fold)
Summary of sample sizes: 405, 404, 404, 405, 406
Resampling results across tuning parameters:
layer1 layer2 RMSE Rsquared MAE
16 16 NaN NaN NaN
16 32 4.177368 0.8113711 2.978918
32 16 3.978955 0.8275479 2.822114
32 32 3.923646 0.8266605 2.783526
Tuning parameter 'layer3' was held constant at a value of 8
RMSE was used to select the optimal model using the smallest value.
The final values used for the model were layer1 = 32, layer2 = 32 and layer3 = 8.