Guide de prévision des séries temporelles avec Prophet en Python 3

introduction

Dans les didacticiels précédents, nous avons montréhow to visualize and manipulate time series data ethow to leverage the ARIMA method to produce forecasts from time series data. Nous avons noté que la paramétrisation correcte des modèles ARIMA pouvait constituer un processus manuel compliqué nécessitant un certain temps.

D'autres langages de programmation statistique tels queR fournissentautomated ways pour résoudre ce problème, mais ceux-ci n'ont pas encore été officiellement portés vers Python. Heureusement, l'équipe Core Data Science de Facebook a récemment publié une nouvelle méthode appeléeProphet, qui permet aux analystes de données et aux développeurs d'effectuer des prévisions à grande échelle dans Python 3.

Conditions préalables

Ce guide explique comment effectuer une analyse de série chronologique sur un poste de travail local ou sur un serveur distant. Travailler avec de grands ensembles de données peut demander beaucoup de mémoire, donc dans les deux cas, l'ordinateur aura besoin d'au moins2GB of memory pour effectuer certains des calculs de ce guide.

Pour ce didacticiel, nous utiliseronsJupyter Notebook pour travailler avec les données. Si vous ne l'avez pas déjà, vous devriez suivre nostutorial to install and set up Jupyter Notebook for Python 3.

[[step-1 -—- pull-dataset-and-install-packages]] == Étape 1 - Extraire l'ensemble de données et installer les packages

Pour configurer notre environnement pour la prévision de séries chronologiques avec Prophet, commençons par notre environnement de programmation local ou notre environnement de programmation basé sur serveur:

cd environments
. my_env/bin/activate

À partir de là, créons un nouveau répertoire pour notre projet. Nous l'appelleronstimeseries puis nous nous déplacerons dans le répertoire. Si vous appelez le projet un autre nom, assurez-vous de remplacer votre nom partimeseries tout au long du guide:

mkdir timeseries
cd timeseries

Nous allons travailler avec Box et Jenkins (1976)Airline Passengers dataset, qui contient des séries chronologiques sur le nombre mensuel de passagers aériens entre 1949 et 1960. Vous pouvez enregistrer les données en utilisant la commandecurl avec l'indicateur-O pour écrire la sortie dans un fichier et télécharger le CSV:

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

Ce tutoriel nécessitera les bibliothèquespandas,matplotlib,numpy,cython etfbprophet. Comme la plupart des autres packages Python, nous pouvons installer les bibliothèquespandas,numpy,cython etmatplotlib avec pip:

pip install pandas matplotlib numpy cython

Pour calculer ses prévisions, la bibliothèquefbprophet s'appuie sur le langage de programmationSTAN, nommé en l'honneur du mathématicienStanislaw Ulam. Avant d'installerfbprophet, nous devons donc nous assurer que le wrapper Pythonpystan versSTAN est installé:

pip install pystan

Une fois que cela est fait, nous pouvons installer Prophet en utilisant pip:

pip install fbprophet

Maintenant que nous sommes tous configurés, nous pouvons commencer à utiliser les packages installés.

[[step-2 -—- import-packages-and-load-data]] == Étape 2 - Importer des packages et charger des données

Pour commencer à utiliser nos données, nous allons démarrer Jupyter Notebook:

jupyter notebook

Pour créer un nouveau fichier notebook, sélectionnezNew>Python 3 dans le menu déroulant en haut à droite:

Create a new Python 3 notebook

Cela ouvrira un bloc-notes qui nous permettra de charger les bibliothèques requises.

Selon la meilleure pratique, commencez par importer les bibliothèques dont vous aurez besoin en haut de votre bloc-notes (notez les raccourcis standard utilisés pour référencerpandas,matplotlib etstatsmodels):

%matplotlib inline
import pandas as pd
from fbprophet import Prophet

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

Remarquez comment nous avons également défini les cinq trente-huitmatplotlib style pour nos graphiques.

Après chaque bloc de code de ce didacticiel, vous devez taperALT + ENTER pour exécuter le code et vous déplacer dans un nouveau bloc de code dans votre bloc-notes.

Commençons par lire dans nos séries chronologiques. Nous pouvons charger le fichier CSV et imprimer les 5 premières lignes avec les commandes suivantes:

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

df.head(5)

DataFrame

NotreDataFrame contient clairement une colonneMonth etAirPassengers. La bibliothèque Prophet attend en entrée un DataFrame avec une colonne contenant les informations de temps et une autre colonne contenant la métrique que nous souhaitons prévoir. Il est important de noter que la colonne de temps devrait être du typedatetime, alors vérifions le type de nos colonnes:

df.dtypes
OutputMonth            object
AirPassengers     int64
dtype: object

La colonneMonth n'étant pas du typedatetime, nous devons la convertir:

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

Nous voyons maintenant que notre colonneMonth est du typedatetime correct.

Prophet impose également la condition stricte que les colonnes d'entrée soient nomméesds (la colonne de temps) ety (la colonne de métrique), alors renommons les colonnes dans notre DataFrame:

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

df.head(5)

DataFrame

Il est judicieux de visualiser les données sur lesquelles nous allons travailler. Nous allons donc tracer notre série chronologique:

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

