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

Posted

技术标签:

【中文标题】caret::train:指定模型生成参数【英文标题】:caret::train: specify model-generation-parameters 【发布时间】:2012-05-16 22:17:21 【问题描述】:

我在 R 中使用 caret 库进行模型生成。我想生成一个 earth(又名 MARS)模型,并且我想为此模型生成指定 degree 参数。根据documentation(第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   

【问题讨论】:

【参考方案1】:

我一直发现 caret 中的功能既有用又有些令人抓狂。这是发生了什么。

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

传递给分类或回归例程的参数(例如 随机森林)。如果调整参数的值是 通过这里。

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

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

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

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

请注意如何使用前导句点命名列。此外,令人沮丧的是,由于earthnprune 的默认值是NULL,我不确定您是否只能通过这种方式传递默认值。 (一般来说,在数据框中设置NULL 会简单地删除它们。)

【讨论】:

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

我找到了方法,joran 引导我走向正确的方向:

创建一个生成训练网格的新函数。这个函数必须接受lendata这两个参数。为了检索原始训练网格,您可以调用caret 包提供的createGrid 方法。然后,您可以根据需要修改网格。例如,要保持 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)

【讨论】:

谢谢@theomega。这很有帮助。你知道createGrid中的lentuneLengthtrain的参数)之间的联系是什么吗?另外,为什么createGrid 需要接收某些模型的数据? (?createGrid对此不多说) 请提出一个新问题,我很乐意为您提供帮助 感谢 theomega:这是我的问题:***.com/questions/14839730/…。我仍然缺少澄清tuneLengthcreateGrid 中的 len 参数之间的联系的答案,例如它们可以一起使用吗?他们是什么关系?

以上是关于caret::train:指定模型生成参数的主要内容,如果未能解决你的问题,请参考以下文章

运行 caret::train() 以开发 kknn 模型时的性能预期

R:glmnet 的 caret::train 函数可以在固定的 alpha 和 lambda 交叉验证 AUC 吗?

Caret train 方法抱怨出问题了;缺少所有 RMSE 度量值

在 R 中使用插入符号训练模型的时机

R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法

R - Caret train()“错误:停止”,“并非在新数据中找到的对象中使用的所有变量名称”