[PYTHON] Was Sie bei der Zeitreihendatenanalyse (einschließlich Reflexion) nicht tun sollten

** (Ergänzung 1) Es wurde darauf hingewiesen, dass die Verwendung von Begriffen ("In-Sample", "Out-of-Sample") unangemessen ist. [Zweite Hälfte dieses Artikels](http://qiita.com/TomokIshii/items/ac7bde63f2c0e0de47b3#%E8%BF%BD%E8%A8%98%E7%94%A8%E8%AA%9E-in-sample] -aus der Probe-% E3% 81% AE% E5% AE% 9A% E7% BE% A9% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6) Ich habe diesen Punkt hinzugefügt. ** ** ** ** (Ergänzung 2) [Zweite Hälfte](http://qiita.com/TomokIshii/items/ac7bde63f2c0e0de47b3#%E8%BF%BD%E8%A8%982%E7%94%A8%E8%AA%9E -in-sample-% E3% 81% AE% E5% AE% 9A% E7% BE% A9% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6) Ich tat. ** ** **

Selbst wenn Sie nach dem Posten von Qiita einen Fehler im Inhalt bemerken, haben Sie in der Regel Zeit und lassen ihn unverändert. Es ist in Ordnung, wenn es ein sehr kleiner Fehler ist, aber wenn es ein theoretischer Fehler oder ein Missverständnis ist, muss es sein, dass die falsche Übertragung fortgesetzt wird, und wir müssen darüber nachdenken. (Es ist schnell, einen Artikel zu löschen, aber wenn er ein "Gefällt mir" hat, ist es unhöflich, ihn zu löschen ...)

Übrigens wird im vorherigen Vergleich von Regressionsmodellen - ARMA vs. Random Forest Regression - Qiita Lag (Verzögerung) als Merkmalsgröße aus den Zeitreihendaten verwendet. Stellt vor, wie es geht.

Diesmal handelt es sich um univariate Zeitreihendaten, aber ich habe versucht, den aktuellen Wert anhand einiger früherer Daten als Modell zu schätzen. Speziell, Volume_current ~ Volume_Lag1 + Volume_Lag2 + Volume_Lag3 Dies ist das Modell. Ich wollte die Trainingsdaten und Testdaten wie beim letzten Mal (70, 30) machen, aber da NaN bei der Berechnung des Lag-Werts erscheint, dropna () den ersten Teil und setze die Datenlänge auf (67, 30). tat.

Verarbeiten Sie zuerst die Daten vor.

df_nile['lag1'] = df_nile['volume'].shift(1) 
df_nile['lag2'] = df_nile['volume'].shift(2)
df_nile['lag3'] = df_nile['volume'].shift(3)

df_nile = df_nile.dropna()

X_train = df_nile[['lag1', 'lag2', 'lag3']][:67].values
X_test = df_nile[['lag1', 'lag2', 'lag3']][67:].values

y_train = df_nile['volume'][:67].values
y_test = df_nile['volume'][67:].values

Verwenden Sie den Random Forest Regressor von Scikit-learn.

from sklearn.ensemble import RandomForestRegressor
r_forest = RandomForestRegressor(
            n_estimators=100,
            criterion='mse',
            random_state=1,
            n_jobs=-1
)
r_forest.fit(X_train, y_train)
y_train_pred = r_forest.predict(X_train)
y_test_pred = r_forest.predict(X_test)

Gemäß dem typischen Verfahren des maschinellen Lernens werden die Daten in Trainingsdaten / Testdaten unterteilt, das Modell wird unter Verwendung der Trainingsdaten angepasst, und dann werden die Antworten mit dem vom Modell vorhergesagten Wert und der Bezeichnung der Testdaten abgeglichen. Was ist los? Der Ablauf des obigen Codes wird anhand einer Abbildung erläutert.

** Abb.1 So prognostizieren und überprüfen Sie falsche Zeitreihendaten **

TSA_procedure1.png

Generieren Sie 3 Verzögerungsdaten aus den ursprünglichen Zeitreihendaten mit pandas.DaraFrame.shift. Danach wird es zu einem vorbestimmten Zeitpunkt in Trainingsdaten (In-Sample) und Testdaten (Out-of-Sample) unterteilt. Auf den ersten Blick sieht es gut aus, aber bei diesem Verfahren wird der Testdatenabschnitt (rosa Teil) der ursprünglichen Datenreihe in die Lag-Datenreihe aufgenommen. Bei der Modellverifizierung kann eine solche Verarbeitung durchgeführt werden, in der Realität sind jedoch Daten (außerhalb der Stichprobe) nach einer vorbestimmten Zeit für zukünftige Informationen nicht vorhanden, sodass diese Verarbeitung nicht durchgeführt werden kann.

Der richtige Weg, dies zu tun, besteht darin, die für die Datenvorhersage erforderlichen Verzögerungswerte nacheinander einzugeben und vorwärts zu gehen.

** Abb.2 Vorhersage und Überprüfung korrekter Zeitreihendaten **

TSA-procedure2.png

In der obigen Abbildung müssen die rosa Informationen als Antwort bei der Validierung ausgeschlossen werden. Zum Zeitpunkt (xn-3) können alle Trainingsdaten mit blauen In-Sample-Daten abgeglichen werden. Beim nächsten Mal (xn-2) gehen die Lag-3-Daten verloren, sodass der Wert hier unter Verwendung des Vorhersagemodells berechnet wird. Beim nächsten Mal (xn-1) wird angenommen, dass der Berechnungsprozess darin besteht, die fehlenden Teile von Lag-2 und Lag-3 auszufüllen. Dies ist der folgende Code.

def step_forward(rf_fitted, X, in_out_sep=67, pred_len=33):
    # predict step by step
    nlags = 3
    idx = in_out_sep - nlags - 1

    lags123 = np.asarray([X[idx, 0],
                          X[idx, 1],
                          X[idx, 2]])

    x_pred_hist = []
    for i in range(nlags + pred_len):
        x_pred = rf_fitted.predict([lags123])
        if i > nlags:
            x_pred_hist.append(x_pred)
        lags123[0] = lags123[1]
        lags123[1] = lags123[2]
        lags123[2] = x_pred

    x_pred_np = np.asarray(x_pred_hist).squeeze()

    return x_pred_np

Im obigen Code ist rf_fitted ein Random Forest-Modell, für das die Anpassung (Training) der Regression abgeschlossen wurde. Auf diese Weise wird Schritt für Schritt der zukünftige Wert berechnet, der dem Out-of-Sample entspricht.

Überprüfen Sie nun, wie sich die vorhergesagten Werte falsch / richtig unterscheiden.

** Abb.3 Falsche Vorhersage ** tsa_nile1.png

Wenn man sich auf die in Cyan gezeichnete Linie außerhalb der Stichprobe konzentriert, spiegelt sich die Hochfrequenzkomponente des vorhergesagten Abschnitts des Eingabewerts (gepunktete Linie), auf die in der obigen Abbildung nicht Bezug genommen werden sollte, im vorhergesagten Wert (durchgezogene Cyan-Linie) wider. Es sieht so aus. Der Grad der Überlappung in diesem Abschnitt scheint jedoch hoch zu sein.

** Abb.4 Vorhersage auf die richtige Weise ** tsa_nile2.png

In dieser Figur scheint die Hochfrequenzkomponente des vorhergesagten Werts des vorhergesagten Abschnitts ziemlich klein zu sein, und in der zweiten Hälfte des Abschnitts scheint sie sich geringfügig vom tatsächlichen Wert (gepunktete Linie) zu unterscheiden. In dieser Figur ist jedoch ein großer Trend der "allmählichen Abnahme" im Abschnitt innerhalb der Stichprobe im vorhergesagten Wert außerhalb der Stichprobe zu sehen. (Aus meiner persönlichen Sicht ...)

Bitte beachten Sie, dass die Zeitreihendatenanalyse solche Fallstricke aufweist. (Dies kann die Grundlage für Personen sein, die normalerweise mit Zeitreihendaten umgehen.) Sie müssen die Zeitreihendaten auf der Website des Wettbewerbs für maschinelles Lernen "Kaggle" usw. finden und einen kleinen praktischen Teil studieren. Ich fühle, dass.

Ich hoffe auch, dass Leute, die meine veröffentlichten Artikel mögen oder "lagern", auch die Zuverlässigkeit der Artikel berücksichtigen. (Es ist ein "Hinweis", dass es falsch sein könnte. Ich würde mich noch mehr freuen, wenn Sie den Fehler kommentieren könnten.)

Referenzen, Website

(Ergänzung 1) Definition der Begriffe "In-Sample" und "Out-of-Sample"

In diesem Artikel wird "In-Sample" synonym mit "Trainingsdaten" verwendet, aber ich denke nicht, dass dies bedeutet. Nur im Fall der Regression erhielt ich einen Tweet mit der Aufschrift "Der Wert der erklärenden Variablen entspricht den Trainingsdaten". Wie Sie bereits betont haben, war das Verständnis von "In-Sample" nicht eindeutig. Lesen Sie daher in diesem Artikel "In-Sample" -> "Trainingsdaten" und "Out-of-Sample" -> "Testdaten". Ich hoffe du kannst es ändern. Ich habe das Konzept der oben genannten Begriffe zu diesem Zeitpunkt noch nicht vollständig verstanden, daher werde ich den Artikel zu einem späteren Zeitpunkt aktualisieren.

(Ergänzung 2) Über die Definition des Begriffs "In-Sample"

Ich habe das "In-Sample" im Artikel überprüft. Bitte beziehen Sie sich darauf.

Zum Zeitpunkt des Schreibens des obigen Artikels waren die Begriffe "In-Sample" / "Out-of-Sample" an einem bestimmten Punkt auf der Zeitachse geteilt, die Daten bis zu diesem Punkt waren "In-Sample" und die Daten nach diesem Punkt waren Ich dachte, es sei "out-of-sample". Obwohl diese Verwendung ungenau ist, scheint der Begriff häufig auf diese Weise verwendet zu werden.

Beispiel: StackExchange, Kreuzvalidierte Fragen, Was ist der Unterschied zwischen Prognosen für "In-Sample" und "Out-of-Sample"? -zwischen-in-Stichprobe-und-aus-Stichprobe-Prognosen) hat die folgende Erklärung als Antwort.

