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 中的功能既有用又有些令人抓狂。这是发生了什么。
您正试图通过 ...
参数将参数传递给 earth
到 train
。 train
的文档包含该参数的描述:
传递给分类或回归例程的参数(例如 随机森林)。如果调整参数的值是 通过这里。
调整参数,嗯?好吧,如果您向下滚动并查看每种模型类型的调优参数的官方列表,您会看到 earth
的它们是 degree
和 nprune
。
所以这里的问题是train
旨在自动沿着调整参数进行一些网格搜索,而...
参数将用于将更多参数传递给模型拟合函数except对于那些调整参数。
如果要设置调整参数,则需要使用其他参数,如下所示:
train(Volume~Girth+Height, data=trees, method='earth',
tuneGrid = data.frame(.degree = 1,.nprune = 5))
请注意如何使用前导句点命名列。此外,令人沮丧的是,由于earth
中nprune
的默认值是NULL
,我不确定您是否只能通过这种方式传递默认值。 (一般来说,在数据框中设置NULL
会简单地删除它们。)
【讨论】:
感谢您的解决方案。问题是:如何将“nprune”保持为其默认值?我在源代码中查找并发现默认值是使用私有(不可调用)函数marsSeq
计算的,因此它不是固定值。正如你所说,你不能忽略它。
在下面查看我的回答,它为我(和你的)问题提供了解决方案。
参数名前面的点真的有必要吗?对我来说,不管有没有它都可以。【参考方案2】:
我找到了方法,joran 引导我走向正确的方向:
创建一个生成训练网格的新函数。这个函数必须接受len
和data
这两个参数。为了检索原始训练网格,您可以调用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
中的len
和tuneLength
(train
的参数)之间的联系是什么吗?另外,为什么createGrid
需要接收某些模型的数据? (?createGrid
对此不多说)
请提出一个新问题,我很乐意为您提供帮助
感谢 theomega:这是我的问题:***.com/questions/14839730/…。我仍然缺少澄清tuneLength
和createGrid
中的 len 参数之间的联系的答案,例如它们可以一起使用吗?他们是什么关系?以上是关于caret::train:指定模型生成参数的主要内容,如果未能解决你的问题,请参考以下文章
运行 caret::train() 以开发 kknn 模型时的性能预期
R:glmnet 的 caret::train 函数可以在固定的 alpha 和 lambda 交叉验证 AUC 吗?
Caret train 方法抱怨出问题了;缺少所有 RMSE 度量值