Pipeline Forecasting

Dans ce tutoriel, vous apprendrez une pipeline forecasting : comment comparer et sélectionner des modèles de séries temporelles en fonction des performances prédictives.

pipeline forecasting

Aperçu

Dans la première partie, vous découvrirez de nombreux modèles de séries chronologiques. Cette partie est divisée en trois parties :

  • modèles de séries chronologiques classiques,
  • modèles supervisés,
  • et des modèles basés sur l’apprentissage profond.

Dans la deuxième partie, vous verrez une application à un cas d’utilisation dans lequel vous construirez quelques modèles de séries chronologiques pour la prévision boursière et vous apprendrez quelques techniques de modélisation de séries chronologiques. Les modèles seront comparés les uns aux autres pour sélectionner le plus performant.

Preprocessing

En raison de la nature des données de séries chronologiques, la modélisation des séries chronologiques comporte un certain nombre de spécificités qui ne sont pas pertinentes pour d’autres ensembles de données.

La première spécificité des séries temporelles est que l’horodatage qui identifie les données a une signification intrinsèque. Les modèles de séries chronologiques univariées sont des modèles de prévision qui utilisent une seule variable (la variable cible) et sa variation temporelle pour prévoir l’avenir. Les modèles univariés sont spécifiques aux séries chronologiques.

Dans d’autres situations, vous pouvez disposer de données explicatives supplémentaires sur l’avenir. Par exemple, imaginez que vous souhaitiez prendre en compte les prévisions météorologiques dans vos prévisions de demande de produits, ou que vous disposiez d’autres données qui influenceront vos prévisions. Dans ce cas, vous pouvez utiliser des modèles de séries chronologiques multivariées. 

Les modèles de séries chronologiques multivariées sont des modèles de séries chronologiques univariées adaptés pour intégrer des variables externes. Vous pouvez également utiliser l’apprentissage automatique supervisé pour cette tâche.

Si vous souhaitez utiliser une variation temporelle sur vos données de séries chronologiques, vous devrez d’abord comprendre les différents types de variations temporelles auxquelles vous pouvez vous attendre.

La décomposition des séries chronologiques est une technique permettant d’extraire plusieurs types de variations de votre ensemble de données. Il existe trois composants importants dans les données temporelles d’une série chronologique : la saisonnalité, la tendance et le bruit.

La saisonnalité est un mouvement récurrent présent dans votre variable de série chronologique. Par exemple, la température d’un endroit sera plus élevée pendant les mois d’été et plus basse pendant les mois d’hiver. Vous pouvez calculer les températures mensuelles moyennes et utiliser cette saisonnalité comme base pour prévoir les valeurs futures.

Une tendance peut être une tendance à la hausse ou à la baisse à long terme. Dans une série chronologique de températures, une tendance pourrait être présente en raison du réchauffement climatique. Par exemple, en plus de la saisonnalité été/hiver, vous pourriez constater une légère augmentation des températures moyennes au fil du temps.

Le bruit fait partie de la variabilité d’une série chronologique qui ne peut être expliquée ni par la saisonnalité ni par une tendance. Lors de la création de modèles, vous finissez par combiner différents composants dans une formule mathématique. Deux éléments d’une telle formule peuvent être la saisonnalité et la tendance. Un modèle qui combine les deux ne représentera jamais parfaitement les valeurs de température : une erreur subsistera toujours. Ceci est représenté par le facteur de bruit.

Voyons un court exemple pour comprendre comment décomposer une série chronologique en Python, en utilisant l’ensemble de données CO2 de la bibliothèque statsmodels.

Vous pouvez importer les données comme suit :

import statsmodels.datasets.co2 as co2
co2_data = co2.load().data
print(co2_data)

Il existe quelques valeurs NA que vous pouvez supprimer à l’aide d’une interpolation, comme suit :

co2_data = co2_data.fillna(co2_data.interpolate())

Vous pouvez voir l’évolution temporelle des valeurs de CO2 à l’aide du code suivant :

co2_data.plot()

pipeline forecasting

Vous pouvez effectuer une décomposition prête à l’emploi (out-of-the-box) à l’aide de la fonction season_decompose de statsmodels. Le code suivant générera un tracé qui divisera la série chronologique en tendance, saisonnalité et bruit (appelé ici résiduel) :

from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(co2_data)
result.plot()

