Ein Leitfaden zur Vorhersage von Zeitreihen mit Prophet in Python 3

Einführung

In früheren Tutorials haben wirhow to visualize and manipulate time series data undhow to leverage the ARIMA method to produce forecasts from time series data gezeigt. Wir haben festgestellt, dass die korrekte Parametrisierung von ARIMA-Modellen ein komplizierter manueller Vorgang sein kann, der eine gewisse Zeit in Anspruch nimmt.

Andere statistische Programmiersprachen wieR bietenautomated ways, um dieses Problem zu lösen, aber diese müssen noch offiziell auf Python portiert werden. Glücklicherweise hat das Core Data Science-Team von Facebook kürzlich eine neue Methode namensProphet veröffentlicht, mit der Datenanalysten und Entwickler in Python 3 Prognosen in großem Maßstab durchführen können.

Voraussetzungen

In diesem Handbuch wird beschrieben, wie Zeitreihen auf einem lokalen Desktop oder einem Remote-Server analysiert werden. Das Arbeiten mit großen Datenmengen kann speicherintensiv sein. In beiden Fällen benötigt der Computer mindestens2GB of memory, um einige der Berechnungen in diesem Handbuch durchzuführen.

In diesem Tutorial verwenden wirJupyter Notebook, um mit den Daten zu arbeiten. Wenn Sie es noch nicht haben, sollten Sie unserentutorial to install and set up Jupyter Notebook for Python 3 folgen.

[[Schritt-1 - Pull-Dataset-and-Install-Pakete]] == Schritt 1 - Dataset ziehen und Pakete installieren

Um unsere Umgebung für die Vorhersage von Zeitreihen mit Prophet einzurichten, wechseln wir zunächst in unsere lokale Programmierumgebung oder serverbasierte Programmierumgebung:

cd environments
. my_env/bin/activate

Erstellen wir von hier aus ein neues Verzeichnis für unser Projekt. Wir werden estimeseries nennen und dann in das Verzeichnis wechseln. Wenn Sie dem Projekt einen anderen Namen geben, müssen Sietimeseries im gesamten Handbuch durch Ihren Namen ersetzen:

mkdir timeseries
cd timeseries

Wir werden mit Box und Jenkins (1976)Airline Passengers datasetarbeiten, die Zeitreihendaten zur monatlichen Anzahl der Fluggäste zwischen 1949 und 1960 enthalten. Sie können die Daten speichern, indem Sie den Befehlcurl mit dem Flag-O verwenden, um die Ausgabe in eine Datei zu schreiben und die CSV herunterzuladen:

curl -O https://assets.digitalocean.com/articles/eng_python/prophet/AirPassengers.csv

Für dieses Lernprogramm sind die Bibliothekenpandas,matplotlib,numpy,cython undfbpropheterforderlich. Wie die meisten anderen Python-Pakete können wir die Bibliothekenpandas,numpy,cython undmatplotlib mit pip installieren:

pip install pandas matplotlib numpy cython

Zur Berechnung der Prognosen stützt sich die Bibliothekfbprophetauf die ProgrammierspracheSTAN, die zu Ehren des MathematikersStanislaw Ulam benannt wurde. Vor der Installation vonfbprophet müssen wir daher sicherstellen, dass der Python-Wrapperpystan aufSTAN installiert ist:

pip install pystan

Sobald dies erledigt ist, können wir Prophet mit pip installieren:

pip install fbprophet

Nachdem wir alle eingerichtet sind, können wir mit den installierten Paketen arbeiten.

[[Schritt-2 - Importieren von Paketen und Laden von Daten]] == Schritt 2 - Importieren von Paketen und Laden von Daten

Um mit unseren Daten zu arbeiten, starten wir Jupyter Notebook:

jupyter notebook

Um eine neue Notebook-Datei zu erstellen, wählen Sie im Pulldown-Menü oben rechtsNew>Python 3 aus:

Create a new Python 3 notebook

Dadurch wird ein Notizbuch geöffnet, in das wir die erforderlichen Bibliotheken laden können.

Beginnen Sie zunächst mit dem Importieren der Bibliotheken, die Sie oben in Ihrem Notizbuch benötigen (beachten Sie die Standardkürzel, mit denen aufpandas,matplotlib undstatsmodels verwiesen wird):

