caret::train:指定模型生成参数

7
我正在使用R语言中的caret库进行模型生成。我想生成一个earth(又名MARS)模型,并且我想要指定此模型生成的degree参数。根据文档(第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   
2个回答

12

我一直觉得 caret 包中的函数既有用又有些令人发疯。下面是问题所在。

你试图通过将参数传递给 train 函数的 ... 参数来传递参数给 earth 函数。关于该参数,train 函数的文档包含以下描述:

传递给分类或回归例程(如 randomForest)的参数。如果在此处传递调整参数的值,则会出现错误。

调整参数,嗯?好吧,如果你向下滚动并检查每种模型类型的官方调整参数列表,你会发现对于 earth 来说,它们是 degreenprune

因此,这里的问题是 train 函数旨在自动化某些格搜索以沿着调整参数进行,而 ... 参数应用于传递更多参数到模型拟合函数,但不能传递这些调整参数。

如果您想设置调整参数,您需要使用其他参数,如下所示:

train(Volume~Girth+Height, data=trees, method='earth',
      tuneGrid = data.frame(.degree = 1,.nprune = 5))

注意列名前面有点号。此外,由于earthnprune的默认值为NULL,因此仅通过这种方式传递默认值可能会让人感到沮丧。(通常在数据框中将事物设置为NULL只会将它们删除。)


1
感谢您提供的解决方案。问题是:如何将“nprune”保持为其默认值?我在源代码中查找并发现默认值是使用私有(不可调用)函数“marsSeq”计算的,因此它不是固定值。正如您所说,您不能将其省略。 - theomega
请看我的答案,它提供了一个解决方案来回答我的(和你的)问题。 - theomega
在参数名称前面加点真的有必要吗?对我来说,加或不加都可以。 - Antoine

9
我发现如何做到这一点,joran指导了我正确的方向:
创建一个新函数来生成训练网格。该函数必须接受两个参数lendata。为了检索原始的训练网格,您可以调用由caret包提供的createGrid方法。然后,您可以修改网格以满足您的需求。例如,要将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)

谢谢@theomega。这非常有帮助。您知道createGrid中的lentuneLengthtrain的参数)之间的连接是什么吗?另外,为什么createGrid需要接收某些模型的数据?(?createGrid没有提供太多信息) - Amelio Vazquez-Reina
请提出一个新问题,我很乐意帮助您。 - theomega
谢谢theomega:这是我的问题:http://stackoverflow.com/questions/14839730/caret-errors-with-creategrid-for-rf-randomforest。我仍然没有得到一个解答来澄清`tuneLength`和`createGrid`中的len参数之间的关系,例如它们可以一起使用吗?它们之间的关系是什么? - Amelio Vazquez-Reina

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