pipeline forecasting

La décomposition des données CO2 montre une tendance à la hausse et une forte saisonnalité.

Recherche de corrélation

Passons au deuxième type d’informations temporelles pouvant être présentes dans les données de séries temporelles : l’autocorrélation.

L’autocorrélation est la corrélation entre la valeur actuelle d’une série chronologique et les valeurs passées. Si tel est le cas, vous pouvez utiliser les valeurs actuelles pour mieux prédire les valeurs futures.

L’autocorrélation peut être positive ou négative :

  • Une autocorrélation positive signifie qu’une valeur élevée maintenant est susceptible de produire une valeur élevée dans le futur et vice versa. Pensez au marché boursier : si tout le monde achète une action, alors le prix augmente. Lorsque le prix augmente, les gens pensent que c’est une bonne action à acheter et ils l’achètent également, ce qui fait monter encore le prix. Cependant, si le prix baisse, alors tout le monde a peur d’un krach, vend ses actions et le prix baisse.
  • L’autocorrélation négative est l’inverse : une valeur élevée aujourd’hui implique une valeur faible demain et une valeur faible aujourd’hui implique une valeur élevée demain. Un exemple courant est celui des populations de lapins dans les environnements naturels. S’il y a beaucoup de lapins sauvages au cours d’un été, ils mangeront toutes les ressources naturelles disponibles. Pendant l’hiver, il n’y aura plus rien à manger, donc beaucoup d’entre eux mourront et la population de lapins survivants sera petite. Durant cette année avec une petite population de lapins, les ressources naturelles vont croître et permettre à la population de lapins de croître l’année suivante.

Deux graphiques célèbres peuvent vous aider à détecter l’autocorrélation dans votre ensemble de données : le tracé ACF et le tracé PACF.

Vous pouvez calculer un tracé ACF à l’aide de Python comme suit :

from statsmodels.graphics.tsaplots import plot_acf
plot_acf(co2_data)

pipeline forecasting

Sur l’axe des x, vous pouvez voir les pas de temps (retour dans le temps). C’est aussi ce qu’on appelle le nombre de décalages. Sur l’axe des y, vous pouvez voir le degré de corrélation de chaque pas de temps avec le temps « présent ». Il est évident qu’il existe une autocorrélation significative dans ce graphique.

Le PACF est une alternative à l’ACF. Plutôt que de donner les autocorrélations, il vous donne l’autocorrélation partielle. Cette autocorrélation est dite partielle, car à chaque retour en arrière, seule une autocorrélation supplémentaire est répertoriée. Ceci est différent de l’ACF, car l’ACF contient des corrélations en double lorsque la variabilité peut être expliquée par plusieurs moments dans le temps.

Par exemple, si la valeur d’aujourd’hui est la même que la valeur d’hier, mais également la même que celle d’avant-hier, l’ACF affichera deux étapes hautement corrélées. Le PACF ne s’afficherait qu’hier et supprimerait avant-hier.

Vous pouvez calculer un tracé PACF à l’aide de Python comme suit :

from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(co2_data)

pipeline forecasting

Vous pouvez voir ci-dessous que ce tracé PACF donne une bien meilleure représentation de l’autocorrélation dans les données CO2. Il existe une forte autocorrélation positive avec le décalage 1 : une valeur élevée signifie désormais que vous observerez très probablement une valeur élevée à l’étape suivante. Étant donné que l’autocorrélation présentée ici est partielle, vous ne voyez aucun effet en double avec les décalages antérieurs, ce qui rend le tracé PACF plus net et plus clair.

Stationnarité

Une autre définition importante des séries chronologiques est la stationnarité. Une série chronologique stationnaire est une série chronologique sans tendance. Certains modèles de séries chronologiques ne sont pas capables de traiter les tendances (nous y reviendrons plus tard). Vous pouvez détecter la non-stationnarité à l’aide du test de Dickey-Fuller et supprimer la non-stationnarité à l’aide de la différenciation.

Le test de Dickey-Fuller est un test d’hypothèse statistique qui permet de détecter la non-stationnarité. Vous pouvez utiliser le code Python suivant pour appliquer un test Dickey-Fuller aux données CO2 :

