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

时间:2012-05-08 12:19:16

标签: r r-caret

我正在使用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   

2 个答案:

答案 0 :(得分:10)

我总是发现插入符号中的函数既有用又有些令人发狂。这是正在发生的事情。

您试图通过earth参数将参数传递给... traintrain的文档包含该参数的描述:

  

传递给分类或回归例程的参数(例如   随机森林)。如果调整参数的值是,则会发生错误   过了这里。

调整参数,是吗?好吧,如果向下滚动并检查每种模型类型的正式调整参数列表,您会看到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)

我发现了怎么做,约兰带领我走向了正确的方向:

创建一个生成训练网格的新功能。此函数必须接受两个参数lendata。要检索原始培训网格,您可以调用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)