Verwendung der k-fachen Kreuzvalidierung für die Auswahl von Zeitreihenmodellen


70

Frage: Ich möchte sicher sein, ob die Verwendung der k-fachen Kreuzvalidierung mit Zeitreihen unkompliziert ist oder ob man vor der Verwendung besondere Aufmerksamkeit schenken muss.

Hintergrund: Ich modelliere eine 6-Jahres-Zeitreihe (mit Semi-Markov-Kette) mit einer Datenerfassung alle 5 Minuten. Um mehrere Modelle zu vergleichen, verwende ich eine 6-fache Kreuzvalidierung, indem ich die Daten in 6 Jahre trenne, sodass meine Trainingssätze (zur Berechnung der Parameter) eine Länge von 5 Jahren und die Testsätze eine Länge von 1 haben Jahr. Da ich die Zeitreihenfolge nicht berücksichtige, sind meine verschiedenen Sets:

  • Falte 1: Training [1 2 3 4 5], Test [6]
  • Falte 2: Training [1 2 3 4 6], Test [5]
  • Falte 3: Training [1 2 3 5 6], Test [4]
  • Falte 4: Training [1 2 4 5 6], Test [3]
  • Falte 5: Training [1 3 4 5 6], Test [2]
  • Falte 6: Training [2 3 4 5 6], Test [1].

Ich gehe davon aus, dass jedes Jahr unabhängig voneinander sind. Wie kann ich das überprüfen? Gibt es Hinweise auf die Anwendbarkeit der k-fachen Kreuzvalidierung mit Zeitreihen?


Schauen Sie sich diesen Artikel an, den ich helfend fand francescopochetti.com/…
Henok S Mengistu

Antworten:


69

Zeitreihen (oder andere in sich geordnete Daten) können für die Kreuzvalidierung problematisch sein. Wenn ein Muster in Jahr 3 auftaucht und für die Jahre 4 bis 6 erhalten bleibt, kann Ihr Modell es aufgreifen, obwohl es nicht Teil der Jahre 1 und 2 war.

Ein Ansatz, der für Zeitreihen mitunter mehr Prinzipien verfolgt, ist die Vorwärtsverkettung, bei der Sie folgendermaßen vorgehen würden:

  • Falte 1: Training [1], Test [2]
  • Falte 2: Training [1 2], Test [3]
  • Fold 3: Training [1 2 3], Test [4]
  • Falte 4: Training [1 2 3 4], Test [5]
  • Falte 5: Training [1 2 3 4 5], Test [6]

Dadurch wird die Situation, die Sie zum Vorhersagezeitpunkt sehen, genauer modelliert, wobei Sie frühere Daten und zukunftsgerichtete Daten als Vorhersagen verwenden. Es vermittelt Ihnen auch ein Gefühl für die Abhängigkeit Ihrer Modellierung von der Datengröße.


1
Vielen Dank. Ich verstehe, wie Zach sagte, es ist der kanonische Weg, es zu tun. Und ich verstehe warum. Das Problem, das ich damit habe, ist genau die Tatsache, dass es die Variation der Datengröße berücksichtigt, sodass ich nicht den "wahren" Generalisierungsfehler meines Modells erhalte. Aber ein gemischter Fehler: Verallgemeinerung und Datengröße. Kennen Sie andere Referenzen (außer M.Hyndman), die sich mit der Kreuzvalidierung in Zeitreihen befassen? Versteht mich nicht falsch, es ist nicht so, dass ich nicht vertraue, was Sie sagen, und was M. Hyndman sagt, es macht vollkommen Sinn. Ich möchte einfach mehrere Standpunkte zu einem Problem haben
Mickaël S

Ich fürchte, ich kenne eine solche Referenz nicht, aber ich würde gerne eine sehen, wenn jemand anderes eine kennt.
Ken Williams

1
@ Wayne, ich meine, dass diese Lösung immer mehr Jahre an Trainingsdaten verwendet. In meinen Daten gibt es definitiv Unterschiede zwischen den Jahren, aber keine offensichtliche Tendenz oder Seetüchtigkeit.
Mickaël S

3
@ Mickael: Du könntest Fold 1 verwenden: trainiere [1 2] test [3]; Falte 2: Zug [2 3] Test [4]; Fold 3: Trainiere [3 4], teste [5] usw., wenn du dir Sorgen machst, mit jedem Fold mehr und mehr Daten zu verwenden. Ich vermute, dass man mit einer Semi-MC-Technik die Jahre nicht wirklich durcheinander bringen kann, selbst wenn es keinen Trend gibt.
Wayne

3
@ MickaëlS: Ich fand dieses Papier sciencedirect.com/science/article/pii/S0020025511006773 und dachte, es könnte von Interesse sein. Sie vergleichen diesen "kanonischen" Ansatz mit zwei anderen Methoden - einem "Block Boostrap" - und einem "weglassungsabhängigen" Ansatz.
Thebigdog

26

Die Methode, die ich zur Kreuzvalidierung meines Zeitreihenmodells verwende, ist die rollierende Kreuzvalidierung. Beginnen Sie mit einer kleinen Datenmenge für Trainingszwecke, prognostizieren Sie sie für die späteren Datenpunkte und überprüfen Sie dann die Genauigkeit für die prognostizierten Datenpunkte. Die gleichen prognostizierten Datenpunkte werden dann als Teil des nächsten Trainingsdatensatzes einbezogen und nachfolgende Datenpunkte werden prognostiziert.