from statsmodels.tsa.stattools import adfuller
adf, pval, usedlag, nobs, crit_vals, icbest = adfuller(co2_data.co2.values)
print(‘ADF test statistic:’, adf)
print(‘ADF p-values:’, pval)
print(‘ADF number of lags used:’, usedlag)
print(‘ADF number of observations:’, nobs)
print(‘ADF critical values:’, crit_vals)
print(‘ADF best information criterion:’, icbest)

pipeline forecasting

L’hypothèse nulle du test ADF est qu’une racine unitaire est présente dans la série chronologique. L’hypothèse alternative est que les données sont stationnaires.

La deuxième valeur est la valeur p. Si cette valeur p est inférieure à 0,05, vous pouvez rejeter l’hypothèse nulle (rejeter la non-stationnarité) et accepter l’hypothèse alternative (stationnarité). Dans ce cas, on ne peut pas rejeter l’hypothèse nulle et il faudra supposer que les données sont non stationnaires. Comme vous avez vu les données, vous savez qu’il y a une tendance, cela confirme donc également le résultat que nous avons obtenu.

Différenciation

Vous pouvez supprimer la tendance de votre série chronologique. Le but est de n’avoir que des variations saisonnières : cela peut être une manière d’utiliser certains modèles qui fonctionnent avec la saisonnalité mais pas avec les tendances.

prev_co2_value = co2_data.co2.shift()
differenced_co2 = co2_data.co2 – prev_co2_value
differenced_co2.plot()

pipeline forecasting

Si vous refaites le test ADF sur les données différenciées, vous confirmerez que ces données sont désormais bien stationnaires :

adf, pval, usedlag, nobs, crit_vals, icbest = adfuller(differenced_co2.dropna())
print(‘ADF test statistic:’, adf)
print(‘ADF p-values:’, pval)
print(‘ADF number of lags used:’, usedlag)
print(‘ADF number of observations:’, nobs)
print(‘ADF critical values:’, crit_vals)
print(‘ADF best information criterion:’, icbest)

pipeline forecasting

La valeur p est très faible, ce qui indique que l’hypothèse alternative (stationnarité) est vraie.

Lissage (Smoothing) en cas de bruit important

Le lissage exponentiel est une technique statistique de base qui peut être utilisée pour lisser les séries temporelles. Les modèles de séries chronologiques présentent souvent une grande variabilité à long terme, mais également une variabilité (bruyante) à court terme. Le lissage vous permet de rendre votre courbe plus lisse afin que la variabilité à long terme devienne plus évidente et que les modèles (bruyants) à court terme soient supprimés.

Cette version lissée de la série chronologique peut ensuite être utilisée pour l’analyse.

Si vous souhaitez aller encore plus loin, vous pouvez utiliser le triple lissage exponentiel, également appelé lissage exponentiel de Holt Winter. Vous ne devez l’utiliser que lorsqu’il existe trois signaux importants dans vos données de série chronologique. Par exemple, un signal pourrait être la tendance, un autre pourrait être une saisonnalité hebdomadaire et un troisième pourrait être une saisonnalité mensuelle.

Dans l’exemple suivant, vous voyez comment appliquer un lissage exponentiel simple aux données CO2. Le niveau de lissage indique à quel point votre courbe doit devenir lisse. Dans l’exemple, il est réglé très bas, indiquant une courbe très douce. N’hésitez pas à jouer avec ce paramètre et voyez à quoi ressemblent les versions moins fluides.

from statsmodels.tsa.api import SimpleExpSmoothing
es = SimpleExpSmoothing(co2_data.co2.values)
es.fit(smoothing_level=0.01)
plt.plot(co2_data.co2.values)
plt.plot(es.predict(es.params, start=0, end=None))
plt.show()

smoothing

Une fois la courbe lissée, elle est beaucoup plus simple à apprendre (ici cela revient à faire la tendance).

Modèles en une étape ou en plusieurs étapes (oneshot ou autorégressif)

Le dernier concept qu’il est important de comprendre avant de se lancer dans la modélisation est celui des modèles en une étape par rapport aux modèles en plusieurs étapes.

Certains modèles fonctionnent très bien pour prédire la prochaine étape d’une série chronologique, mais n’ont pas la capacité de prédire plusieurs étapes à la fois. Ces modèles sont des modèles en une seule étape. Vous pouvez créer des modèles en plusieurs étapes avec eux en fenêtrant vos prédictions, mais il existe un risque : lorsque vous utilisez des valeurs prédites pour faire des prédictions, vos erreurs peuvent rapidement s’accumuler et devenir très importantes.

