在插入符号中,cv和repeated cv之间的真正区别是什么?


26

这与问题Caret重采样方法相似,尽管它实际上从未以商定的方式回答问题的这一部分。

插入符号的火车功能提供cvrepeatedcv。说的有什么区别:

MyTrainControl=trainControl(
    method = "cv",
    number=5,
    repeats=5
)

MyTrainControl=trainControl(
   method = "repeatedcv",
   number=5,
   repeats=5
)

我知道cv将集合分解为k折(参数number),然后重新启动并运行参数repeats次数。

我能想到的唯一的事情是,也许经常cvrepeats使用相同的确切指标为每次折叠?基本上cv每次都在相同的精确折叠上运行,也许repeatedcv每次都选择新的折叠?

有人可以澄清吗?


我想知道还有更多方法..每个方法都需要一些基本的理解,我能找到任何地方吗?谢谢。
Manoj Kumar

在创建多重折叠时,代码会Control()针对k个交叉折叠(按数字给出)中的每一个进行多次迭代(由R 中火车语法的重复给出)。在交叉折叠中,使用CV时,每个折叠都是一次处理(通过使用train中的数字设置control())。
Nitesh Jindal

Answers:


29

根据插入符手册,第22页,该参数repeats仅适用于当method被设定为repeatedcv,所以当不进行重复method设定为cv。因此,这两种方法之间的差异确实是repeatedcv重复的,而cv不是重复的。


另外:以完全相同的分割重复交叉验证将为每个重复产生完全相同的结果(假设以确定性方式训练模型),这不仅效率低下,而且在比较以下情况的验证结果时也很危险统计模型中的不同模型算法。因此,如果您必须自己编写验证程序,请注意这一点。


@BrianFeeny很高兴能为您提供帮助。如果答案令人满意,请考虑单击“上/下”投票按钮下方的复选标记。有关详细信息,请参阅有关常见问题的FAQ:)
steffen 2012年

断开的链接,现在也是cran.r-project.org/web/packages/caret/vignettes/caret.pdf,现在 在第4页上。只是搜索'repeatedcv'–
wordforthewise,

3

这些后面的参数的实际代码可以在发现selectByFilter.RcreateDataPartition.R(前createFolds.R)源文件在`插入符号/ R /”包的文件夹中。

在此处此处查看这些文件(请注意,这些永久链接最终可能指向旧版本的代码)。为方便起见,相关片段(自6.0-78 c.2017年11月开始)如下所示

在selectByFilter.R c中。157行

sbf <- function (x, ...) UseMethod("sbf")
... 

"sbf.default" <-
  function(x, y,
           sbfControl = sbfControl(), ...)
  {
    ...

    if(is.null(sbfControl$index)) sbfControl$index <- switch(
      tolower(sbfControl$method),
      cv = createFolds(y, sbfControl$number, returnTrain = TRUE),
      repeatedcv = createMultiFolds(y, sbfControl$number, sbfControl$repeats),
      loocv = createFolds(y, length(y), returnTrain = TRUE),
      boot =, boot632 = createResample(y, sbfControl$number),
      test = createDataPartition(y, 1, sbfControl$p),
      lgocv = createDataPartition(y, sbfControl$number, sbfControl$p))
...

在createDataPartition.R中。第227行

createMultiFolds <- function(y, k = 10, times = 5) {
  if(class(y)[1] == "Surv") y <- y[,"time"]
  prettyNums <- paste("Rep", gsub(" ", "0", format(1:times)), sep = "")
  for(i in 1:times) {
    tmp <- createFolds(y, k = k, list = TRUE, returnTrain = TRUE)
    names(tmp) <- paste("Fold",
                        gsub(" ", "0", format(seq(along = tmp))),
                        ".",
                        prettyNums[i],
                        sep = "")
    out <- if(i == 1) tmp else c(out, tmp)

  }
  out
}


7
您能否在回答中提供更多背景信息?链接是好的,但我们会尽量避免答案不能独立存在-链接可能会消失。
Glen_b-恢复莫妮卡2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.