Um die Dinge intuitiv zu machen, hier ein Bild dafür:

Bildbeschreibung hier eingeben

Ein äquivalenter R-Code wäre:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

  pred_ets <- rbind(pred_ets, data.frame(forecast(ets(ts), 3)$mean[1:3]))
	  pred_arima <- rbind(pred_arima, data.frame(forecast(auto.arima(ts), 3)$mean[1:3]))

  i = i + 3
}
names(pred_arima) <- "arima"
names(pred_ets) <- "ets"

pred_ets <- ts(pred_ets$ets, start=c(2005, 01), frequency = 12)
	pred_arima <- ts(pred_arima$arima, start=c(2005, 01), frequency =12)

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)

Gibt es eine Möglichkeit, dies für Methoden wie die logistische Regression mit R zu tun?
Hlyates

1
@hlyates, Nach meinem Verständnis ist es möglich, dass Sie den obigen Code nur ein wenig ändern müssen. Beziehen Sie pred_lr (Vorhersagen durch logistische Regression) ein und ändern Sie den Namen der Spalten entsprechend.
Jatin Garg

22

Die "kanonische" Möglichkeit, eine zeitreihenübergreifende Validierung durchzuführen (zumindest wie von @Rob Hyndman beschrieben), besteht darin, den Datensatz zu "durchlaufen".

dh:

  • Falte 1: Training [1], Test [2]
  • Falte 2: Training [1 2], Test [3]
  • Fold 3: Training [1 2 3], Test [4]
  • Falte 4: Training [1 2 3 4], Test [5]
  • Falte 5: Training [1 2 3 4 5], Test [6]

Grundsätzlich sollte Ihr Trainingssatz keine Informationen enthalten, die nach dem Testsatz auftreten.


13

ARIMA(p,d,q)d>0d

Damit die Kreuzvalidierung als Modellauswahl-Tool funktioniert, benötigen Sie eine ungefähre Unabhängigkeit zwischen dem Training und den Testdaten. Das Problem bei Zeitreihendaten besteht darin, dass benachbarte Datenpunkte häufig stark abhängig sind, sodass die standardmäßige Kreuzvalidierung fehlschlägt. Hier Abhilfe schaffen Sie, indem Sie zu beiden Seiten des Prüflings eine Lücke zwischen Prüfling und Trainingsmuster lassen . Der Grund, warum Sie auch eine Lücke vor dem Prüfling auslassen müssen, ist, dass die Abhängigkeit symmetrisch ist, wenn Sie sich zeitlich vorwärts oder rückwärts bewegen (denken Sie an die Korrelation).

hvvh

  • Falte 1: Training [1 2 3 4 5h], Test [6]
  • Fold 2: Training [1 2 3 4h h6], Test [5]
  • Fold 3: Training [1 2 3h h5 6], Test [4]
  • Falte 4: Training [1 2h h4 5 6], Test [3]
  • Falte 5: Training [1h h3 4 5 6], Test [2]
  • Fold 6: Training [h2 3 4 5 6], Test [1]

Wo das h anzeigt, dass h Beobachtungen der Trainingsprobe auf dieser Seite gelöscht werden.


3

Wie von @thebigdog kommentiert, "Zur Verwendung der Kreuzvalidierung für die Bewertung von Zeitreihenprädiktoren" von Bergmeir et al. Erläutert die Kreuzvalidierung im Kontext stationärer Zeitreihen und stellt fest, dass die (von anderen Antwortenden vorgeschlagene) Vorwärtsverkettung nicht hilfreich ist. Beachten Sie, dass die Vorwärtsverkettung in diesem Artikel als Last-Block-Evaluierung bezeichnet wird:

Bei Verwendung der standardmäßigen 5-fachen Kreuzvalidierung konnte kein praktischer Effekt der Abhängigkeiten innerhalb der Daten festgestellt werden, ob der endgültige Fehler unterschätzt oder überschätzt wird. Im Gegenteil, die letzte Blockbewertung führt tendenziell zu weniger robusten Fehlermaßnahmen als die Kreuzvalidierung und die blockierte Kreuzvalidierung.

" Evaluierung von Zeitreihen-Prognosemodellen: Eine empirische Studie zu Leistungsschätzungsmethoden " von Cerqueira et al. stimmt dieser Einschätzung zu. Für instationäre Zeitreihen wird jedoch empfohlen, stattdessen eine Hold-Out-Variation mit der Bezeichnung Rep-Holdout zu verwenden. In Rep-Holdout wird ein Punkt ain der Zeitreihe ausgewählt Y, um den Beginn der Testdaten zu markieren. Der Punkt asoll sich innerhalb eines Fensters befinden. Dies ist in der folgenden Abbildung dargestellt:

rep-holdout Abbildung

Diese vorgenannte Veröffentlichung ist lang und testet fast alle anderen in den Antworten auf diese Frage genannten Methoden ausführlich mit öffentlich verfügbarem Code . Dies beinhaltet den Anspruch von @Matthias Schmidtblaicher, Lücken vor und nach den Testdaten zu schließen. Außerdem habe ich nur das Papier zusammengefasst. Der eigentliche Abschluss der Arbeit beinhaltet einen Entscheidungsbaum zur Bewertung von Zeitreihenmodellen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.