if you use data 1990-2013 to fit the model and then you forecast for 2011-2013, it's in-sample forecast. but if you only use 1990-2010 for fitting the model and then you forecast 2011-2013, then its out-of-sample forecast.

Ich suchte in der Literatur "Die Elemente des statistischen Lernens, 2. Auflage" nach der genauen "Verwendung" des Begriffs. Dieses Buch ist ein Standardlehrbuch für Modellierung und maschinelles Lernen und wird dankenswerterweise von der Stanford University kostenlos verteilt. (Ich habe nicht "gelesen", sondern nur heruntergeladen ...)

"In-sample" wurde in Kapitel 7, "Modellbewertung und -auswahl", in der Erläuterung der Generalisierungsleistung und des Generalisierungsfehlers erläutert.

Training set:

\mathcal{T} = \{ (x_1, y_1), (x_2, y_2), ...(x_N, y_N) \}

Bei der Auswertung neuer Daten (Testdaten) mit dem mit erfassten Modell "\ hat {f}" tritt der folgende Generalisierungsfehler auf.

Err_{\mathcal{T}} = E_{X^0, Y^0} [L(Y^0,\ \hat{f}(X^0)) \mid \mathcal{T}]  \\

Es gibt verschiedene Faktoren, die die Genauigkeit der Verallgemeinerung verringern, und einer davon ist, dass sich die Datenpunkte (erklärende Variablen) zwischen Trainingsdaten und Testdaten unterscheiden. Wenn die Datenpunkte übereinstimmen, tritt der folgende "In-Sample" -Fehler auf.

