Nachiketa Hebbar

Follow

Sep 18, 2020 – 8 min read

Zeitreihenprognosen sind eine der gefragtesten Techniken der Datenwissenschaft, sei es im Aktienhandel, bei der Vorhersage von Unternehmensverkäufen oder bei der Wettervorhersage. Es ist eindeutig eine sehr nützliche Fähigkeit zu haben, und ich werde Sie mit genau das am Ende dieses Artikels auszustatten.

In diesem Tutorial werden wir ein ARIMA-Modell bauen (keine Sorge, wenn Sie nicht genau wissen, wie das funktioniert noch), um die zukünftigen Temperaturwerte einer bestimmten Stadt mit Python vorherzusagen. Den GitHub-Link für den Code und den Datensatz finden Sie am Ende dieses Blogs. Ich habe auch mein YouTube-Video am Ende angehängt, falls Sie an einer Videoerklärung interessiert sind. Also, ohne Zeit zu verschwenden, lasst uns loslegen.

Der erste Schritt bei jeder Zeitreihe ist, die Daten zu lesen und zu sehen, wie sie aussehen. Der folgende Codeschnipsel zeigt, wie man das macht.

Der Code ist ziemlich einfach. Wir lesen die Daten mit pd.read_csv und schreiben parse_date=True, um sicherzustellen, dass Pandas versteht, dass es sich um Datumswerte und nicht um String-Werte handelt.

Als Nächstes entfernen wir alle fehlenden Werte und drucken die Form der Daten. df.head() gibt die ersten 5 Zeilen des Datensatzes aus. Hier ist die Ausgabe, die Sie sehen sollten:

Plotten Sie Ihre Daten

Als nächstes werden Ihre Daten geplottet. So können Sie sich ein Bild davon machen, ob die Daten stationär sind oder nicht. Für diejenigen, die nicht wissen, was Stationarität bedeutet, möchte ich es kurz erläutern. Obwohl ich mehrere Videos zu diesem Thema gemacht habe, läuft es auf Folgendes hinaus:

Jede Zeitreihe, die modelliert werden soll, muss stationär sein. Stationär bedeutet, dass ihre statistischen Eigenschaften mehr oder weniger konstant mit der Zeit sind. Ergibt Sinn, oder? Wie soll man sonst Vorhersagen machen, wenn die statistischen Eigenschaften mit der Zeit variieren? Die folgenden Eigenschaften hat jedes stationäre Modell:

  1. Konstanter Mittelwert
  2. Konstante Varianz(Es kann Schwankungen geben, aber die Schwankungen sollten nicht unregelmäßig sein)
  3. Keine Saisonalität(Keine sich wiederholenden Muster im Datensatz)

Der erste Schritt ist also die Überprüfung auf Stationarität. Wenn Ihr Datensatz nicht stationär ist, müssen Sie ihn in eine stationäre Reihe umwandeln. Bevor Sie sich jetzt Sorgen machen, entspannen Sie sich! Es gibt einen festen, einfachen Test zur Überprüfung der Stationarität, den ADF (Augmented Dickey Fuller Test). Da ich nur an der Vorhersage der Durchschnittstemperatur interessiert bin, ist das die einzige Spalte, die ich aufzeichnen werde.

df.plot(figsize=(12,5))

Prüfung auf Stationarität

Auf Anhieb können wir sehen, dass es so etwas wie einen konstanten Mittelwert um 45 zu haben scheint. Und auch die Schwankungen scheinen mehr oder weniger gleich zu sein. Um jedoch sicher zu sein, ob die Daten stationär sind oder nicht, führen wir einen festen statistischen Test mit folgendem Code durch:

Sie erhalten die folgende Ausgabe:

Sie müssen sich nicht um all die komplexen Statistiken kümmern. Um die Testergebnisse zu interpretieren, müssen Sie sich nur den p-Wert ansehen. Und Sie verwenden die folgende einfache Methode:

Wenn p< 0,05; Daten sind stationär

Wenn p>0,05; Daten sind nicht stationär

Es ist keine harte und schnelle Regel, aber stationäre Daten sollten einen kleinen p-Wert haben. Ein größerer p-Wert könnte auf das Vorhandensein bestimmter Trends (variierender Mittelwert) oder auch auf Saisonalität hinweisen.