Les modèles multi-étapes sont des modèles qui ont la capacité intrinsèque de prédire plusieurs étapes à la fois. Ils constituent généralement le meilleur choix pour les prévisions à long terme, et parfois aussi pour les prévisions à une étape. Il est essentiel que vous décidiez du nombre d’étapes que vous souhaitez prédire avant de commencer à créer des modèles. Cela dépend uniquement de votre cas d’utilisation.

Types de modèle

Maintenant que vous avez vu les principales spécificités des données de séries chronologiques, il est temps d’examiner les types de modèles pouvant être utilisés pour prédire les séries chronologiques. Cette tâche est généralement appelée prévision.

Modèles de séries chronologiques classiques

Les modèles de séries chronologiques classiques sont une famille de modèles traditionnellement très utilisés dans de nombreux domaines de la prévision. Ils sont fortement basés sur la variation temporelle à l’intérieur d’une série chronologique et fonctionnent bien avec des séries chronologiques univariées. Certaines options avancées existent pour ajouter également des variables externes dans les modèles. Ces modèles ne s’appliquent généralement qu’aux séries chronologiques et ne sont pas utiles pour d’autres types d’apprentissage automatique.

Modèles supervisés

Les modèles supervisés sont une famille de modèles utilisés pour de nombreuses tâches d’apprentissage automatique. Un modèle d’apprentissage automatique est supervisé lorsqu’il utilise des variables d’entrée clairement définies et une ou plusieurs variables de sortie (cibles).

Les modèles supervisés peuvent être utilisés pour les séries chronologiques, à condition que vous disposiez d’un moyen d’extraire la saisonnalité et de la placer dans une variable. Les exemples incluent la création d’une variable pour une année, un mois ou un jour de la semaine, etc. Celles-ci sont ensuite utilisées comme variables X dans votre modèle supervisé et le « y » est la valeur réelle de la série chronologique. Vous pouvez également inclure des versions décalées de y (la valeur passée de y) dans les données X, afin d’ajouter des effets d’autocorrélation.

Deep learning et modèles récents

La popularité croissante du deep learning au cours des dernières années a également ouvert de nouvelles portes à la prévision, car des architectures spécifiques de deep learning ont été inventées et fonctionnent très bien sur les données de séquence.

Le cloud computing et la vulgarisation de l’IA en tant que service ont également donné naissance à un certain nombre de nouvelles inventions dans le domaine. Facebook, Amazon et d’autres grandes entreprises technologiques ouvrent leurs produits de prévision ou les rendent disponibles sur leurs plateformes cloud. La disponibilité de ces nouveaux modèles de « boîte noire » donne aux prévisionnistes de nouveaux outils à essayer et à tester, et peut parfois même surpasser les modèles précédents.

Modèle classique (AutoARIMA)

La famille de modèles ARIMA est un ensemble de modèles plus petits pouvant être combinés. Chaque partie du modèle ARIMA peut être utilisée comme composant autonome, ou les différents éléments de base peuvent être combinés. Lorsque tous les composants individuels sont assemblés, vous obtenez le modèle SARIMAX. 

La difficulté avec les modèles ARIMA ou SARIMAX est que vous avez de nombreux paramètres (pp, d, q) ou même (p, d, q)(P, D, Q) que vous devez choisir.

Dans certains cas, vous pouvez inspecter les graphiques d’autocorrélation et identifier des choix logiques pour les paramètres. Vous pouvez utiliser l’implémentation statsmodels de SARIMAX et tester les performances avec les paramètres de votre choix.

Une autre approche consiste à utiliser une fonction auto-arima qui optimise automatiquement les hyperparamètres pour vous. La bibliothèque Pyramid Python fait exactement cela : elle essaie différentes combinaisons et sélectionne celle qui présente les meilleures performances.

import pmdarima as pm
from pmdarima.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

train, test = train_test_split(co2_data.co2.values, train_size=2200)

model = pm.auto_arima(train, seasonal=True, m=52)
preds = model.predict(test.shape[0])

plt.plot(co2_data.co2.values[:2200], train)
plt.plot(co2_data.co2.values[2200:], preds)
plt.show()

pipeline forecasting autoARIMA

Dans ce graphique, la ligne bleue représente les données réelles (données d’entraînement) et la ligne orange représente les prévisions.

