【问题标题】:Random samples from createFolds in R来自 R 中 createFolds 的随机样本
【发布时间】:2020-02-05 13:24:48
【问题描述】:

我想将我的数据集分成 30 折。所以我使用了 R. I set.seedcaret 包中的 createFolds 函数来获得可重现的结果。

现在,我想要 20 个不同的随机样本。换句话说,20 种不同的 30 折。因此,我需要将set.seed 更改20 次。

有没有办法让这更容易。

    wdbcc=as.data.frame(scale(wdbc))
    set.seed(12345)
    k = 30
    folds <- createFolds(wdbcc$PE, k = k, list = TRUE, returnTrain = TRUE)

注意

wdbcc 是我的数据集,k 是折叠数,PE 是因变量。

EDIT1

下面我将给出一个我想要的简单示例

首先我会使用下面的set.seed

  wdbcc=as.data.frame(scale(wdbc))
    set.seed(12345)
    k = 30
    folds <- createFolds(wdbcc$PE, k = k, list = TRUE, returnTrain = TRUE)

然后,我将在折叠拆分为

上构建模型
 lm = list()
        for (i in 1:k) {
          lm[[i]] = lm(PE~ ., data = wdbcc[folds[[i]],])
        }

然后,我将使用相同的想法,但将 set.seed 更改为 (123456) 而不是 (12345),并在此基础上构建模型。

我需要用不同的 set.seed 做 20 次。每次在不同的 set.seed 上构建模型。

EDIT2

简单地说,如果我有 30 个折叠,我将在这 30 个折叠上建立线性回归,因此我将有 30 个模型结果。我需要有相同的过程,但有不同的 30 折(20 次,每 20 次我有不同的 30 折)所以,我将在 30 次不同的折叠上构建 20 次的模型。

【问题讨论】:

  • 您能否添加最小的可重现示例?此外:createFolds() 函数从何而来?据我所知,它不是 Base R。
  • @Georgery,我编辑了这个问题。

标签: r cross-validation


【解决方案1】:
folds <- replicate(20,createFolds(wdbcc$PE, k = k, list = FALSE, returnTrain = TRUE))

如果您不介意将折叠放在向量(矩阵的列)中而不是列表中。

编辑:我上面的代码已经确保了种子随机数,因为每次使用给定种子运行上述代码时,您都会得到相同的折叠(全部 20 个)。但是,如果您绝对想为每个重新采样(这是可疑的)拥有一个特定的种子,您可以执行以下操作

wdbcc=as.data.frame(scale(wdbc))
lmv = vector("list",20)
mySeed=c(1,2,3,4,5,...,20) #vector with your pre-defined seeds

for (i in 1:length(lmv)) {
    set.seed(mySeed[i])
    lmv2 = vector("list",30)
    folds <- createFolds(wdbcc$PE, k = 30, list = FALSE, returnTrain = TRUE)
    for (j in 1:length(lmv2)) {
        lmv2[[j]] = lm(PE~ ., data = wdbcc[folds!=j,])
    }
    lmv[[i]] = lmv2
}

【讨论】:

  • @ser2974951,谢谢,但我需要指定我的 set.seed,因为我的想法是使用具有不同线性回归的 20 个随机样本的每 30 倍。
  • @jeza 我不明白,你想为 20 个重采样中的每一个使用特定的 set.seeds 吗?或者您只是想要种子样本?如果是第二个,那么我的代码将实现这一目标,如果您使用特定的种子,您将始终与我的代码获得相同的结果。
  • 谢谢,但这并没有给我我需要的想法。简单地说,如果我有 30 折,我将在这 30 折上建立线性回归,因此我将有 30 个模型结果。我需要有相同的过程,但有不同的 30 次折叠(20 次,20 次中的每一次都有不同的 30 次折叠)所以,我将在 30 次不同的折叠上构建 20 次中的每次模型。
  • @jeza 如果新编辑没有回答您的问题,那么我不知道会发生什么。我已经给了你足够多的提示,你应该可以从这里得到它。
  • @jeza 你真的需要 30 组不同的折叠,还是仅仅需要 30 组不同的折叠?我问,因为为 30 组不同的折叠设置 30 种不同的种子可能不仅是不必要的,而且不再是随机的(而是伪随机的)。有关更详细的说明,请参阅此 Stata 指南,对它们的等效命令进行了很好的解释,p3“不要经常设置种子”:stata.com/manuals13/rsetseed.pdf
【解决方案2】:

createFolds 可能无法按预期工作:

folds <- replicate(20,createFolds(wdbcc$PE, k = k, list = FALSE, returnTrain = TRUE))

根据文档,仅当 list = TRUE 时才会返回火车:

returnTrain 一个合乎逻辑的。如果为 true,则返回的值是与训练期间使用的数据相对应的样本位置。 此参数仅与 list = TRUE 一起使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-27
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多