我正在使用R中的caret
库来生成模型。我想生成一个earth
(又名MARS)模型,我想为此模型生成指定degree
参数。根据{{3}}(第11页),earth
方法支持此参数。
指定参数时出现以下错误消息:
> library(caret)
> data(trees)
> train(Volume~Girth+Height, data=trees, method='earth', degree=1)
Error in { :
task 1 failed - "formal argument "degree" matched by multiple actual arguments"
如何在指定degree
参数时避免此错误?
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_GB.UTF-8 LC_COLLATE=en_GB.UTF-8
[5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] earth_3.2-3 plotrix_3.4 plotmo_1.3-1 leaps_2.9 caret_5.15-023
[6] foreach_1.4.0 cluster_1.14.2 reshape_0.8.4 plyr_1.7.1 lattice_0.20-6
loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_2.15.0 grid_2.15.0 iterators_1.0.6
[5] tools_2.15.0
答案 0 :(得分:10)
我总是发现插入符号中的函数既有用又有些令人发狂。这是正在发生的事情。
您试图通过earth
参数将参数传递给...
train
。 train
的文档包含该参数的描述:
传递给分类或回归例程的参数(例如 随机森林)。如果调整参数的值是,则会发生错误 过了这里。
调整参数,是吗?好吧,如果向下滚动并检查每种模型类型的正式调整参数列表,您会看到earth
的{{1}}和degree
。
所以这里的问题是nprune
被设计为沿着调整参数自动进行一些网格搜索,而train
参数用于将更多参数传递给模型拟合函数,除了用于那些调整参数。
如果要设置调整参数,则需要使用其他参数,如:
...
注意列如何以前导句点命名。此外,令人沮丧的是,由于train(Volume~Girth+Height, data=trees, method='earth',
tuneGrid = data.frame(.degree = 1,.nprune = 5))
的{{1}}中的默认值为earth
,我不确定您是否可以通过这种方式仅传递默认值。 (通常,在数据框中将事物设置为nprune
只会删除它们。)
答案 1 :(得分:8)
我发现了怎么做,约兰带领我走向了正确的方向:
创建一个生成训练网格的新功能。此函数必须接受两个参数len
和data
。要检索原始培训网格,您可以调用createGrid
包提供的caret
方法。然后,您可以根据需要修改网格。例如,如果要保持nprune
参数不变并从1到5添加degree
,请使用以下代码:
createMARSGrid <- function(len, data) {
g = createGrid("earth", len, data)
g = expand.grid(.nprune=g$.nprune, .degree=seq(1,5))
return(g)
}
然后像这样调用它:
train(formula, data=data, method='earth', tuneGrid = createMARSGrid)