Module 6 — Lissage exponentiel et Prophet
SARIMA suppose une structure stationnaire et gère mal les saisons longues et les changements de régime. Ce module présente deux familles qui viennent en complément : le lissage exponentiel, historique et remarquablement robuste, et Prophet, plus récent, très populaire dans l'industrie et souvent mal utilisé. Les deux se distinguent par leur philosophie autant que par leurs résultats.
Lissage exponentiel : trois briques emboîtées
L'idée de base est simple : la meilleure prévision est une moyenne des valeurs passées, mais où les valeurs récentes comptent davantage. Un lissage exponentiel simple utilise une seule composante de niveau mise à jour à chaque instant :
Le paramètre contrôle la vitesse d'adaptation : proche de 1, la prévision suit la dernière observation ; proche de 0, elle lisse fortement. On l'appelle parfois « moyenne mobile exponentielle » (EMA en anglais), et il constitue le squelette de toute la famille.
Holt ajoute une composante de tendance mise à jour au même rythme :
La prévision à horizon devient . Cette méthode gère bien les séries à tendance sans saisonnalité.
Holt-Winters ajoute enfin une composante saisonnière de période , en additif ou en multiplicatif. C'est la forme utile pour notre fil rouge : niveau, tendance, saisonnalité hebdomadaire, chacun avec son paramètre de lissage.
from statsmodels.tsa.holtwinters import ExponentialSmoothing
train_ventes = ventes.loc[:"2024-12-31", "quantite"]
hw = ExponentialSmoothing(
train_ventes,
trend="add",
seasonal="mul", # amplitude qui croit avec le niveau : multiplicatif
seasonal_periods=7, # saison hebdomadaire
initialization_method="estimated",
).fit(optimized=True)
prevision_hw = hw.forecast(28)
Les paramètres , , sont ajustés automatiquement par maximum de vraisemblance. La spécification seasonal="mul" correspond au diagnostic du module 2 sur notre fil rouge — l'amplitude hebdomadaire varie avec le niveau annuel.
Ce que le lissage exponentiel fait bien, ce qu'il fait mal
Bien : les séries à saison courte, la robustesse face à des données un peu bruitées, la rapidité d'ajustement, et une remarquable capacité à ne pas s'effondrer sur des séries qui changent doucement de régime. Sur des concours comme M3 et M4, les méthodes de la famille sont régulièrement dans les meilleures références.
Mal : les saisons longues (365) donnent des paramètres saisonniers instables, les jours fériés ne sont pas modélisables sans hack, et il n'y a pas de mécanisme naturel pour intégrer des régresseurs externes. C'est là que Prophet entre en scène.
Prophet : une décomposition additive à la mode logicielle
Prophet, publié par Facebook en 2017, propose une décomposition additive assez proche de STL mais orientée prévision :
où est la tendance, la saisonnalité modélisée par une base de Fourier (avantage : gère nativement les saisons multiples et fractionnaires), un terme jour férié actif seulement à certaines dates, et un bruit. Trois innovations pratiques expliquent sa popularité.
La tendance à points de rupture : Prophet suppose que la pente peut changer à des dates détectées automatiquement (25 points par défaut, avec une pénalité), ce qui gère naturellement les inflexions comme un pic de vaccination ou un changement de gamme. Cette flexibilité peut être excessive — c'est un point d'attention majeur.
Les jours fériés natifs : on lui fournit un tableau (date, effet, fenêtre) et il apprend l'effet propre de chaque événement, y compris les jours précédents et suivants (utile pour l'anticipation d'achats avant Noël).
L'ergonomie logicielle : Prophet a une API à la scikit-learn, une seule fonction fit, predict, et il produit un DataFrame interprétable avec les composantes visualisées séparément. C'est ce qui a fait son succès dans les équipes qui n'avaient pas de statisticien.
from prophet import Prophet
import pandas as pd
# Prophet attend deux colonnes : ds (date) et y (valeur).
df = train_ventes.rename("y").to_frame().reset_index().rename(columns={"date": "ds"})
feries_fr = pd.DataFrame({
"holiday": "ferie_fr",
"ds": pd.to_datetime([
"2022-12-25", "2023-01-01", "2023-05-01", "2023-05-08",
"2023-12-25", "2024-01-01", "2024-05-01", "2024-05-08",
]),
"lower_window": -1, "upper_window": 1,
})
modele = Prophet(
growth="linear",
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False,
seasonality_mode="multiplicative",
changepoint_prior_scale=0.05, # plus petit = tendance plus rigide
holidays=feries_fr,
)
modele.fit(df)
futur = modele.make_future_dataframe(periods=28, freq="D", include_history=False)
prevision_prophet = modele.predict(futur)[["ds", "yhat", "yhat_lower", "yhat_upper"]]
Les pièges réels de Prophet
Ces pièges sont documentés dans plusieurs études indépendantes et il est important de les connaître avant de choisir Prophet en production.
Trop de flexibilité de tendance : la valeur par défaut de changepoint_prior_scale (0,05) suffit sur des séries stables mais surajuste très vite sur des séries volatiles. Sur notre fil rouge, laisser cette valeur donne une tendance qui « suit » chaque bosse récente, ce qui rend les prévisions à 28 jours instables. Le régler à 0,01 ou 0,02 est presque toujours utile.
Saisonnalité multiplicative mal identifiée : Prophet ne détecte pas seul si la saisonnalité doit être additive ou multiplicative. Sur des séries dont l'amplitude croît avec le niveau (le cas typique en vente), l'oubli du mode multiplicatif produit des intervalles absurdement asymétriques.
Intervalles trop étroits : Prophet utilise une simulation par tirages Monte-Carlo mais ne prend pas en compte l'incertitude sur la tendance dans la sortie standard. Les intervalles sont donc optimistes ; il faut activer mcmc_samples > 0 pour une inférence bayésienne complète, ce qui coûte plusieurs minutes de plus.
Modèle univarié : Prophet ne gère pas de régresseurs externes par défaut. La méthode add_regressor existe mais son intégration reste limitée, et pour des interactions complexes le module 7 sera plus adapté.
Une comparaison à conserver en tête : sur les benchmarks M4 (100 000 séries), Prophet n'apparaît pas dans le top 10, et Holt-Winters bat souvent Prophet sur les séries longues sans changements structurels. Prophet a des atouts, mais ce n'est pas un choix par défaut universel.
Utiliser Prophet à bon escient
La bonne décision est de le déployer là où il excelle vraiment : sur des séries à saison annuelle claire (données quotidiennes ou hebdomadaires), avec des jours fériés impactants, et où l'analyste souhaite un modèle interprétable par composantes. La visualisation plot_components (composantes tendance, hebdo, annuelle, fériés) est un excellent support de discussion métier.
À l'inverse, sur des séries courtes, très bruitées, ou dont la structure est purement autorégressive (peu de saisonnalité, forte dépendance aux dernières valeurs), un lissage exponentiel simple ou un SARIMA feront mieux et coûteront moins cher.
Prophet ne doit pas être choisi parce qu'il a une API sympathique. Il doit être choisi parce que ses hypothèses (tendance à ruptures, saisonnalités Fourier, jours fériés natifs) correspondent aux caractéristiques de votre série. C'est une petite phrase, mais elle épargne à beaucoup d'équipes un modèle en production qui décroche sans que personne comprenne pourquoi.
Comparaison au tableau
Complétons la deuxième ligne du tableau du module 4 :
def mae(y_vrai, y_prevu):
return np.mean(np.abs(np.asarray(y_vrai) - np.asarray(y_prevu)))
test = ventes.loc["2025-01-01":"2025-01-28", "quantite"].values
print(f"Holt-Winters : MAE = {mae(test, prevision_hw.values):.1f}")
print(f"Prophet : MAE = {mae(test, prevision_prophet['yhat'].values):.1f}")
Sur notre fil rouge, Holt-Winters bat souvent Prophet à horizon court (7-14 jours) et Prophet reprend l'avantage à horizon long (28+ jours), grâce à la saisonnalité annuelle. C'est un enseignement récurrent : la méthode gagnante dépend de l'horizon, et il n'existe pas de « meilleur modèle » sans référence à l'usage.
Pour un projet nouveau, ajustez trois modèles en parallèle : SARIMA (module 5), Holt-Winters, Prophet. Comparez-les sur les mêmes 28 jours de test, à la même métrique. Choisissez le gagnant, puis vérifiez que son avance est stable sur plusieurs origines glissantes (module 9). Un modèle qui gagne sur un seul horizon peut perdre à toutes les autres origines : la stabilité est plus importante que le score ponctuel.
En résumé
- Le lissage exponentiel est simple, robuste et rapide ; Holt-Winters ajoute niveau, tendance et saisonnalité.
- Prophet décompose additivement, gère nativement les saisons multiples et les jours fériés, mais surajuste par défaut et fournit des intervalles optimistes.
- Le bon usage de Prophet : séries à saison annuelle marquée et jours fériés impactants, avec
changepoint_prior_scaleréglé plus bas que le défaut. - La méthode gagnante dépend de l'horizon ; comparer plusieurs candidats sur la même période et la même métrique reste la seule voie sûre.
Module suivant : les variables de calendrier et les régresseurs externes, quand on quitte l'univariée pour une régression enrichie.