Entscheiden Sie sich schließlich für ein ARIMA-Modell

Obwohl ich mehrere YouTube-Videos zu diesem Thema gemacht habe, möchte ich Ihnen einen einfachen Überblick geben, wenn Sie nicht ganz verstehen, was ein ARIMA-Modell ist:

ARIMA setzt sich aus 3 Begriffen zusammen (Auto-Regression + Integrierter+Gleitender Durchschnitt)

  1. Auto-Regression:

Das bedeutet im Grunde, dass Sie die früheren Werte der Zeitreihe verwenden, um die Zukunft vorherzusagen. Die Anzahl der verwendeten Vergangenheitswerte bestimmt die Reihenfolge des AR-Modells. So sieht ein AR(1)-Modell aus:

Y(t)=eine_Konstante*Y(t-1)+eine_andere_Konstante +Fehler(t)

Einfach genug, nicht wahr?

2. Integriert:

Erinnern Sie sich an unseren Vortrag über Stationarität und wie wichtig sie ist? Nun, wenn Ihr Datensatz nicht stationär ist, müssen Sie meistens eine Art Differenzoperation durchführen, um ihn stationär zu machen. Wenn Sie mit dem vorherigen Wert differenzieren, ist die Ordnung 1 und so weiter. Hier ein Beispiel:

Verzeihen Sie meine schlechte Zeichnung. Aber wie Sie sehen können, war die Reihe Y(t) nicht stationär, weil ein steigender Trend zu einem variierenden Mittelwert führt. Wir subtrahieren sie einfach von den vorherigen Werten und voila! Sie wird stationär. Je nach Ihren Daten müssen Sie die Differenzierung möglicherweise wiederholen, um eine Differenzierung zweiter Ordnung, dritter Ordnung usw. zu erhalten.

3. Gleitender Durchschnitt:

Das bedeutet im Grunde, dass Sie frühere Fehler verwenden, um die zukünftige Vorhersage zu treffen. Das macht auch Sinn, oder? Wenn Sie sehen, wie falsch Sie mit Ihrer Vorhersage lagen, können Sie das berücksichtigen, um eine bessere Vorhersage zu treffen. Und genau wie bei einem AR-Modell bestimmt die Anzahl der vorhergehenden Fehler (auch Anzahl der Lags genannt), die Sie verwenden, die Reihenfolge des Modells.

So sieht die MA(1)-Ordnungsgleichung aus:
Y(t)= Mittelwert + irgendeine_Konstante*Fehler(t-1) +Fehler(t)

Unsere Hauptaufgabe besteht also darin, die Reihenfolge der AR-, I- und MA-Teile zu bestimmen, die jeweils durch (p, d, q) gegeben sind.

Und bevor Sie sich Sorgen machen, möchte ich Ihnen sagen, dass alles automatisch abläuft. Die pmdarima-Bibliothek kommt uns zu Hilfe! Sie erledigt die Aufgabe, die Reihenfolge der ARIMAs zu bestimmen, ganz von selbst. So sieht das Code-Snippet aus:

from pmdarima import auto_arima
stepwise_fit = auto_arima(df, trace=True,
suppress_warnings=True)

(Stellen Sie sicher, dass Sie die pmdarima-Bibliothek zuerst mit pip install pmdarima installieren)

Der Code ist ziemlich selbsterklärend. Wir liefern unsere Daten einfach an die Funktion auto_arima. Die Funktion verwendet im Grunde etwas, das als AIC-Score bezeichnet wird, um zu beurteilen, wie gut ein bestimmtes Ordnungsmodell ist. Sie versucht einfach, den AIC-Score zu minimieren, und so sieht die Ausgabe aus:

Modellleistung für verschiedene Kombinationen von Ordnungen

Wir können sehen, dass das beste ARIMA-Modell der Ordnung (1,0,5) mit dem minimalen AIC-Score=8294 zu sein scheint.785. Mit diesem Wissen können wir endlich mit dem Training und der Anpassung des Modells fortfahren, um mit der Vorhersage zu beginnen!

Teilen Sie Ihren Datensatz