Vous pourriez voir l’autorégression vectorielle, ou VAR, comme une alternative multivariée à Arima. Plutôt que de prédire une variable dépendante, vous prédisez plusieurs séries temporelles en même temps. Cela peut être particulièrement utile lorsqu’il existe des relations fortes entre vos différentes séries chronologiques. L’autorégression vectorielle, comme le modèle AR standard, ne contient qu’un composant autorégressif.

Le modèle VARMA est l’équivalent multivarié du modèle ARMA. VARMA est à ARMA ce que VAR est à AR : il ajoute un composant de moyenne mobile au modèle.

Si vous souhaitez aller plus loin, vous pouvez utiliser VARMAX. Le X représente des variables externes (exogènes). Les variables exogènes sont des variables qui peuvent aider votre modèle à faire de meilleures prévisions, mais qui n’ont pas besoin d’être elles-mêmes prévues. L’implémentation de statsmodels VARMAX est un bon moyen de commencer à implémenter des modèles VARMAX.

Des versions plus avancées telles que VARMAX saisonnier (SVARMAX) existent, mais elles deviennent si complexes et spécifiques qu’il sera difficile de trouver des implémentations permettant de le faire facilement et efficacement. Une fois que les modèles deviennent si complexes, il devient difficile de comprendre ce qui se passe à l’intérieur du modèle et il est souvent préférable de commencer à examiner d’autres modèles familiers.

Modèle de régression linéaire

La régression linéaire est sans doute le modèle d’apprentissage automatique supervisé le plus simple. La régression linéaire estime les relations linéaires : chaque variable indépendante a un coefficient qui indique comment cette variable affecte la variable cible.

La régression linéaire simple est une régression linéaire dans laquelle il n’y a qu’une seule variable indépendante. Un exemple de modèle de régression linéaire simple dans des données non chronologiques pourrait être le suivant : ventes de chocolat chaud qui dépendent de la température extérieure (degrés Celsius).

Dans la régression linéaire multiple, plutôt que d’utiliser une seule variable indépendante, vous utilisez plusieurs variables indépendantes. Vous pouvez imaginer que le graphique 2D se transforme en un graphique 3D, où le troisième axe représente la variable Prix. Dans ce cas, vous construirez un modèle linéaire qui explique les ventes en utilisant la température et le prix. Vous pouvez ajouter autant de variables que nécessaire.

Bien sûr, il ne s’agit pas d’un ensemble de données de séries chronologiques : aucune variable temporelle n’est présente. Alors, comment pourriez-vous utiliser cette technique pour les séries chronologiques ? La réponse est assez simple. Plutôt que d’utiliser uniquement la température et le prix dans cet ensemble de données, vous pouvez ajouter les variables année, mois, jour de la semaine, etc.

Si vous créez un modèle supervisé sur des séries chronologiques, vous avez l’inconvénient de devoir faire un peu d’ingénierie des fonctionnalités pour extraire la saisonnalité dans les variables d’une manière ou d’une autre. L’avantage est toutefois que l’ajout de variables exogènes devient beaucoup plus facile.

Voyons maintenant comment appliquer une régression linéaire sur l’ensemble de données CO2. Vous pouvez préparer les données CO2 comme suit :

import numpy as np

# extract the seasonality data
months = [x.month for x in co2_data.index]
years = [x.year for x in co2_data.index]
day = [x.day for x in co2_data.index]

# convert into one matrix
X = np.array([day, months, years]).T

Vous disposez alors de trois variables indépendantes : jour, mois et semaine. Vous pouvez également penser à d’autres variables de saisonnalité comme le jour de la semaine, le numéro de la semaine, etc., mais pour l’instant, allons-y.

Vous pouvez ensuite utiliser scikit-learn pour créer un modèle de régression linéaire et faire des prédictions pour voir ce que le modèle a appris :

from sklearn.linear_model import LinearRegression

# fit the model
my_lr = LinearRegression()
my_lr.fit(X, co2_data.co2.values)

# predict on the same period
preds = my_lr.predict(X)

# plot what has been learned
plt.plot(co2_data.index, co2_data.co2.values)
plt.plot(co2_data.index, preds)

régression linéaire

Random Forest

