使用带有插入符号训练的神经网络并调整参数

use*_*207 4 r neural-network cross-validation r-caret

所以我读过一篇论文,该论文使用神经网络来模拟一个与我目前使用的数据集相似的数据集。我有 160 个描述符变量,我想为 160 个案例建模(回归建模)。我阅读的论文使用了以下参数:-

'对于每个分割,都为 10 个单独的训练测试折叠中的每一个开发了一个模型。使用具有 33 个输入神经元和 16 个隐藏神经元的三层反向传播网络,在线权重更新、0.25 学习率和 0.9 动量。对于每个折叠,从总共 50 个不同的随机初始权重起点进行学习,并且允许网络迭代学习时期,直到验证集的平均绝对误差 (MAE) 达到最小值。'

现在他们使用了一个叫做 Emergent 的专业软件来做到这一点,这是一个非常专业的神经元网络模型软件。但是,因为我之前在 R 中做过以前的模型,所以我必须坚持下去。所以我使用 caret train 函数来进行 10 次交叉验证,使用神经网络包进行 10 次。我做了以下事情:-

cadets.nn <- train(RT..seconds.~., data = cadet, method = "neuralnet", algorithm = 'backprop', learningrate = 0.25, hidden = 3, trControl = ctrl, linout = TRUE)
Run Code Online (Sandbox Code Playgroud)

我这样做是为了尝试尽可能接近论文中使用的参数来调整参数,但是我收到以下错误消息:-

  layer1 layer2 layer3 RMSE Rsquared RMSESD RsquaredSD
1      1      0      0  NaN      NaN     NA         NA
2      3      0      0  NaN      NaN     NA         NA
3      5      0      0  NaN      NaN     NA         NA
Error in train.default(x, y, weights = w, ...) : 
  final tuning parameters could not be determined
In addition: There were 50 or more warnings (use warnings() to see the first 50)
Run Code Online (Sandbox Code Playgroud)

你知道我做错了什么吗?它在我做 nnet 时工作,但我无法调整参数以使其类似于我试图模仿的论文中使用的参数。

这就是我在警告()中得到的五十次:-

1: In eval(expr, envir, enclos) :
  model fit failed for Fold01.Rep01: layer1=1, layer2=0, layer3=0 Error in neuralnet(form, data = data, hidden = nodes, ...) : 
  formal argument "hidden" matched by multiple actual arguments

2: In data.frame(..., check.names = FALSE) :
  row names were found from a short variable and have been discarded
3: In eval(expr, envir, enclos) :
  model fit failed for Fold01.Rep01: layer1=3, layer2=0, layer3=0 Error in neuralnet(form, data = data, hidden = nodes, ...) : 
  formal argument "hidden" matched by multiple actual arguments

4: In data.frame(..., check.names = FALSE) :
  row names were found from a short variable and have been discarded
5: In eval(expr, envir, enclos) :
  model fit failed for Fold01.Rep01: layer1=5, layer2=0, layer3=0 Error in neuralnet(form, data = data, hidden = nodes, ...) : 
  formal argument "hidden" matched by multiple actual arguments
Run Code Online (Sandbox Code Playgroud)

谢谢!

top*_*epo 5

trainhidden为您设置(基于layer-给出的值layer3。您试图两次指定该参数,因此:

形式参数“隐藏”与多个实际参数匹配

哈,

最大限度


Agi*_*ean 5

我认为对于初学者来说,层规范不能直接传递到训练函数中这一点并不明显。

必须非常仔细地阅读文档才能理解以下段落...Errors will occur if values for tuning parameters are passed here.

因此,首先,您必须意识到 的hidden参数neuralnet::neuralnet被定义为调整参数,因此可能不会直接传递给训练函数(通过...)。您可以通过以下方式找到调整参数定义:

getModelInfo("neuralnet")$neuralnet$parameters
  parameter   class                    label
1    layer1 numeric #Hidden Units in Layer 1
2    layer2 numeric #Hidden Units in Layer 2
3    layer3 numeric #Hidden Units in Layer 3
Run Code Online (Sandbox Code Playgroud)

相反,您必须通过参数传递隐藏层定义tuneGrid- 一点也不明显,因为这通常是为调整参数而保留的,而不是传递它们。

因此,您可以hidden按如下方式定义图层:

tune.grid.neuralnet <- expand.grid(
  layer1 = 10,
  layer2 = 10,
  layer3 = 10
)
Run Code Online (Sandbox Code Playgroud)

然后将其传递给caret::train函数调用:

  model.neuralnet.caret <- caret::train(
    formula.nps,
    data = training.set,
    method = "neuralnet",
    linear.output = TRUE, 
    tuneGrid = tune.grid.neuralnet, # cannot pass parameter hidden directly!!
    metric = "RMSE",
    trControl = trainControl(method = "none", seeds = seed)
Run Code Online (Sandbox Code Playgroud)