Was ist der wahre Unterschied zwischen cv und repeatcv?

26

Dies ähnelt den Caret-Methoden für die erneute Stichprobe , obwohl dieser Teil der Frage dadurch nie auf eine vereinbarte Weise beantwortet wurde.

caret's zug funktion bietet cvund repeatedcv. Was ist der Unterschied, wenn man sagt:

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

vs

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

Ich verstehe, cvbricht die Menge in k-Falten (Parameter number) und startet dann neu und führt es Parameter repeatsAnzahl von Malen aus.

Das einzige, woran ich denken könnte, ist, dass vielleicht regelmäßig cvmit repeatsjedem Mal die gleichen exakten Indizes für die Falten verwendet werden? Im Grunde genommen läuft das cvjedes Mal auf den gleichen exakten Falten, vs repeatedcvwählt vielleicht jedes Mal neue Falten aus?

Kann das jemand klären?

Brian Feeny
quelle
Ich frage mich, ob es noch weitere Methoden gibt. Benötigen Sie ein grundlegendes Verständnis für jede Methode? Gibt es irgendwo eine Möglichkeit, das zu finden? Vielen Dank.
Manoj Kumar
Beim Erstellen einer Mehrfachfalte wird der Code Control()für jede der k Kreuzfalten (angegeben durch die Zahl) mehrmals durchlaufen (angegeben durch Wiederholungen in der Zugsyntax in R). Bei der Kreuzfaltung mit CV handelt es sich bei jeder Faltung um einen einmaligen Vorgang (der durch die Verwendung von Zahlen in der Reihe festgelegt wird control()).
Nitesh Jindal

Antworten:

29

Gemäß dem Caret-Handbuch, Seite 22 , gilt der Parameter repeatsnur, wenn auf eingestellt methodist. Daher repeatedcvwird keine Wiederholung durchgeführt, wenn auf methodeingestellt ist cv. Der Unterschied zwischen beiden Methoden besteht also in der Tat darin, dass sie sich repeatedcvwiederholen und cvnicht wiederholen .


Übrigens: Wenn Sie eine Kreuzvalidierung mit genau derselben Aufteilung wiederholen, erhalten Sie für jede Wiederholung genau dasselbe Ergebnis (vorausgesetzt, das Modell ist deterministisch trainiert), was nicht nur ineffizient ist, sondern auch gefährlich, wenn Sie die Validierungsergebnisse für vergleichen verschiedene Modellalgorithmen auf statistische Weise. Seien Sie sich dessen bewusst, wenn Sie jemals selbst eine Validierung programmieren müssen.

steffen
quelle
@ BrianFeeny froh zu helfen. Wenn die Antwort zufriedenstellend war, klicken Sie bitte auf das Häkchen unter der Schaltfläche "Stimmen hoch / runter". Weitere Informationen finden Sie in den häufig gestellten Fragen (FAQ) :)
steffen
defekter link, jetzt ist es auch cran.r-project.org/web/packages/caret/vignettes/caret.pdf , jetzt ist es auf seite 4 Suche einfach nach '
repeatcv
3

Der eigentliche Code hinter diesen Parametern befindet sich in den Quelldateien selectByFilter.Rund createDataPartition.R(früher createFolds.R) im Ordner "caret / R /" des Pakets.

Sehen Sie sich diese Dateien zum Beispiel hier und hier an (beachten Sie, dass diese Permalinks möglicherweise auf eine ältere Version des Codes verweisen). Der Einfachheit halber werden nachfolgend die relevanten Snippets (ab Version 6.0-78 ab Nov 2017) angezeigt

In selectByFilter.R c. Linie 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. Linie 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
quelle
werfen Sie einen Blick auf ihre Funktionen .... github.com/tonglu/caret/blob/master/pkg/caret/R/…
user3466398
7
Könnten Sie bitte in Ihrer Antwort mehr Kontext angeben? Links sind gut, aber wir versuchen, Antworten zu vermeiden, die nicht für sich allein stehen - Links können verschwinden.
Glen_b