В сущности, какова реальная разница между cv и repeatcv?


26

Это похоже на методы повторной выборки вопроса Карета , хотя в действительности это никогда не отвечало на эту часть вопроса согласованным образом.

Функция поезда Caret предлагает cvи repeatedcv. В чем разница, скажем, делать:

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

против

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

Я понимаю, что cvразбивает множество на k-складки (параметр number), а затем запускает заново и запускает параметры repeatsнесколько раз.

Единственное, о чем я могу подумать, это то, что, может быть, регулярные cvвыражения repeatsиспользуют одинаковые точные индексы для сгибов каждый раз? по сути, cvкаждый раз выполняя одинаковые сгибы, возможно, repeatedcvкаждый раз выбирает новые сгибы?

Может кто-нибудь уточнить?


Интересно, есть еще несколько методов ... нужно понимание базового уровня каждого, есть ли где-нибудь, где я мог бы найти это? Спасибо.
Манодж Кумар

При многократном создании код повторяется несколько раз (задано повторениями в Control()синтаксисе последовательности в R) для каждого из перекрестных кратных k (заданных числом). В перекрестном сгибе, при использовании CV, это одноразовый процесс для каждого из сгибов (устанавливается с использованием чисел в поезде control()).
Нитеш Джиндал

Ответы:


29

Согласно руководству по уходу, стр. 22 , этот параметр repeatsприменяется только в том случае, если для methodнего установлено значение repeatedcv, поэтому повторение не выполняется, если для methodнего установлено значение cv. Таким образом, разница между обоими методами действительно repeatedcvповторяется, а cvне повторяется .


Кроме того, повторение перекрестной проверки с точно таким же разбиением даст абсолютно одинаковый результат для каждого повторения (при условии, что модель обучена детерминистическим образом), что не только неэффективно, но и опасно, когда речь идет о сравнении результатов проверки для различные модельные алгоритмы статистическим образом. Так что имейте это в виду, если вам когда-нибудь придется самостоятельно программировать валидацию.


@BrianFeeny рад помочь. Если ответ был удовлетворительным, пожалуйста, подумайте над тем, чтобы нажать на галочку под кнопкой «вверх / вниз». См справку по задавать вопросы для деталей :)
Штеффен

неработающая ссылка, теперь она также cran.r-project.org/web/packages/caret/vignettes/caret.pdf , теперь она на странице 4. просто ищите '
repeatcv

3

Фактический код позади этих параметров можно найти в selectByFilter.Rи createDataPartition.R(ранее createFolds.R) исходных файлов в `/ R каретки /» папку пакета.

Смотрите эти файлы, например, здесь и здесь (будьте осторожны, эти постоянные ссылки могут в конечном итоге указывать на более старую версию кода). Для удобства ниже приведены соответствующие фрагменты (начиная с версии 6.0-78 c. Nov 2017).

В 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 c. линия 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
}

посмотрим на их функции .... github.com/tonglu/caret/blob/master/pkg/caret/R/...
user3466398

7
Не могли бы вы дать больше контекста в своем ответе? Ссылки хороши, но мы стараемся избегать ответов, которые не стоят сами по себе - ссылки могут исчезнуть.
Glen_b
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.