%matplotlib inline
import pandas as pd
from fbprophet import Prophet

import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

Beachten Sie, wie wir auch die fünfunddreißigmatplotlib style für unsere Diagramme definiert haben.

Nach jedem Codeblock in diesem Lernprogramm sollten SieALT + ENTER eingeben, um den Code auszuführen und in einen neuen Codeblock in Ihrem Notizbuch zu wechseln.

Beginnen wir mit dem Einlesen unserer Zeitreihendaten. Wir können die CSV-Datei laden und die ersten 5 Zeilen mit den folgenden Befehlen ausdrucken:

df = pd.read_csv('AirPassengers.csv')

df.head(5)

DataFrame

UnsereDataFrame enthalten eindeutig eine SpalteMonth undAirPassengers. Die Prophet-Bibliothek erwartet als Eingabe einen DataFrame mit einer Spalte, die die Zeitinformationen enthält, und einer weiteren Spalte, die die Metrik enthält, die wir prognostizieren möchten. Es ist wichtig, dass die Zeitspalte vom Typdatetimeist. Überprüfen Sie also den Typ unserer Spalten:

df.dtypes
OutputMonth            object
AirPassengers     int64
dtype: object

Da die SpalteMonthnicht vom Typdatetimeist, müssen wir sie konvertieren:

df['Month'] = pd.DatetimeIndex(df['Month'])
df.dtypes
OutputMonth            datetime64[ns]
AirPassengers             int64
dtype: object

Wir sehen jetzt, dass unsere SpalteMonthvom richtigen Typdatetimeist.

Der Prophet legt auch die strikte Bedingung fest, dass die Eingabespaltends (die Zeitspalte) undy (die metrische Spalte) heißen. Benennen wir also die Spalten in unserem DataFrame um:

df = df.rename(columns={'Month': 'ds',
                        'AirPassengers': 'y'})

df.head(5)

DataFrame

Es hat sich bewährt, die Daten zu visualisieren, mit denen wir arbeiten werden. Zeichnen Sie also unsere Zeitreihen:

ax = df.set_index('ds').plot(figsize=(12, 8))
ax.set_ylabel('Monthly Number of Airline Passengers')
ax.set_xlabel('Date')

plt.show()

Time Series Plot

Da unsere Daten nun aufbereitet sind, können wir die Prophet-Bibliothek verwenden, um Vorhersagen für unsere Zeitreihen zu erstellen.

[[Schritt 3 - Zeitreihenprognose mit dem Propheten]] == Schritt 3 - Zeitreihenprognose mit dem Propheten

In diesem Abschnitt wird beschrieben, wie Sie mithilfe der Prophet-Bibliothek zukünftige Werte unserer Zeitreihen vorhersagen können. Die Autoren von Prophet haben viele der inhärenten Komplexitäten der Zeitreihenprognose beseitigt und die Arbeit mit Zeitreihendaten für Analysten und Entwickler gleichermaßen intuitiver gestaltet.

Zu Beginn müssen wir ein neues Prophetenobjekt instanziieren. Der Prophet ermöglicht es uns, eine Reihe von Argumenten anzugeben. Zum Beispiel können wir den gewünschten Bereich unseres Unsicherheitsintervalls angeben, indem wir den Parameterinterval_width einstellen.

# set the uncertainty interval to 95% (the Prophet default is 80%)
my_model = Prophet(interval_width=0.95)

Nachdem unser Prophet-Modell initialisiert wurde, können wir seinefit-Methode mit unserem DataFrame als Eingabe aufrufen. Die Modellmontage sollte nicht länger als einige Sekunden dauern.

my_model.fit(df)

Sie sollten eine Ausgabe ähnlich der folgenden erhalten:

Output

Um Prognosen unserer Zeitreihen zu erhalten, müssen wir Prophet einen neuen DataFrame zur Verfügung stellen, der eineds-Spalte enthält, die die Daten enthält, für die wir Vorhersagen wünschen. Praktischerweise müssen wir uns nicht mit der manuellen Erstellung dieses DataFrame befassen, da Prophet die Hilfsfunktionmake_future_dataframebereitstellt:

future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
future_dates.tail()

DataFrame

Im obigen Codeabschnitt haben wir Prophet angewiesen, zukünftig 36 Datenstempel zu generieren.