Maintenant que nos données sont prêtes, nous sommes prêts à utiliser la bibliothèque Prophet pour produire des prévisions de nos séries chronologiques.

[[step-3 -—- time-series-Forecast-with-prophet]] == Étape 3 - Prévisions de séries chronologiques avec Prophet

Dans cette section, nous allons décrire comment utiliser la bibliothèque Prophet pour prédire les valeurs futures de nos séries chronologiques. Les auteurs de Prophet ont résumé nombre des complexités inhérentes à la prévision de séries chronologiques et ont rendu plus intuitif le travail des analystes et des développeurs sur les données chronologiques.

Pour commencer, nous devons instancier un nouvel objet Prophet. Prophet nous permet de spécifier un certain nombre d'arguments. Par exemple, nous pouvons spécifier la plage souhaitée de notre intervalle d'incertitude en définissant le paramètreinterval_width.

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

Maintenant que notre modèle Prophet a été initialisé, nous pouvons appeler sa méthodefit avec notre DataFrame en entrée. L'ajustement du modèle ne devrait pas prendre plus de quelques secondes.

my_model.fit(df)

Vous devriez recevoir une sortie semblable à ceci:

Output

Afin d'obtenir des prévisions de nos séries temporelles, nous devons fournir à Prophet un nouveau DataFrame contenant une colonneds qui contient les dates pour lesquelles nous voulons des prédictions. De manière pratique, nous n'avons pas à nous soucier de la création manuelle de ce DataFrame, car Prophet fournit la fonction d'aide demake_future_dataframe:

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

DataFrame

Dans le bloc de code ci-dessus, nous avons demandé à Prophet de générer 36 horodatages dans le futur.

Lorsque vous travaillez avec Prophet, il est important de prendre en compte la fréquence de nos séries chronologiques. Parce que nous travaillons avec des données mensuelles, nous avons clairement spécifié la fréquence souhaitée des horodatages (dans ce cas,MS est le début du mois). Par conséquent, lesmake_future_dataframe ont généré 36 horodatages mensuels pour nous. En d’autres termes, nous cherchons à prédire les valeurs futures de notre série temporelle dans trois ans.

Le DataFrame des dates futures est ensuite utilisé comme entrée de la méthodepredict de notre modèle ajusté.

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

Predict Model

Prophet renvoie un grand DataFrame avec de nombreuses colonnes intéressantes, mais nous subdivisons notre sortie en colonnes plus pertinentes pour la prévision, à savoir:

  • ds: l'horodatage de la valeur prévue

  • yhat: la valeur prévue de notre métrique (dans Statistics,yhat est une notation traditionnellement utilisée pour représenter les valeurs prédites d'une valeury)

  • yhat_lower: la borne inférieure de nos prévisions

  • yhat_upper: la borne supérieure de nos prévisions

Une variation des valeurs par rapport aux résultats présentés ci-dessus est à prévoir, car Prophet s'appuie sur les méthodes de Markov en chaîne de Monte Carlo (MCMC) pour générer ses prévisions. MCMC étant un processus stochastique, les valeurs seront légèrement différentes à chaque fois.

Prophet fournit également une fonction pratique pour tracer rapidement les résultats de nos prévisions:

my_model.plot(forecast,
              uncertainty=True)

Forecast Plot

Prophet trace les valeurs observées de notre série chronologique (les points noirs), les valeurs prévues (ligne bleue) et les intervalles d'incertitude de nos prévisions (les régions ombrées en bleu).

Une autre caractéristique particulièrement forte de Prophet est sa capacité à restituer les composants de nos prévisions. Cela peut aider à révéler comment les modèles quotidiens, hebdomadaires et annuels de la série chronologique contribuent aux valeurs prévues globales:

my_model.plot_components(forecast)

Components of Forecasts Plots

L'intrigue ci-dessus fournit des informations intéressantes. Le premier graphique montre que le volume mensuel de passagers aériens a augmenté de manière linéaire au fil du temps. Le deuxième graphique met en évidence le fait que le nombre hebdomadaire de passagers atteint son maximum vers la fin de la semaine et le samedi, tandis que le troisième graphique montre que le trafic est le plus dense durant les mois de vacances de juillet et août.

Conclusion

Dans ce didacticiel, nous avons décrit comment utiliser la bibliothèque Prophet pour effectuer des prévisions de séries chronologiques en Python. Nous utilisons des paramètres prêts à l'emploi, mais Prophet nous permet de spécifier beaucoup plus d'arguments. En particulier, Prophet fournit la fonctionnalité pour apporter votre propre connaissance des séries chronologiques à la table.

Voici quelques choses supplémentaires que vous pourriez essayer:

  • Évaluez l’effet des vacances en incluant vos connaissances préalables sur les mois de vacances (par exemple, nous savons que le mois de décembre est un mois de vacances). La documentation officielle surmodeling holidays sera utile.

  • Modifiez la plage de vos intervalles d’incertitude ou prévoyez l’avenir.

Pour plus de pratique, vous pouvez également essayer de charger un autre jeu de données de série chronologique pour produire vos propres prévisions. Dans l’ensemble, Prophet offre un certain nombre de fonctionnalités intéressantes, notamment la possibilité d’adapter le modèle de prévision aux besoins de l’utilisateur.