En caret, ¿cuál es la diferencia real entre cv y repetido cv?

26

Esto es similar a los métodos de muestreo de Caret , aunque eso realmente nunca respondió a esta parte de la pregunta de una manera acordada.

la función de tren de caret ofrece cvy repeatedcv. ¿Cuál es la diferencia en decir haciendo:

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

vs

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

Entiendo que cvdivide el conjunto en k-pliegues (parámetro number), y luego comienza de nuevo y ejecuta sus parámetros repeatsvarias veces.

Lo único que se me ocurre es que, ¿puede ser regular cvcon repeatslos mismos índices exactos para los pliegues cada vez? esencialmente ejecutando los cvmismos pliegues exactos cada vez, ¿vs quizás repeatedcvselecciona nuevos pliegues cada vez?

¿Alguien puede aclarar?

Brian Feeny
fuente
Me pregunto que también hay algunos métodos más ... necesito un nivel básico de comprensión de cada uno, ¿hay algún lugar donde pueda encontrar eso? Gracias.
Manoj Kumar
En crear pliegue múltiple, el código itera varias veces (dado por repeticiones en la Control()sintaxis del tren en R) para cada uno de los k pliegues cruzados (dado por número). En el pliegue cruzado, mientras se usa CV, es un proceso de una sola vez en cada pliegue (establecido usando números en el tren control()).
Nitesh Jindal

Respuestas:

29

Según el manual de caret, página 22 , el parámetro repeatssolo se aplica cuando methodse establece en repeatedcv, por lo que no se realiza ninguna repetición cuando methodse establece en cv. Entonces, la diferencia entre ambos métodos es que se repeatedcvrepite y cvno.


Aparte: repetir una validación cruzada con exactamente la misma división producirá exactamente el mismo resultado para cada repetición (suponiendo que el modelo esté entrenado de manera determinista), lo que no solo es ineficiente, sino también peligroso cuando se trata de comparar los resultados de validación para diferentes algoritmos modelo de manera estadística. Así que tenga en cuenta esto si alguna vez tiene que programar una validación usted mismo.

steffen
fuente
@BrianFeeny encantado de ayudar. Si la respuesta fue satisfactoria, considere hacer clic en la marca de verificación debajo del botón votar arriba / abajo. Consulte las preguntas frecuentes sobre cómo hacer preguntas para obtener más detalles :)
steffen
enlace roto, ahora es cran.r-project.org/web/packages/caret/vignettes/caret.pdf también, ahora está en la página 4. solo busque 'repetidocv'
wordsforthewise
3

El código real detrás de estos parámetros se puede encontrar en los archivos fuente selectByFilter.Ry createDataPartition.R(anteriormente createFolds.R) en la carpeta `caret / R / 'del paquete.

Vea estos archivos, por ejemplo, aquí y aquí (tenga en cuenta que estos enlaces permanentes pueden apuntar a una versión anterior del código). Para mayor comodidad, se muestran a continuación los fragmentos relevantes (a partir de la versión 6.0-78 c. Nov. 2017)

En selectByFilter.R c. línea 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))
...

En createDataPartition.R c. línea 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
}
usuario3466398
fuente
eche un vistazo a sus funciones .... github.com/tonglu/caret/blob/master/pkg/caret/R/…
user3466398
77
¿Podría dar más contexto en su respuesta? Los enlaces son buenos, pero tratamos de evitar respuestas que no se sostienen por sí solas: los enlaces pueden desaparecer.
Glen_b -Reinstate Monica