2014-07-15 10 views
12

Ich habe versucht, maschinelles Lernen zu verwenden, um Vorhersagen basierend auf Zeitreihendaten zu treffen. In einem der Stackoverflow Frage (createTimeSlices function in CARET package in R) ist ein Beispiel für createTimeSlices zu Kreuzvalidierung für Modelltraining und Parameter-Tuning mit:Zeitreihen - Datenaufteilung und Modellauswertung

library(caret) 
    library(ggplot2) 
    library(pls) 
    data(economics) 
    myTimeControl <- trainControl(method = "timeslice", 
            initialWindow = 36, 
            horizon = 12, 
            fixedWindow = TRUE) 

    plsFitTime <- train(unemploy ~ pce + pop + psavert, 
         data = economics, 
         method = "pls", 
         preProc = c("center", "scale"), 
         trControl = myTimeControl) 

Mein Verständnis ist:

  1. Ich brauche kann Daten zu spalt Trainings- und Testset.
  2. Verwenden Sie den Trainingssatz für die Optimierung der Parameter.
  3. Modell auf dem Test-Set erhält Evaluate (mit R2, RMSE usw.)

Weil meine Daten Zeitreihe ist, nehme ich an, dass ich nicht bootstraping für spliting Daten in Trainings- und Testsatz verwenden kann. Meine Fragen sind also: Habe ich Recht? Und wenn ja - Wie verwende ich createTimeSlices für die Modellbewertung?

+1

Es würde helfen, wenn Sie definiert, was Sie unter „Modellevaluierung“ bedeuten. – topepo

+0

Ich habe meine Frage bearbeitet. Vielleicht ist es jetzt einfacher zu verstehen? –

+1

1. Paket 'pls' muss installiert werden 2. Wenn Sie nur über die Reihenfolge der Proben besorgt sind (nicht den Monat oder Jahr spezifisch), könnten Sie ihnen eine numerische ID geben und Sie könnten immer noch bootstrapping 3. Warum nicht etwas so einfaches wie ein Glm verwenden? –

Antwort

27

Beachten Sie, dass die ursprüngliche Frage, die Sie gepostet haben, sich um das timeSlicing kümmert und Sie timeSlices nicht manuell erstellen müssen.

Hier ist jedoch, wie createTimeSlices zum Teilen der Daten und dann zum Training und Testen eines Modells zu verwenden.

Schritt 0: die Daten einrichten und trainControl: (aus Ihrer Frage)

library(caret) 
library(ggplot2) 
library(pls) 

data(economics) 

Schritt 1: Erstellen der Zeitscheiben für den Index der Daten:

timeSlices <- createTimeSlices(1:nrow(economics), 
        initialWindow = 36, horizon = 12, fixedWindow = TRUE) 

Dies erzeugt eine Liste von Trainings- und Testzeiten.

> str(timeSlices,max.level = 1) 
## List of 2 
## $ train:List of 431 
## .. [list output truncated] 
## $ test :List of 431 
## .. [list output truncated] 

Zum leichteren Verständnis, bin ich sie in separater Variable speichern:

trainSlices <- timeSlices[[1]] 
testSlices <- timeSlices[[2]] 

Schritt 2: Training auf dem ersten von dem trainSlices:

plsFitTime <- train(unemploy ~ pce + pop + psavert, 
        data = economics[trainSlices[[1]],], 
        method = "pls", 
        preProc = c("center", "scale")) 

Schritt 3: Testen auf der erste der trainSlices:

pred <- predict(plsFitTime,economics[testSlices[[1]],]) 

Schritt 4: Plotten:

true <- economics$unemploy[testSlices[[1]]] 

plot(true, col = "red", ylab = "true (red) , pred (blue)", ylim = range(c(pred,true))) 
points(pred, col = "blue") 

Sie können dies dann tun für alle Scheiben:

for(i in 1:length(trainSlices)){ 
    plsFitTime <- train(unemploy ~ pce + pop + psavert, 
         data = economics[trainSlices[[i]],], 
         method = "pls", 
         preProc = c("center", "scale")) 
    pred <- predict(plsFitTime,economics[testSlices[[i]],]) 


    true <- economics$unemploy[testSlices[[i]]] 
    plot(true, col = "red", ylab = "true (red) , pred (blue)", 
      main = i, ylim = range(c(pred,true))) 
    points(pred, col = "blue") 
} 

Wie bereits erwähnt, ist diese Art von Zeitschlitzen durch Ihre ursprüngliche Funktion in einem Schritt durchgeführt wird:

> myTimeControl <- trainControl(method = "timeslice", 
+        initialWindow = 36, 
+        horizon = 12, 
+        fixedWindow = TRUE) 
> 
> plsFitTime <- train(unemploy ~ pce + pop + psavert, 
+      data = economics, 
+      method = "pls", 
+      preProc = c("center", "scale"), 
+      trControl = myTimeControl) 
> plsFitTime 
Partial Least Squares 

478 samples 
    5 predictors 

Pre-processing: centered, scaled 
Resampling: Rolling Forecasting Origin Resampling (12 held-out with a fixed window) 

Summary of sample sizes: 36, 36, 36, 36, 36, 36, ... 

Resampling results across tuning parameters: 

    ncomp RMSE Rsquared RMSE SD Rsquared SD 
    1  1080 0.443  796  0.297  
    2  1090 0.43  845  0.295  

RMSE was used to select the optimal model using the smallest value. 
The final value used for the model was ncomp = 1. 

Hoffe, das hilft !!

+0

Also, wenn ich caret Zugkontrolle verwende, gibt es keine Notwendigkeit, Daten in Training und Test-Set zuvor zu teilen? –