Le modèle linéaire est très limité : il ne peut s’adapter qu’à des relations linéaires. Parfois cela suffit, mais dans la plupart des cas, il vaut mieux utiliser des modèles plus performants. Random Forest est un modèle très utilisé qui permet d’ajuster des relations non linéaires. Cela reste très simple à utiliser.

La bibliothèque scikit-learn possède le RandomForestRegressor que vous pouvez simplement utiliser pour remplacer le LinearRegression dans le code précédent.

from sklearn.ensemble import RandomForestRegressor

# fit the model
my_rf = RandomForestRegressor()
my_rf.fit(X, co2_data.co2.values)

# predict on the same period
preds = my_rf.predict(X)

# plot what has been learned
plt.plot(co2_data.index, co2_data.co2.values)
plt.plot(co2_data.index, preds)

random forest

Pour l’instant, il suffit de comprendre que cette Random Forest a pu mieux apprendre les données d’entraînement. Dans une partie ultérieure de cet article, vous découvrirez des méthodes plus quantitatives pour l’évaluation des modèles.

XGBoost

Le modèle XGBoost est un troisième modèle qu’il faut absolument connaître. Il existe de nombreux autres modèles, mais Random Forests et XGBoost sont considérés comme des classiques absolus parmi la famille de l’apprentissage automatique supervisé.

XGBoost est un modèle d’apprentissage automatique basé sur le framework d’amélioration de gradient. Ce modèle est un modèle d’ensemble d’apprenants faibles tout comme le Random Forest mais avec un avantage intéressant. Dans le boosting de gradient standard, les arbres individuels sont ajustés en séquence et chaque arbre de décision consécutif est ajusté de manière à minimiser l’erreur des arbres précédents. XGBoost obtient le même résultat mais est toujours capable de faire de l’apprentissage en parallèle.

Vous pouvez utiliser le package XGBoost comme suit :

import xgboost as xgb

# fit the model
my_xgb = xgb.XGBRegressor()
my_xgb.fit(X, co2_data.co2.values)

# predict on the same period
preds = my_xgb.predict(X)

# plot what has been learned
plt.plot(co2_data.index, co2_data.co2.values)
plt.plot(co2_data.index, preds)

XGBoost

Comme vous pouvez le constater, ce modèle s’adapte également très bien aux données. Vous apprendrez comment effectuer l’évaluation du modèle dans la dernière partie de cet article.

Autres modèles à mettre en place

GARCH

GARCH signifie Hétéroscédasticité conditionnelle autorégressive généralisée. Il s’agit d’une approche pour estimer la volatilité des marchés financiers et est généralement utilisée pour ce cas d’utilisation. Il est rarement utilisé pour d’autres cas d’utilisation.

Le modèle fonctionne bien pour cela, car il suppose un modèle ARMA pour la variance d’erreur de la série chronologique plutôt que pour les données réelles. De cette façon, vous pouvez prédire la variabilité plutôt que les valeurs réelles.

Il existe un certain nombre de variantes à la famille de modèles GARCH, par exemple, jetez un œil à ceci. Ce modèle est bon à connaître, mais ne doit être utilisé que lorsque la prévision de la variabilité est nécessaire et il est donc relativement différent des autres modèles présentés dans cet article.

TBATS

TBATS représente la combinaison des composants suivants :

Saisonnalité trigonométrique
Transformation Box-Cox
Erreurs ARMA
Tendance
Composants saisonniers

Le modèle a été créé en 2011 comme solution pour prévoir des séries chronologiques comportant plusieurs périodes saisonnières. Comme il est relativement nouveau et relativement avancé, il est moins répandu et moins utilisé que les modèles de la famille ARIMA.

Une implémentation Python utile de TBATS peut être trouvée dans le package sktime de Python.

Vous verrez désormais trois modèles plus récents qui peuvent également être utilisés à des fins de prévision. Ils sont encore plus complexes à appréhender et à maîtriser et peuvent (ou non) produire de meilleurs résultats, selon les données et les spécificités du cas d’usage.

LSTM (mémoire longue à court terme)

Les LSTM sont des réseaux de neurones récurrents. Les réseaux de neurones sont des modèles d’apprentissage automatique très complexes qui transmettent les données d’entrée via un réseau. Chaque nœud du réseau apprend une opération très simple. Le réseau neuronal se compose de nombreux nœuds de ce type. Le fait que le modèle puisse utiliser un grand nombre de nœuds simples rend la prédiction globale très complexe. Les réseaux de neurones peuvent donc s’adapter à des ensembles de données très complexes et non linéaires.