Err_{in} = \frac{1}{N} \sum_{i=1}^{N} E_{Y^0} [L(Y^0_i ,\ \hat{f}(x_i)) \mid \mathcal{T} ]

Es mag schwierig sein, die Erklärung des fragmentarischen Zitats zu verstehen, aber vergleichen Sie die beiden obigen Formeln. Bemerkenswert ist das Argument des Modellausdrucks "hat {f}", bei dem das allgemeine "X ^ 0" im folgenden Ausdruck zu "x_i" (x in den Trainingsdaten) wird. Solche Daten werden zu "In-Samle" -Daten. Die folgende Abbildung ist dargestellt.

insample1.png

Betrachten Sie den Fall, in dem ein Modell (dunkle Linie) aus Trainingsdaten (Zugdaten) erhalten wird, die aus 6 Punkten bestehen. (Tatsächlich können Sie keine Sinuskurve wie eine Linie mit 6 Punkten erhalten. Bitte haben Sie Verständnis dafür, dass es sich um ein erklärendes Diagramm handelt.)

insample2.png

Die "In-Sample" -Daten sind diejenigen, deren x-Wert mit diesen Trainingsdaten übereinstimmt. Diesmal waren die Trainingsdaten x = 5, 10, 15, daher ist diejenige, die nicht mit dieser übereinstimmt, nicht "In-Sample". Daher sind die Daten von x> 20 auf der x-Achse unterschiedlich, und außerdem sind die Spaltpunkte wie x = 4, 7 nicht "in der Stichprobe". Dies ist der Grund, warum die StackExchange, Cross Validated-Anführungszeichen zunächst nicht korrekt sind. Bei der häufig durchgeführten Zeitreihenanalyse befinden sich die Datenpunkte jedoch häufig in regelmäßigen Abständen (z. B. täglich, monatlich), und in diesem Fall, selbst wenn sie durch einen bestimmten Punkt auf der Zeitachse getrennt sind, "in der Stichprobe" / anders. Da es unterteilt werden kann, gibt es eine Situation, in der es der Definition des ursprünglichen Begriffs entspricht.

