** (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 **
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 **
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 **
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 **
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.)
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.
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.
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.)
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