Les RNN sont un type spécial de réseau neuronal, dans lequel le réseau peut apprendre à partir de données de séquence. Cela peut être utile pour plusieurs cas d’utilisation, notamment pour comprendre des séries temporelles (qui sont clairement des séquences de valeurs dans le temps), mais aussi du texte (les phrases sont des séquences de mots).

Les LSTM sont un type spécifique de RNN. Ils se sont révélés utiles à plusieurs reprises pour la prévision de séries chronologiques. Ils nécessitent certaines données et sont plus compliqués à apprendre que les modèles supervisés. Une fois que vous les maîtrisez, ils peuvent s’avérer très puissants en fonction de vos données et de votre cas d’usage spécifique.

Pour se lancer dans les LSTM, la bibliothèque Keras en Python est un excellent point de départ.

Prophet

Prophet est une bibliothèque de séries chronologiques open source par Facebook. Il s’agit d’un modèle boîte noire, car il générera des prévisions sans trop de spécifications de la part de l’utilisateur. Cela peut être un avantage, car vous pouvez générer presque automatiquement des modèles de prévision sans trop de connaissances ni d’efforts.

D’un autre côté, il existe également un risque : si vous n’y prêtez pas suffisamment attention, vous pourriez très bien produire un modèle qui semble bon pour l’outil de création de modèles automatisé, mais qui, en réalité, ne fonctionne pas bien.

Une validation et une évaluation approfondies des modèles sont recommandées lors de l’utilisation de tels modèles de boîte noire, mais si vous constatez qu’ils fonctionnent bien dans votre cas d’utilisation spécifique, vous y trouverez peut-être beaucoup de valeur ajoutée.

Vous pouvez trouver de nombreuses ressources sur le GitHub de Facebook.

DeepAR

DeepAR est un autre modèle de boîte noire développé par Amazon. Le fonctionnement est en profondeur différent, mais en termes d’expérience utilisateur, il est relativement égal à Prophet. L’idée est encore une fois d’avoir une bibliothèque Python qui fait tout le gros du travail à votre place.

Encore une fois, la prudence est de mise, car on ne peut jamais s’attendre à ce qu’un modèle de boîte noire soit parfaitement fiable. Dans la partie suivante, vous en verrez davantage sur l’évaluation et l’analyse comparative des modèles, ce qui est extrêmement important avec des modèles aussi complexes. Plus un modèle est complexe, plus il peut être erroné !

Une implémentation intéressante et facile à utiliser de DeepAR est disponible dans le package Gluon.

Comment évaluer les modèles

Métriques de séries chronologiques

La première chose à définir lors de la sélection des modèles est la métrique que vous souhaitez examiner. Dans la partie précédente, vous avez vu plusieurs ajustements avec des qualités différentes (pensez à la régression linéaire par rapport à la forêt aléatoire).

Pour aller plus loin dans la sélection de modèles, vous devrez définir une métrique pour évaluer vos modèles. Un modèle très souvent utilisé en prévision est l’erreur quadratique moyenne. Cette métrique mesure l’erreur à chaque instant et en prend le carré. La moyenne de ces erreurs quadratiques est appelée erreur quadratique moyenne. Une alternative souvent utilisée est l’erreur quadratique moyenne : la racine carrée de l’erreur quadratique moyenne.

Une autre mesure fréquemment utilisée est l’erreur moyenne absolue : plutôt que de prendre le carré de chaque erreur, elle prend ici la valeur absolue. L’erreur absolue moyenne en pourcentage est une variante de celle-ci où l’erreur absolue à chaque instant est exprimée en pourcentage de la valeur réelle. Cela donne une mesure sous forme de pourcentage, très facile à interpréter.

Répartition des tests d’entrainement en séries chronologiques

La deuxième chose à prendre en compte lors de l’évaluation du Machine Learning est de considérer qu’un modèle qui fonctionne bien sur les données d’entraînement ne fonctionne pas nécessairement bien sur de nouvelles données hors échantillon. Un tel modèle est appelé modèle de surapprentissage.

Il existe deux approches courantes qui peuvent vous aider à estimer si un modèle généralise correctement : le fractionnement du test et la validation croisée.

