In caret qual è la vera differenza tra cv e repeatcv?


26

Ciò è simile ai metodi di ricampionamento di Caret , sebbene in realtà non abbia mai risposto a questa parte della domanda in modo concordato.

la funzione di treno del guardiano offre cve repeatedcv. Qual è la differenza nel dire di fare:

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

vs

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

Capisco che cvsuddivide l'insieme in k-folds (parametro number), quindi ricomincia da capo ed esegue i parametri il repeatsnumero di volte.

L'unica cosa che mi veniva in mente è che forse regolare cvcon repeatsusi gli stessi indici esatte per le pieghe di volta in volta? essenzialmente eseguendo le cvstesse identiche pieghe ogni volta, vs forse repeatedcvseleziona nuove pieghe ogni volta?

Qualcuno può chiarire?


Mi chiedo che ci siano anche altri metodi. Ho bisogno di una conoscenza di base di ciascuno di essi, c'è un posto dove potrei trovarlo? Grazie.
Manoj Kumar,

Nel creare multi fold, il codice scorre più volte (dato dalle ripetizioni nella Control()sintassi del treno in R) per ciascuna delle k cross fold (dato dal numero). Nella piega incrociata, durante l'utilizzo del CV, si tratta di un processo una tantum su ciascuna piega (impostato utilizzando i numeri nel treno control()).
Nitesh Jindal,

Risposte:


29

Secondo il manuale del cursore, pagina 22 , il parametro repeatssi applica solo quando methodè impostato su repeatedcv, quindi nessuna ripetizione viene eseguita quando methodè impostato su cv. Quindi la differenza tra entrambi i metodi è che si repeatedcvripete e cvnon lo fa.


A parte: ripetere una crossvalidation con esattamente la stessa suddivisione produrrà esattamente lo stesso risultato per ogni ripetizione (supponendo che il modello sia addestrato in modo deterministico), che non è solo inefficiente, ma anche pericoloso quando si tratta di confrontare i risultati della validazione per algoritmi di modelli diversi in modo statistico. Quindi sii consapevole di questo se dovessi mai programmare una validazione da solo.


@BrianFeeny felice di aiutarti. Se la risposta è stata soddisfacente, si prega di considerare di fare clic sul segno di spunta sotto il pulsante di voto su / giù. Vedi le FAQ su come porre domande per i dettagli :)
steffen

link non funzionante, ora è cran.r-project.org/web/packages/caret/vignettes/caret.pdf , ora è a pagina 4. cerca semplicemente "ripetuto"
parole per il

3

Il codice reale dietro questi parametri può essere trovato nei file sorgente ( selectByFilter.Re createDataPartition.Rprecedentemente createFolds.R) nella cartella `caret / R / 'del pacchetto.

Vedi questi file per esempio qui e qui (attenzione che questi permalink potrebbero eventualmente puntare a una versione precedente del codice). Per comodità, i frammenti rilevanti (dalla versione 6.0-78 c. Nov 2017) sono mostrati di seguito

In selectByFilter.R c. linea 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))
...

In createDataPartition.R c. linea 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
}

dai un'occhiata alle loro funzioni .... github.com/tonglu/caret/blob/master/pkg/caret/R/…
user3466398

7
Potresti dare più contesto alla tua risposta? I collegamenti sono buoni, ma cerchiamo di evitare risposte che non si reggono da sole - i collegamenti possono scomparire.
Glen_b -Restate Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.