Em circunflexo, qual é a diferença real entre cv e repeatcv?

26

Isso é semelhante à pergunta dos métodos de re-amostragem da Caret , embora isso nunca tenha respondido a essa parte da pergunta de maneira acordada.

A função de trem do cursor oferece cve repeatedcv. Qual é a diferença em dizer fazendo:

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

vs

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

Entendo cvquebras o conjunto em dobras k (parâmetro number) e, em seguida, recomeça e executa os parâmetros repeatsvárias vezes.

A única coisa que eu conseguia pensar é que talvez regular cvcom repeatsos mesmos índices exatos para as dobras de cada vez? essencialmente executando as cvmesmas dobras exatas de cada vez, vs talvez repeatedcvselecione novas dobras a cada vez?

Alguém pode esclarecer?

Brian Feeny
fonte
Gostaria de saber que existem mais alguns métodos também ... preciso de algum entendimento básico de cada um, existe algum lugar em que eu possa encontrar isso? obrigado.
Manoj Kumar
Na criação de dobras múltiplas, o código itera várias vezes (fornecido por repetições na Control()sintaxe de trem em R) para cada uma das k dobras cruzadas (fornecidas pelo número). Na dobra cruzada, enquanto estiver usando o CV, é um processo único em cada uma das dobras (definido usando números no trem control()).
Nitesh Jindal

Respostas:

29

De acordo com o manual de interpolação, página 22 , o parâmetro repeatsse aplica somente quando methodestá definido como repeatedcv, portanto, nenhuma repetição é executada quando methodestá definido como cv. Portanto, a diferença entre os dois métodos é de fato que se repeatedcvrepete e cvnão.


Além disso: repetir uma validação cruzada com exatamente a mesma divisão resultará exatamente no mesmo resultado para cada repetição (assumindo que o modelo seja treinado de maneira determinística), o que não é apenas ineficiente, mas também perigoso quando se trata de comparar os resultados da validação para diferentes algoritmos de modelo de maneira estatística. Portanto, esteja ciente disso se precisar programar uma validação por conta própria.

Steffen
fonte
@BrianFeeny feliz em ajudar. Se a resposta foi satisfatória, considere clicar na marca de seleção abaixo do botão de votação para cima / para baixo. Veja as perguntas freqüentes sobre como fazer perguntas para obter detalhes :)
steffen
link quebrado, agora é cran.r-project.org/web/packages/caret/vignettes/caret.pdf também, está na página 4 agora. basta procurar por '
repeatcv
3

O código real por trás desses parâmetros pode ser encontrado nos arquivos de origem selectByFilter.Re createDataPartition.R(anteriormente createFolds.R) na pasta `caret / R / 'do pacote.

Veja esses arquivos, por exemplo, aqui e aqui (cuidado: esses links permanentes podem eventualmente apontar para uma versão mais antiga do código). Por conveniência, os trechos relevantes (a partir da versão 6.0-78 c. Nov 2017) são mostrados abaixo

Em selectByFilter.R c. linha 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))
...

Em createDataPartition.R c. linha 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
}
user3466398
fonte
dê uma olhada em suas funções .... github.com/tonglu/caret/blob/master/pkg/caret/R/…
user3466398
7
Poderia, por favor, dar mais contexto na sua resposta? Os links são bons, mas tentamos evitar respostas que não sejam independentes - os links podem desaparecer.
Glen_b -Reinstate Monica