+2

Korrigieren. Der Autor des Skripts sagt auch, dass sie die Dokumentation in der nächsten Version verbessern werden. – Shambho

+0

Wirklich tolle Antwort - vielen Dank, ich habe viel gelernt! – d8aninja

2

Eigentlich können Sie!

Lassen Sie mich zuerst geben Sie a scholarly article on the topic.

In R:

Verwendung des Paket caret, createResample können einfache Bootstrap-Proben verwendet werden, machen, und können verwendet werden, createFolds ausgewogene Gruppierungen Kreuzvalidierung von einem Satz von Daten zu erzeugen. Sie werden wahrscheinlich createResample verwenden wollen. Hier ist ein Beispiel für seine Nutzung:

data(oil) 
createDataPartition(oilType, 2) 

x <- rgamma(50, 3, .5) 
inA <- createDataPartition(x, list = FALSE) 

plot(density(x[inA])) 
rug(x[inA]) 

points(density(x[-inA]), type = "l", col = 4) 
rug(x[-inA], col = 4) 

createResample(oilType, 2) 

createFolds(oilType, 10) 
createFolds(oilType, 5, FALSE) 

createFolds(rnorm(21)) 

createTimeSlices(1:9, 5, 1, fixedWindow = FALSE) 
createTimeSlices(1:9, 5, 1, fixedWindow = TRUE) 
createTimeSlices(1:9, 5, 3, fixedWindow = TRUE) 
createTimeSlices(1:9, 5, 3, fixedWindow = FALSE) 

Die Werte, die Sie in der createResample Funktion sehen, sind die Daten und die Anzahl der Partitionen zu erstellen, in diesem Fall 2. Sie können zusätzlich angeben, ob die Ergebnisse sollen als gespeichert werden Liste mit list = TRUE oder list = FALSE.

Zusätzlich enthält caret eine Funktion namens createTimeSlices, die die Indizes für diese Art der Aufteilung erstellen kann.

Die drei Parameter für diese Art der Aufteilung sind:

  • initialWindow: die anfängliche Anzahl von aufeinanderfolgenden Werten in jeder Trainingssatzprobe
  • horizon: Die Anzahl der aufeinanderfolgenden Werten in Testset Probe
  • fixedWindow: Eine logische: Wenn FALSE, beginnt der Trainingssatz immer bei der ersten Stichprobe und die Größe des Trainingssatzes variiert über Datenaufteilungen.

Verbrauch:

createDataPartition(y, 
        times = 1, 
        p = 0.5, 
        list = TRUE, 
        groups = min(5, length(y))) 
createResample(y, times = 10, list = TRUE) 
createFolds(y, k = 10, list = TRUE, returnTrain = FALSE) 
createMultiFolds(y, k = 10, times = 5) 
createTimeSlices(y, initialWindow, horizon = 1, fixedWindow = TRUE) 

Quellen:

http://caret.r-forge.r-project.org/splitting.html

http://eranraviv.com/blog/bootstrapping-time-series-r-code/

http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=caret/man/createDataPartition.Rd&d=R_CC

CARET. Relationship between data splitting and trainControl

+0

Können Sie ein Beispiel in R geben? –

+0

@JoteN Sicher. Es gibt Beispiele in diesen beiden Links, aber ich werde sie direkt zur Lösung hinzufügen. –

+0

@JoteN Eigentlich, ja, ich denke, sie haben Beispiel-Beispiele mit Code der anderen Funktionen zur Verfügung gestellt, dann createResample diskutiert und nur das Ergebnis angezeigt. Ich habe ein Beispiel und das allgemeine Anwendungsbeispiel für dich gefunden. –

4

Shambhos Antwort liefert ein anständiges Beispiel für die Verwendung des Caret-Pakets mit TimeSlices, kann jedoch in Bezug auf die Modellierungstechnik irreführend sein. Um zukünftige Leser, die das Caret-Paket für die Zeitreihenvorhersage verwenden wollen (und hier meine ich nicht autoregressive Modelle), nicht zu verunsichern, möchte ich ein paar Dinge hervorheben.

Das Problem mit Zeitreihendaten ist, dass Look-Ahead-Bias leicht ist, wenn man nicht vorsichtig ist.In diesem Fall hat der Wirtschaftsdatensatz Daten zu ihren wirtschaftlichen Berichtsterminen und nicht zu ihrem Veröffentlichungsdatum ausgerichtet, was in realen Live-Anwendungen niemals der Fall ist (ökonomische Datenpunkte haben unterschiedliche Zeitstempel). Die Daten zur Arbeitslosigkeit können in Bezug auf das Veröffentlichungsdatum zwei Monate hinter den anderen Indikatoren liegen, was dann zu einer Modell-Verzerrung in Shambhos Beispiel führen würde.

Als nächstes ist dieses Beispiel nur deskriptive Statistiken und nicht vorhersagend (Prognose), weil die Daten, die wir prognostizieren wollen (Arbeitslosigkeit), nicht korrekt verzögert sind. Es trainiert lediglich ein Modell, um die Variation der Arbeitslosigkeit (die auch in diesem Fall eine stationäre Zeitreihe ist, die alle möglichen Probleme im Modellierungsprozess hervorruft) am besten zu erklären, basierend auf Prädiktorvariablen zu den gleichen ökonomischen Berichtsterminen.

Schließlich ist der 12-Monats-Horizont in diesem Beispiel keine echte Mehrperiodenprognose, wie es Hyndman in seinen Beispielen macht.

Hyndman on cross-validation for time-series

Verwandte Themen