7

我正在使用caretR 中的库进行模型生成。我想生成一个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   
4

2 回答 2

12

我一直发现插入符号中的功能既有用又有些令人抓狂。这是正在发生的事情。

您正在尝试通过参数将earth参数传递...train. 的文档train包含该参数的此描述:

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

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

所以这里的问题是,train它旨在自动沿着调整参数进行一些网格搜索,并且该...参数将用于将更多参数传递给模型拟合函数,除了那些调整参数。

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

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

请注意如何使用前导句点命名列。此外,令人沮丧的是,由于 for 中的默认值earthnpruneNULL我不确定您是否只能以这种方式传递默认值。(通常,NULL在数据框中设置内容只会删除它们。)

于 2012-05-08T15:56:23.380 回答
9

我发现了如何做到这一点,joran 引导我走向正确的方向:

创建一个生成训练网格的新函数。此函数必须接受两个参数lendata。为了检索原始训练网格,您可以调用包createGrid提供的方法caret。然后,您可以根据需要修改网格。例如,要保持nprune参数不变并degree从 1 添加到 5,请使用以下代码:

  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)
于 2012-05-17T17:13:06.030 回答