Dans caret quelle est la vraie différence entre cv et cv répété?

26

Ceci est similaire à la question des méthodes de rééchantillonnage de Caret , bien que cela n'ait jamais vraiment répondu à cette partie de la question d'une manière convenue.

la fonction train de caret offre cvet repeatedcv. Quelle est la différence de dire faire:

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

contre

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

Je comprends cvdivise l'ensemble en k-folds (paramètre number), puis recommence et exécute les paramètres repeatsplusieurs fois.

La seule chose à laquelle je pouvais penser, c'est que peut-être régulier cvavec repeatsles mêmes index exacts pour les plis à chaque fois? exécutant essentiellement cvles mêmes plis exacts à chaque fois, vs repeatedcvsélectionne peut-être de nouveaux plis à chaque fois?

Quelqu'un peut-il clarifier?

Brian Feeny
la source
Je me demande s'il y a aussi d'autres méthodes .. besoin d'une compréhension de base de chacune, est-ce que je pourrais trouver ça? Merci.
Manoj Kumar
Dans la création de plis multiples, le code itère plusieurs fois (donné par des répétitions dans la Control()syntaxe du train dans R) pour chacun des k plis croisés (donné par un nombre). Dans le pli croisé, lors de l'utilisation de CV, il s'agit d'un processus unique sur chacun des plis (défini en utilisant des nombres dans le train control()).
Nitesh Jindal

Réponses:

29

Selon le manuel du curseur, page 22 , le paramètre repeatsne s'applique que lorsque le methodest défini sur repeatedcv, donc aucune répétition n'est effectuée lorsque le methodest défini sur cv. Donc, la différence entre les deux méthodes est en effet que cela se repeatedcvrépète et cvnon.


En plus: répéter une validation croisée avec exactement le même fractionnement donnera exactement le même résultat pour chaque répétition (en supposant que le modèle est formé de manière déterministe), ce qui est non seulement inefficace, mais aussi dangereux lorsqu'il s'agit de comparer les résultats de validation pour différents algorithmes de modèle de manière statistique. Soyez donc conscient de cela si vous devez programmer une validation vous-même.

steffen
la source
@BrianFeeny heureux de vous aider. Si la réponse est satisfaisante, veuillez envisager de cliquer sur la coche sous le bouton de vote haut / bas. Voir la FAQ pour poser des questions pour plus de détails :)
steffen
lien cassé, maintenant c'est cran.r-project.org/web/packages/caret/vignettes/caret.pdf aussi, c'est à la page 4 maintenant. il suffit de rechercher '
repeatcv
3

Le code réel derrière ces paramètres se trouve dans les fichiers source selectByFilter.Ret createDataPartition.R(anciennement createFolds.R) du dossier `caret / R / 'du paquet.

Voir ces fichiers par exemple ici et ici (attention, ces permaliens peuvent éventuellement pointer vers une version plus ancienne du code). Pour plus de commodité, les extraits pertinents (à partir de la version 6.0-78 c. Novembre 2017) sont présentés ci-dessous

Dans selectByFilter.R c. ligne 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))
...

Dans createDataPartition.R c. ligne 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
la source
jetez un oeil à leurs fonctions .... github.com/tonglu/caret/blob/master/pkg/caret/R/…
user3466398
7
Pourriez-vous s'il vous plaît donner plus de contexte dans votre réponse? Les liens sont bons, mais nous essayons d'éviter les réponses qui ne tiendront pas seules - les liens peuvent disparaître.
Glen_b -Reinstate Monica