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
undfbprophet
erforderlich. 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 Bibliothekfbprophet
auf 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:
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)
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 Typdatetime
ist. Überprüfen Sie also den Typ unserer Spalten:
df.dtypes
OutputMonth object
AirPassengers int64
dtype: object
Da die SpalteMonth
nicht vom Typdatetime
ist, 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 SpalteMonth
vom richtigen Typdatetime
ist.
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)
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()
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_dataframe
bereitstellt:
future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
future_dates.tail()
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()
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)
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)
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.