Mit Ausnahme des Missverständnisses bei der Verwendung dieses Begriffs sind die Erläuterungen im Text und die Verarbeitung der Zeitreihendatenanalyse an dieser Stelle korrekt. Überprüfen Sie dies daher bitte.

Die Verwendung von Wörtern ändert sich, z. B. "Sie können leckeres Essen essen **" und "Sie können leckeres Essen essen **", aber diesmal "Verwenden wir Fachbegriffe richtig". Die Sache war eine Lektion.

Recommended Posts

Was Sie bei der Zeitreihendatenanalyse (einschließlich Reflexion) nicht tun sollten
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Datenanalyse, was machen Sie denn?
Leistungsfähigkeit von Vorhersagemethoden in der Zeitreihendatenanalyse Halboptimierung (SARIMA) [Memo]
Veranschaulichen Sie sofort die vorherrschende Periode in Zeitreihendaten mithilfe der Spektralanalyse
Den Inhalt der Daten in Python nicht kennen
Was tun, wenn der Fortschrittsbalken in tqdm von Python nicht angezeigt wird?
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
So berechnen Sie die Summe oder den Durchschnitt von Zeitreihen-CSV-Daten in einem Augenblick
Sie sollten die Option --color = always des Befehls grep nicht verwenden
Erklären Sie den Mechanismus von Linux, den Sie nicht unerwartet kennen
Was tun, wenn Sie den Papierkorb in Lubuntu 18.04 nicht verwenden können?
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Verarbeiten Sie das Ergebnis von% time,% timeit
Differenzierung von Zeitreihendaten (diskret)
Ändern Sie nicht die Reihenfolge der Spalten, wenn Sie Pandas-Datenrahmen verketten.
Zeichnen Sie die CSV von Zeitreihendaten mit einem Unixtime-Wert in Python (matplotlib).
Implementieren Sie einen Teil des Prozesses in C ++
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Konvertierung von Zeitdaten in 25-Uhr-Notation
Vorverarbeitung beim maschinellen Lernen 1 Datenanalyseprozess
Selbst wenn Sie in pandas.DataFrame nur eine bestimmte Spalte zuweisen und einen Index anhängen, müssen Sie sich nicht um die Reihenfolge der Daten kümmern
Beispiel, was zu tun ist, wenn das Beispielskript nicht funktioniert (OpenCV-Python)
Ich möchte den Transferstatus der 2020 J League visualisieren. Was soll ich tun?
Suchen Sie den Index der Elemente, die den Bedingungen im Pandas-Datenrahmen / der Pandas-Serie entsprechen
Was tun, wenn "Python nicht konfiguriert" angezeigt wird? Verwenden von PyDev in Eclipse
Was tun, wenn das Diagramm nicht auf dem Jupyter-Notizbuch (Ipython) angezeigt wird?
Verkürzung der Analysezeit von Openpose mithilfe von Sound
Erfassung von Zeitreihendaten (täglich) von Aktienkursen
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
[Datenanalyse] Soll ich die Harumi-Flagge kaufen?
Die Geschichte des Lesens von HSPICE-Daten in Python
Zeigen Sie Details zu Zeitreihendaten mit Remotte an
Lesen von Zeitreihendaten in PyTorch
Was soll ich mit DICOM von MPEG2 machen?
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Was zu tun ist, wenn es nicht in der Sudoers-Datei enthalten ist. Dieser Vorfall wird gemeldet.
Was tun, wenn in pycurl (einer von ihnen) "(35, 'SSL-Verbindungsfehler')" angezeigt wird?
Echtzeit-Persönliche Schätzung (Was muss ich tun, um die Schätzung von Bildern außerhalb der Kategorie zu verhindern?) * Fehler.
Was tun, wenn Python in pyenv nicht von der Systemversion wechselt?
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).
Was tun, wenn Sie den Fehler in der IP-Adresse der Zonendatei behoben haben, aber keine Verbindung zum DNS-Server herstellen können?