何时在R中的插入符包中使用train()的索引和种子参数

时间:2015-01-15 18:45:12

标签: r parallel-processing machine-learning data-mining r-caret

主要问题:

在阅读文档和谷歌搜索后,我仍然难以确定预先定义重采样指数的情况,例如:

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运行良好的火车:

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)

但是当我尝试使用method =“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 个答案:

答案 0 :(得分:6)

这里使用了几个不同的随机数,所以我会尝试具体说明哪些种子。

  

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

如果您不提供自己的重新采样索引,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,并将这些内容提交给trainControl index参数。

关于此的另一个注意事项:如果缺少indexOut,则保留定义为不使用任何样本来训练模型。有些情况很糟糕(参见下面的例外情况),这就是indexOut存在的原因。

  

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

这是主要意图。当工作进程启动时,在添加seeds参数之前无法控制模型拟合内的随机性。您不必使用它,但它将导致可重现的模型。

请注意,与重新采样一样,如果您不提供种子,train会为您创建种子。它们位于control$seeds对象的train元素中。

请注意,trainControl(seeds)与创建重新采样无关。

  

有没有理由预先定义索引和种子,因为我通过搜索谷歌至少看过一次?

如果要预先定义重新采样并控制构建模型的工作进程中的任何潜在随机性,则为是。

  

使用indexOut的原因是什么?

总有专门的情况。它存在的原因是time series data您可能有数据拆分,不涉及传递给train的所有样本(这是上面提到的例外)。查看this graphic中的空白区域。

<强> TL / DR

  • trainControl(seeds) 控制模型的随机性
  • 在调用train之前设置种子是控制数据拆分随机性的一种方法

最高