在R的caret包中,何时使用train()函数的index和seeds参数?

6

主要问题:

阅读文档和谷歌搜索后,我仍然不清楚建议在哪些情况下预定义重采样指数是明智的,比如:

resamples <- createResample(classVector_training, times = 500, list=TRUE)

或预定义种子,例如:
seeds <- vector(mode = "list", length = 501) #length is = (n_repeats*nresampling)+1
for(i in 1:501) seeds[[i]]<- sample.int(n=1000, 1) 

我的计划是使用doParallel包并行处理来训练多个可重复的模型。由于已经设置了种子,预定义重新采样是否不必要?我需要像上面那样预定义种子而不是在trainControl对象中设置seeds=NULL,因为我打算使用并行处理吗?有没有理由预定义索引和种子,因为我至少通过搜索谷歌看到过一次?什么情况下需要使用indexOut?
附带问题:
到目前为止,我已经成功地运行了RF的train。
rfControl <- trainControl(method="oob", number = 500, p = 0.7, returnData=TRUE,   returnResamp = "all", savePredictions=TRUE, classProbs = TRUE, summaryFunction = twoClassSummary, allowParallel=TRUE)
mtryGrid <- expand.grid(mtry = 9480^0.5) #set mtry parameter to the square root of the number of variables
rfTrain <- train(x = training, y = classVector_training, method = "rf", trControl = rfControl, tuneGrid = mtryGrid)

但是当我尝试使用方法为“baruta”的train()运行时:

borutaControl <- trainControl(method="bootstrap", number = 500, p = 0.7, returnData=TRUE, returnResamp = "all", savePredictions=TRUE, classProbs = TRUE, summaryFunction = twoClassSummary, allowParallel=TRUE)
borutaTrain <- train(x = training, y = classVector_training, method = "Boruta", trControl = borutaControl, tuneGrid = mtryGrid)

我最终得到了以下错误:

Error in names(trControl$indexOut) <- prettySeq(trControl$indexOut) : 'names' attribute [1] must be the same length as the vector [0]

有人知道为什么吗?

1
SO的霸主们更希望我们使用标签R-caret - topepo
也许可以使用 floor(9480^0.5) 得到一个整数。 - topepo
1个回答

9
这里使用了几个不同的随机数种子,因此我将尽可能明确哪些是种子。

由于种子已经设置,预定义重采样是否是不必要的?

如果您没有提供自己的重采样索引,那么trainrfesbfgafssafs会首先创建它们。因此,在调用这些函数之前设置总体种子可以控制创建重采样的随机性。因此,如果您事先设置了主要种子,则可以多次调用这些函数并使用相同的样本:
set.seed(2346)
mod1 <- train(y ~ x, data = dat, method = "a", ...)

set.seed(2346)
mod2 <- train(y ~ x, data = dat, method = "b", ...)

set.seed(2346)
mod3 <- rfe(x, y, ...)

如果您愿意,可以使用createResamplescreateFolds并将其提供给trainControlindex参数。还有一件事情需要注意:如果缺少indexOut,则保留样本将被定义为未用于训练模型的任何样本。在某些情况下,这是不好的(请参阅下面的例外情况),这就是为什么存在indexOut的原因。

我是否需要像上面那样预定义种子,而不是在trainControl对象中设置seeds=NULL,因为我打算使用并行处理?

那就是主要目的。当工作进程启动时,在模型拟合之前无法控制随机性,直到我们添加seeds参数。您不必使用它,但它会导致可重现的模型。
请注意,与重复取样一样,如果没有提供种子,则train将为您创建种子。它们在train对象的control$seeds元素中找到。
请注意,trainControl(seeds)与创建重复抽样没有任何关系。

有没有理由同时预定义索引和种子,因为我通过搜索谷歌至少看到过这样做的情况?

如果您想预定义重复抽样并控制构建模型的工作进程中的任何潜在随机性,那么是的。

有什么理由使用indexOut?

总会有特殊情况。它存在的原因是针对时间序列数据,其中你可能有不涉及传递给train的所有样本的数据拆分(这是上面提到的例外情况)。请参见此图形中的空白处。 tl/dr
  • trainControl(seeds)仅仅控制模型拟合的随机性
  • 在调用train之前设置种子是控制数据拆分随机性的一种方法
Max

小问题,但我认为你想输入的是 set.seed 而不是 set.sedd。除非有一个我之前没听说过的调用... - rucker

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