Gegeben eine Zeitreihe, ist die Vorhersage des nächsten Wertes ein Problem, das viele Programmierer seit langem fasziniert. Ein Hauptgrund für diese Aufmerksamkeit sind natürlich die Aktienmärkte, die unermesslichen Reichtum versprechen, wenn man sie knacken kann. Bis auf wenige Ausnahmen (siehe Ein seltenes Interview mit dem Mathematiker, der die Wall Street geknackt hat) haben sich diese Reichtümer jedoch als schwer fassbar erwiesen.
Dank des IoT (Internet der Dinge) steht die Zeitreihenanalyse kurz davor, wieder ins Rampenlicht zu rücken. Das IoT ermöglicht es uns, überall Sensoren zu platzieren, Daten zu sammeln und auf diese Daten zu reagieren. IoT-Geräte sammeln Daten im Laufe der Zeit, und die daraus resultierenden Daten sind fast immer Zeitreihendaten.
Nachfolgend sind einige Anwendungsfälle für Zeitreihenvorhersagen aufgeführt.
- Vorhersage der Stromlast
- Nachfragevorhersage für Einzelhandelsgeschäfte
- Dienstleistungen (z. B.. Check-in-Schalter von Fluggesellschaften, Behörden) Kundenvorhersage
- Umsatzprognosen
- Vitalüberwachung in der Intensivpflege
- Ertrags- und Erntevorhersage
Lassen Sie uns die verfügbaren Techniken für Zeitreihenvorhersagen untersuchen.
Die erste Frage lautet: „Ist das nicht die Regression?“. Es ist nahe dran, aber nicht dasselbe wie die Regression. In einer Zeitreihe wird jeder Wert von den Werten beeinflusst, die diesem Wert unmittelbar vorausgehen. Wenn z. B. um 4.55 Uhr an einer Kreuzung viel Verkehr herrscht, ist die Wahrscheinlichkeit groß, dass auch um 4.56 Uhr noch etwas Verkehr herrscht. Dies wird als Autokorrelation bezeichnet. Bei einer Regression wird nur x(t) berücksichtigt, während aufgrund der Autokorrelation auch x(t-1), x(t-2), … das Ergebnis beeinflussen werden. Wir können also Zeitreihenprognosen als Regressionen betrachten, die auch die Autokorrelation berücksichtigen.
Für diese Diskussion betrachten wir den „Datensatz zum Stromverbrauch einzelner Haushalte“, bei dem es sich um Daten handelt, die von einem Haushalt über vier Jahre in Ein-Minuten-Intervallen gesammelt wurden. Wir betrachten nur drei Felder, und der Datensatz sieht wie folgt aus.
Die erste Frage lautet: Wie messen wir den Erfolg? Wir tun dies über eine Verlustfunktion, wobei wir versuchen, die Verlustfunktion zu minimieren. Es gibt mehrere Verlustfunktionen, und sie haben unterschiedliche Vor- und Nachteile.
- MAE (mittlerer absoluter Fehler) – hier werden alle Fehler, ob groß oder klein, gleich behandelt
- Root Mean Square Error (RMSE) – hier werden große Fehler durch den quadratischen Term bestraft. Zum Beispiel, mit Fehlern und , MSE für beide ist 0,5, während RMSE ist 0,5 und. 0.45.
- MAPE ( Mean Absolute Percentage Error) – Da #1 und #2 vom Wertebereich der Zielvariablen abhängen, können sie nicht über Datensätze hinweg verglichen werden. Im Gegensatz dazu ist MAPE ein Prozentsatz, also relativ. Er ist vergleichbar mit der Genauigkeit bei einem Klassifizierungsproblem, bei dem jeder weiß, dass eine Genauigkeit von 99 % ziemlich gut ist.
- RMSEP ( Root Mean Square Percentage Error) – Dies ist eine Mischung aus #2 und #3.
- Fast richtige Vorhersagen Fehlerrate (AC_errorRate) – der Prozentsatz der Vorhersagen, der innerhalb von %p Prozent des wahren Wertes liegt
Wenn wir versuchen, den nächsten Wert vorherzusagen, haben wir mehrere Möglichkeiten.
Der Goldstandard für diese Art von Problemen ist das ARIMA-Modell. Die Kernidee hinter ARIMA besteht darin, die Zeitreihe in verschiedene Komponenten wie Trendkomponente, Saisonkomponente usw. zu zerlegen und für jede Komponente sorgfältig ein Modell zu schätzen. Einen guten Überblick finden Sie unter Verwendung von R für die Zeitreihenanalyse.
Allerdings hat ARIMA ein unglückliches Problem. Man braucht einen Experten (einen guten Statistikabschluss oder einen Doktoranden), um die Modellparameter zu kalibrieren. Wenn man multivariates ARIMA machen will, d.h. mehrere Felder berücksichtigen will, wird es noch schwieriger.
Allerdings gibt es in R eine Funktion namens auto.arima, die Modellparameter für Sie schätzt. Ich habe das ausprobiert.
library("forecast")
....
x_train <- train data set
X-test <- test data set
..
powerTs <- ts(x_train, frequency=525600, start=c(2006,503604))
arimaModel <- auto.arima(powerTs)
powerforecast <- forecast.Arima(arimaModel, h=length(x_test))
accuracy(powerforecast)
Eine ausführliche Diskussion über die Durchführung von ARIMA finden Sie unter den oben angegebenen Links. Ich habe nur 200k aus dem Datensatz verwendet, da unser Schwerpunkt auf mittelgroßen Datensätzen liegt. Es ergab einen MAPE von 19,5.
Temporale Merkmale
Der zweite Ansatz besteht darin, eine Liste von Merkmalen zu erstellen, die die zeitlichen Aspekte erfassen, damit die Autokorrelationsinformationen nicht verloren gehen. Bei der technischen Analyse des Aktienmarktes werden beispielsweise Merkmale verwendet, die auf gleitenden Durchschnitten basieren. Im einfachen Fall verfolgt ein Analyst die gleitenden 7-Tage- und 21-Tage-Durchschnitte und trifft Entscheidungen auf der Grundlage der Kreuzungspunkte zwischen diesen Werten.
Nachfolgend einige Ideen für Merkmale
- Sammlung von gleitenden Durchschnitten/Medianen (z.z. B. 7, 14, 30, 90 Tage)
- Zeit seit einem bestimmten Ereignis
- Zeit zwischen zwei Ereignissen
- Mathematische Maße wie Entropie, Z-Werte usw.
- X(t) multipliziert mit Funktionen wie Potenz(X(t),n), cos((X(t)/k)) usw
Ein üblicher Trick besteht darin, diese Merkmale mit Techniken wie Random Forest und Gradient Boosting anzuwenden, die die relative Bedeutung der Merkmale ermitteln können. Wir können diese Daten verwenden, um gute Merkmale zu behalten und unwirksame Merkmale zu verwerfen.
Ich möchte nicht zu viel Zeit auf dieses Thema verwenden. Es hat sich jedoch gezeigt, dass diese Methode mit etwas harter Arbeit sehr gute Ergebnisse liefern kann. Zum Beispiel werden die meisten Wettbewerbe mit dieser Methode gewonnen (z.B.http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
Der Nachteil ist jedoch, dass die Erstellung von Features eine schwarze Kunst ist. Es braucht eine Menge Arbeit und Erfahrung, um die Features zu erstellen.
Rolling Windows-based Regression
Jetzt kommen wir zum interessanten Teil. Es scheint eine andere Methode zu geben, die ohne viel Handarbeit ziemlich gute Ergebnisse liefert.
Die Idee ist, dass wir zur Vorhersage von X(t+1), dem nächsten Wert in einer Zeitreihe, nicht nur X(t), sondern auch X(t-1), X(t-2) usw. in das Modell eingeben. Eine ähnliche Idee wurde in Rolling Analysis of Time Series diskutiert, obwohl sie zur Lösung eines anderen Problems verwendet wird.
Lassen Sie uns ein Beispiel betrachten. Nehmen wir an, wir müssen x(t+1) aus X(t) vorhersagen. Dann sehen die Quell- und Zielvariablen wie folgt aus.
Der Datensatz würde nach der Transformation mit einem rollierenden Fenster von drei wie folgt aussehen.
Dann werden wir den transformierten Datensatz mit einem bekannten Regressionsalgorithmus wie der linearen Regression und der Random Forest Regression verwenden. Die Erwartung ist, dass der Regressionsalgorithmus die Autokorrelationskoeffizienten von X(t-2) zu X(t) herausfindet.
Beim obigen Datensatz lieferte beispielsweise die Anwendung der linearen Regression auf den transformierten Datensatz unter Verwendung eines rollenden Fensters von 14 Datenpunkten folgende Ergebnisse. Hier betrachtet AC_errorRate die Vorhersage als korrekt, wenn sie innerhalb von 10 % des tatsächlichen Wertes liegt.
LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307
Das ist ziemlich interessant, da dies die Auto-ARIMA-Methode schlägt (MAPE 0,19 gegenüber 0,13 mit rollenden Fenstern).
So haben wir bisher nur die lineare Regression ausprobiert. Dann habe ich verschiedene andere Methoden ausprobiert, und die Ergebnisse sind unten angegeben.
Lineare Regression schneidet immer noch ziemlich gut ab, ist aber schwach, wenn es darum geht, die Fehlerquote innerhalb von 10% zu halten. Deep Learning ist in dieser Hinsicht besser, erfordert jedoch einige Anpassungen. Bitte beachten Sie, dass die Tests mit 200k Datenpunkten durchgeführt werden, da mein Hauptaugenmerk auf kleinen Datensätzen liegt.
Die besten Ergebnisse erzielte ich mit einem neuronalen Netzwerk mit 2 versteckten Schichten der Größe 20 Einheiten in jeder Schicht ohne Dropouts oder Regularisierung, Aktivierungsfunktion „relu“ und Optimierer Adam(lr=0,001), das für 500 Epochen läuft. Das Netzwerk ist mit Keras implementiert. Beim Tuning fand ich Artikel und ziemlich nützlich.
Dann habe ich die gleiche Idee mit einigen weiteren Datensätzen ausprobiert.
- Milchproduktionsdatensatz ( kleine < 200 Datenpunkte)
- Bike-Sharing-Datensatz (ca. 18.000 Datenpunkte)
- USD zu Euro-Wechselkurs ( ca. 6500 Datenpunkte)
- Apple-Aktienkurse (ca. 13000 Datenpunkte)
Die Vorhersagen werden als univariate Zeitreihen durchgeführt. Das heißt, es werden nur Zeitstempel und der vorhergesagte Wert berücksichtigt. Jeder fehlende Wert wird durch Auffüllen (mit dem jüngsten Wert) ersetzt. Für alle Tests haben wir ein Fenster der Größe 14 als rollierendes Fenster verwendet.
Die folgenden Tabellen zeigen die Ergebnisse. Hier außer für Auto.Arima, andere Methoden mit einem Rolling-Window-basierten Datensatz.
Es gibt keinen klaren Gewinner. Die Rolling-Window-Methode, die wir besprochen haben, scheint jedoch in Verbindung mit einem Regressionsalgorithmus recht gut zu funktionieren.
Abschluss
Wir haben drei Methoden besprochen: ARIMA, Verwendung von Merkmalen zur Darstellung von Zeiteffekten und Rolling Windows zur Erstellung von Zeitreihenprognosen für den nächsten Wert mit mittelgroßen Datensätzen.
Unter den drei Methoden liefert die dritte Methode gute Ergebnisse, die mit dem Auto-ARIMA-Modell vergleichbar sind, obwohl sie nur minimale Unterstützung durch den Endbenutzer erfordert.
Daher glauben wir, dass die „Rolling Window based Regression“ eine nützliche Ergänzung für die Trickkiste des Prognostikers ist!
Dies diskreditiert jedoch nicht ARIMA, da es mit fachkundiger Abstimmung viel besser abschneiden wird. Gleichzeitig werden die Methoden zwei und drei mit handgefertigten Merkmalen ebenfalls besser abschneiden.
Eine entscheidende Überlegung ist die Wahl der Größe des Fensters für die Rolling-Window-Methode. Oft kann man aus der Domäne eine gute Idee bekommen. Der Benutzer kann auch eine Parametersuche für die Fenstergröße durchführen.
Nachfolgend ein paar Dinge, die weiter erforscht werden müssen.
- Können wir RNN und CNN verwenden? Ich habe RNN ausprobiert, konnte aber bisher keine guten Ergebnisse erzielen.
- Es könnte nützlich sein, andere Merkmale wie Tageszeit, Wochentag und auch gleitende Durchschnitte verschiedener Zeitfenster einzugeben.
- Ein Überblick über Gradientenabstiegs-Optimierungsalgorithmen
- CS231n Convolutional Neural Networks for Visual Recognition
Wenn Ihnen dieser Beitrag gefallen hat, könnten Sie auch die folgenden interessant finden.
- Einführung in die Anomalieerkennung: Konzepte und Techniken
- Chronik von Big Data: Eine technische Komödie
Sehen Sie sich auch einige meiner meistgelesenen Beiträge und meine Vorträge (Videos) an. Sprechen Sie mit mir unter @srinath_perera oder finden Sie mich.