Bei der Arbeit mit Prophet ist es wichtig, die Häufigkeit unserer Zeitreihen zu berücksichtigen. Da wir mit monatlichen Daten arbeiten, haben wir die gewünschte Häufigkeit der Zeitstempel klar angegeben (in diesem Fall istMS der Beginn des Monats). Daher haben diemake_future_dataframe 36 monatliche Zeitstempel für uns generiert. Mit anderen Worten, wir versuchen, zukünftige Werte unserer Zeitreihe für 3 Jahre in der Zukunft vorherzusagen.

Der DataFrame zukünftiger Daten wird dann als Eingabe für diepredict-Methode unseres angepassten Modells verwendet.

forecast = my_model.predict(future_dates)
forecast[[ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

Predict Model

Prophet gibt einen großen DataFrame mit vielen interessanten Spalten zurück, aber wir unterteilen unsere Ausgabe in die Spalten, die für die Prognose am relevantesten sind:

  • ds: Der Datenstempel des prognostizierten Werts

  • yhat: Der prognostizierte Wert unserer Metrik (in der Statistik istyhat eine Notation, die traditionell verwendet wird, um die vorhergesagten Werte eines Wertsy darzustellen.)

  • yhat_lower: die Untergrenze unserer Prognosen

  • yhat_upper: die Obergrenze unserer Prognosen

Eine Abweichung der Werte von der oben dargestellten Ausgabe ist zu erwarten, da der Prophet sich bei der Erstellung seiner Prognosen auf die Monte-Carlo-Methode (MCMC) der Markov-Kette stützt. MCMC ist ein stochastischer Prozess, sodass sich die Werte jedes Mal geringfügig unterscheiden.

Prophet bietet auch eine praktische Funktion, um die Ergebnisse unserer Prognosen schnell zu zeichnen:

my_model.plot(forecast,
              uncertainty=True)

Forecast Plot

Der Prophet zeichnet die beobachteten Werte unserer Zeitreihen (die schwarzen Punkte), die prognostizierten Werte (blaue Linie) und die Unsicherheitsintervalle unserer Prognosen (die blau schattierten Bereiche) auf.

Ein weiteres besonderes Merkmal von Prophet ist die Fähigkeit, die Komponenten unserer Prognosen zurückzugeben. Dies kann Aufschluss darüber geben, wie tägliche, wöchentliche und jährliche Muster der Zeitreihen zu den prognostizierten Gesamtwerten beitragen:

my_model.plot_components(forecast)

Components of Forecasts Plots

Die obige Handlung bietet interessante Einblicke. Der erste Plot zeigt, dass das monatliche Passagieraufkommen im Laufe der Zeit linear angestiegen ist. Das zweite Diagramm zeigt, dass die wöchentliche Passagierzahl gegen Ende der Woche und am Samstag ansteigt, während das dritte Diagramm zeigt, dass der größte Verkehr in den Ferienmonaten Juli und August stattfindet.

Fazit

In diesem Tutorial wurde beschrieben, wie Sie mithilfe der Prophet-Bibliothek eine Zeitreihenvorhersage in Python durchführen. Wir haben Standardparameter verwendet, aber mit Prophet können wir viel mehr Argumente angeben. Insbesondere bietet Prophet die Funktionalität, um Ihr eigenes Wissen über Zeitreihen auf den Tisch zu bringen.

Hier sind einige zusätzliche Dinge, die Sie ausprobieren könnten:

  • Bewerten Sie die Auswirkung von Feiertagen, indem Sie Ihre Vorkenntnisse zu den Feiertagsmonaten berücksichtigen (wir wissen beispielsweise, dass der Monat Dezember ein Feiertagsmonat ist). Die offizielle Dokumentation zumodeling holidays ist hilfreich.

  • Ändern Sie den Bereich Ihrer Unsicherheitsintervalle oder prognostizieren Sie dies für die Zukunft.

Für mehr Übung können Sie auch versuchen, einen anderen Zeitreihendatensatz zu laden, um Ihre eigenen Prognosen zu erstellen. Insgesamt bietet Prophet eine Reihe überzeugender Funktionen, darunter die Möglichkeit, das Prognosemodell an die Anforderungen des Benutzers anzupassen.