我正在尝试编写一个测试GBM模型的一系列超参数的函数。我只想在GBM调用中改变三个参数。剩下的我想要保持静止。 do.call
似乎是答案,因为它需要一个参数列表并将它们传递给一个函数。但是,我无法判断是否有办法修复'一些我永远不想改变的论点。
parms <- list(
'interaction.depth'=1:5,
'n.trees'=c(500,1000,2000),
'shrinkage'=c(0.01, 0.005, 0.001))
res <-expand.grid(parms)
> head(res)
interaction.depth n.trees shrinkage
1 1 500 0.01
2 2 500 0.01
3 3 500 0.01
4 4 500 0.01
5 5 500 0.01
6 1 1000 0.01
然后我想将扩展网格的每一行作为参数列表传递给GBM函数,同时修复&#39;其他参数到位。类似的东西:
#pseudo-codeish
apply(res, 1, function (row) {do.call("gbm", row)})
答案 0 :(得分:1)
do.call
需要第二个参数的列表。您可以将列表与c
组合在一起。
以下表达式使用数据的第一行创建包含元素a
,b
和命名列res
的列表:
c(list(a=1, b=2), as.list(res[1,]))
您想要的apply
表达式如下所示:
apply(res, 1, function(row) do.call('gbm', c(list(a=1, b=2), as.list(row))))
答案 1 :(得分:1)
您可以使用m*ply
包中的plyr
个功能。要返回gbm
模型列表,请执行以下操作:
gbm.list <- mlply(res, gbm, formula = Y~X1+X2+X3+X4+X5+X6, data = data)
其中formula = Y~X1+X2+X3+X4+X5+X6
和data = data
是固定参数的示例。