首页 文章

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

提问于
浏览
3

主要问题:

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

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 回答

  • 6

    这里使用了几个不同的随机数,因此我将尝试具体说明哪些种子 .

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

    如果您不提供自己的重采样索引, trainrfesbfgafssafs 的第一件事就是创建它们 . 因此,在调用这些控件之前, setting the overall seed 控制创建重新采样的随机性 . 因此,您可以重复调用这些函数,并使用预先设置主种子的相同样本:

    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的原因是什么?

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

    tl/dr

    • trainControl(seeds) only 控制模型拟合的随机性

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

    马克斯

相关问题