使用 caret train 和调整参数的神经网络(neuralnet)

5

我读了一篇论文,它使用神经网络对一个与我当前使用的数据集类似的数据集进行建模。我有160个描述变量要为160个案例建模(回归建模)。我读的论文使用了以下参数:

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

现在他们使用了一个专门的软件Emergent来完成此操作,这是一种非常专业的神经网络模型软件。然而,由于我之前使用过R进行模型处理,因此我必须继续使用它。所以我使用caret train函数进行十次交叉验证,使用neuralnet包。我采取了以下步骤:

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

我这样做是为了尽量调整参数使其接近论文中使用的参数,但我收到以下错误信息:-
  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)

你知道我做错了什么吗?我使用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

谢谢!


warnings() 函数中包含了什么内容? - pangia
1:在eval(expr,envir,enclos)中: Fold01.Rep01的模型拟合失败:layer1 = 1,layer2 = 0,layer3 = 0。在neuralnet(form,data = data,hidden = nodes,...)中出现错误: 形式参数“hidden”与多个实际参数匹配。2:在data.frame(...,check.names = FALSE)中: 行名称来自短变量并已被丢弃。3:在eval(expr,envir,enclos)中: Fold01.Rep01的模型拟合失败:layer1 = 3,layer2 = 0,layer3 = 0。在neuralnet(form,data = data,hidden = nodes,...)中出现错误: 形式参数“hidden”与多个实际参数匹配。 - user2062207
2个回答

5

train集为您设置了hidden(基于layer-layer3给出的值)。您试图两次指定该参数,因此出现以下错误:

多次匹配实际参数的形式参数“hidden”

希望对您有所帮助,

Max


5

我认为对于初学者来说,很不明显的是层规格不能直接传递到训练函数中。

你必须非常仔细地阅读以下关于...的说明才能理解以下内容: 如果在此处传递调整参数的值,将会出现错误。

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

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

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

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

tune.grid.neuralnet <- expand.grid(
  layer1 = 10,
  layer2 = 10,
  layer3 = 10
)

然后将其传递给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)

所以我理解你在这里用三个隐藏层来训练神经网络,每个隐藏层由10个神经元组成,对吗? - antecessor
1
是的。neuralnet库仅允许指定三层。 - Agile Bean
这非常有帮助,不仅解决了OP的问题,还为其他型号查找类似信息提供了见解。感谢@AgileBean。 - elmato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接