Bevor wir das Modell tatsächlich trainieren, müssen wir den Datensatz in einen Trainings- und einen Testabschnitt aufteilen. Wir tun dies, weil wir zunächst das Modell auf den Daten trainieren und den Testbereich vor dem Modell verbergen. Sobald das Modell fertig ist, bitten wir es, Vorhersagen für die Testdaten zu treffen, um zu sehen, wie gut es abschneidet.

Der folgende Codeschnipsel veranschaulicht, wie man das macht:

print(df.shape)
train=df.iloc
test=df.iloc
print(train.shape,test.shape)

Wie Sie wahrscheinlich erkennen können, reservieren wir die letzten 30 Tage der Daten als Testabschnitt. Sie können die Formen der tatsächlichen Daten und der Test- und Trainingsabschnitte in der Ausgabe sehen.

Form des Trainings- und des Testabschnitts

Endlich kommen wir zum Kern der Sache!

Überraschenderweise ist die Erstellung des ARIMA-Modells einer der einfachsten Schritte, wenn man erst einmal alle erforderlichen Schritte durchgeführt hat. Es ist so einfach wie im folgenden Codeschnipsel gezeigt:

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train,order=(1,0,5))
model=model.fit()
model.summary()

Wie Sie sehen können, rufen wir einfach die ARIMA-Funktion auf, geben unseren Datensatz ein und nennen die Reihenfolge des gewünschten ARIMA-Modells. Sie können die Zusammenfassung des Modells auch in Ihrer Ausgabe sehen.

Modellzusammenfassung

Sie können hier eine ganze Reihe von Informationen über Ihr Modell sehen. Außerdem können Sie die Koeffizienten der einzelnen AR- und MA-Terme sehen. Diese sind nichts anderes als die Werte der Variablen, die Sie in der vorherigen AR/MA-Modellgleichung gesehen haben und die als „Some_Constant“ bezeichnet wurden. Im Allgemeinen bedeutet ein höherer Wert dieser Variablen, dass sie einen größeren Einfluss auf das Ergebnis hat.

Überprüfen Sie, wie gut Ihr Modell ist

Hier kommen unsere Testdaten ins Spiel. Zuerst machen wir eine Vorhersage für die Temperatur anhand der Testdaten.

Um tatsächlich Vorhersagen zu machen, müssen wir die Funktion model.predict verwenden und ihr den Start- und Endindex mitteilen, bei dem wir die Vorhersagen machen wollen.

Da wir mit den Vorhersagen beginnen wollen, wenn die Trainingsdaten enden, habe ich das in die Startvariable geschrieben. Wir wollen aufhören, Vorhersagen zu machen, wenn der Datensatz endet, was die Endvariable erklärt. Wenn Sie auch Vorhersagen für die Zukunft machen wollen, können Sie dies einfach in der Start- und Endvariable auf die gewünschten Indizes ändern. Ihre Ausgabe sollte wie folgt aussehen:

Testwerte vs. Vorhersagen Plot

Wie Sie sehen können, stimmen die Vorhersagen ziemlich gut mit dem tatsächlichen Trend überein, obwohl es eine gewisse akzeptable Verzögerung gibt.

Prüfen Sie Ihre Genauigkeitsmetrik

Um tatsächlich festzustellen, wie gut oder schlecht Ihr Modell ist, ermitteln wir den mittleren quadratischen Fehler dafür. Das folgende Codeschnipsel zeigt das:

Zunächst prüfen wir den Mittelwert des Datensatzes, der 45 beträgt. Der mittlere quadratische Fehler für dieses spezielle Modell sollte bei etwa 2,3 liegen. Außerdem sollten Sie darauf achten, dass Ihr quadratischer Mittelwert sehr viel kleiner ist als der Mittelwert des Testsatzes. In diesem Fall liegt der durchschnittliche Fehler bei etwa 2,3/45 *100=5,1% des tatsächlichen Wertes.

Damit ist Ihr ARIMA-Modell einsatzbereit! In zukünftigen Blogs werde ich über verschiedene Modelle sprechen und darüber, wie Sie die Genauigkeit des Modells weiter erhöhen können.

Wenn Sie sich für die Video-Erklärung desselben interessieren, besuchen Sie meinen YouTube-Kanal für weitere solche Inhalte! Den GitHub-Link für den Code und den Datensatz finden Sie hier: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Fühlen Sie sich frei, sich auch auf LinkedIn mit mir zu verbinden!