La répartition du test de train signifie que vous supprimez une partie de vos données avant d’ajuster le modèle. À titre d’exemple, vous pouvez supprimer les 3 dernières années de la base de données CO2 et utiliser les 40 années restantes pour ajuster le modèle. Vous prévoiriez ensuite les trois années de données de test et mesureriez la métrique d’évaluation de votre choix entre vos prédictions et les valeurs réelles des trois dernières années.

Pour comparer et choisir des modèles, vous pouvez créer plusieurs modèles sur les 40 années de données et effectuer l’évaluation de l’ensemble de tests sur chacun d’eux. Sur la base de ces performances de test, vous pouvez sélectionner le modèle le plus performant.

Bien entendu, si vous construisez un modèle de prévision à court terme, utiliser trois années de données n’aurait pas de sens : vous choisiriez une période d’évaluation comparable à la période que vous prévoiriez en réalité.

Validation croisée des séries chronologiques

Un risque avec la répartition des tests de train est que vous ne mesurez qu’à un moment donné. Dans les données non chronologiques, l’ensemble de test est généralement généré par une sélection aléatoire de points de données. Cependant, dans les séries temporelles, cela ne fonctionne pas dans de nombreux cas : lorsque des séquences sont utilisées, vous ne pouvez pas supprimer un point de la séquence tout en vous attendant à ce que le modèle fonctionne.

Il est donc préférable d’appliquer les répartitions des tests de train de séries chronologiques en sélectionnant la période finale comme ensemble de test. Le risque ici est que cela puisse mal se passer si vos dernières règles ne sont pas très fiables. Au cours des dernières périodes de covid, on peut imaginer que de nombreuses prévisions économiques se sont complètement détériorées : les tendances de fond ont changé.

La validation croisée est une méthode qui effectue une évaluation répétée des tests de train. Plutôt que de diviser un test de train, il en crée plusieurs (le nombre exact est un paramètre défini par l’utilisateur). Par exemple, si vous utilisez une validation croisée en trois volets, vous diviserez votre ensemble de données en trois parties égales. Vous ajusterez ensuite trois fois le même modèle sur les deux tiers de l’ensemble de données et utiliserez l’autre tiers pour l’évaluation. En fin de compte, vous disposez de trois scores d’évaluation (chacun sur un ensemble de tests différent) et vous pouvez utiliser la moyenne comme mesure finale.

En faisant cela, vous évitez de sélectionner par hasard un modèle qui fonctionne sur l’ensemble de test : vous êtes désormais assuré qu’il fonctionne sur plusieurs ensembles de test.

Toutefois, dans les séries chronologiques, vous ne pouvez pas appliquer une sélection aléatoire pour obtenir plusieurs ensembles de tests. Si vous faisiez cela, vous vous retrouveriez avec des séquences avec de nombreux points de données manquants.

Une solution peut être trouvée dans la validation croisée des séries chronologiques. Ce qu’il fait, c’est créer plusieurs ensembles de tests de train, mais chacun des ensembles de tests correspond à la fin de la période. Par exemple, la première répartition des tests de train pourrait être construite sur les 10 premières années de données (5 trains, 5 tests). Le deuxième modèle serait réalisé sur les 15 premières années de données (10 trains, 5 tests), etc. Cela peut bien fonctionner mais présente l’inconvénient que chacun des modèles n’utilise pas le même nombre d’années dans les données de formation.

Une alternative est de faire un fractionnement glissant (toujours 5 ans d’entraînement, 5 ans de test), mais ici l’inconvénient est que vous ne pouvez jamais utiliser plus de 5 ans pour les données d’entraînement.

Expériences sur des modèles de séries chronologiques

En conclusion, lors de la sélection de modèles de séries chronologiques, il est essentiel de définir les questions suivantes avant de commencer à expérimenter :

  • Quelle métrique utilisez-vous ?
  • Quelle période souhaitez-vous prévoir ?
  • Comment vous assurer que votre modèle fonctionne sur les futurs points de données qui n’ont pas été vus par le modèle ?

Une fois que vous avez la réponse aux questions susmentionnées, vous pouvez commencer à essayer différents modèles et utiliser la stratégie d’évaluation définie pour sélectionner et améliorer les modèles.

Aller plus loin

Concernant les choix évoquer dans la section précédente, je vous invite à lire les tutoriels correspondants. Bonne lecture !