Read our article on

class="lazyload

.

Comment choisir les bonnes visualisations et les mettre en œuvre dans Streamlit pour mieux déboguer vos modèles de prévision ?

TL ; DR

Lorsqu'il s'agit de modèles de prévision, la meilleure approche est souvent d'itérer en permanence, en ajoutant des sources data , en améliorant l'ingénierie des caractéristiques, en peaufinant les paramètres du modèle... La plupart du temps, les scientifiques de Data ont tendance à se fixer sur un seul KPI(c.-à-d. RMSE, précision des prévisions...). Il y a souvent beaucoup plus d'informations derrière ces KPI qui doivent être analysées pour améliorer la prédiction. Construire un outil de visualisation approprié est un excellent moyen de plonger en profondeur dans le comportement du modèle, de repérer rapidement les points faibles de votre modèle, et donc de gagner en précision de manière efficace.

Cet article développera les questions clés que l'on doit se poser lors de l'évaluation d'un modèle de prévision, puis présentera les visualisations indispensables pour répondre à ces questions et enfin proposera une implémentation rapide sous un outil unifié pour rassembler toutes ces visualisations à l'aide de Streamlit.

Contexte

Cet article résume ce que nous avons appris en construisant un outil de visualisation unifié pour aider Data Scientists, Software Engineers, Product Owners & Demand Planner (experts commerciaux) à développer des modèles de prévision des ventes pour plus de 10 unités commerciales dans une entreprise de produits alimentaires et de boissons. Nos modèles établissaient des prévisions au niveau quotidien x entrepôt x produit, pour les 14 semaines à venir. Ils ont été développés à l'aide de méthodes de boosting et prennent en compte les caractéristiques des produits, les ventes historiques, les événements et les promotions data.

Questions clés à poser lors de l'évaluation d'un modèle de prévision

1. Le modèle est-il bon par rapport à la base de référence ?
Il est très utile d'avoir accès aux prévisions actuelles (par exemple les prévisions du planificateur de la demande) sur le même périmètre. Cela permet de bien comprendre le comportement de l'entreprise sur une période, un produit ou un lieu spécifique. Plus vous interrogez l'entreprise, plus vous obtenez d'informations et plus vous pouvez mettre en œuvre les bonnes fonctionnalités.

2. Chasse aux sur ou sous-prédictions et baisse de la précision des prévisions
Les questions incontournables sont les suivantes : Ai-je saisi la tendance globale ? Le modèle prend-il en compte les événements récurrents connus tels que les vacances, les fermetures d'entrepôts, les vacances scolaires ? Y a-t-il des baisses de précision sur des périodes particulières ?
Pourquoi est-ce important ?

  • Si le modèle prévoit trop de choses, il induit une augmentation du stock et donc des coûts de stock.
  • Si le modèle sous-estime les prévisions, il induit des périodes de rupture de stock, ce qui fait manquer des opportunités de vente et diminue la satisfaction des clients.

Repérer ces événements est un excellent moyen d'obtenir des prévisions plus précises. Ces événements sont souvent bien connus des planificateurs de la demande et assez simples à mettre en œuvre dans votre modèle lorsque vous disposez des informations nécessaires. Par exemple, dans bon nombre de nos unités commerciales, certains produits sont vendus pour les déjeuners scolaires. L'introduction et la préparation d'une caractéristique représentant les vacances scolaires ont permis d'améliorer considérablement notre précision sur ces périodes particulières.

3. Traiter les spécificités des produits
Mes performances sont-elles homogènes sur mes marques / familles de produits ? Y a-t-il d'autres distinctions entre mes produits (produits vendus uniquement pendant les périodes de promotion, best-sellers vs. produits à faible volume, produits ) ?
Pourquoi est-ce important ?

  • Valider le bon comportement du modèle sur l'ensemble du périmètre. En fonction des besoins de l'entreprise, une précision minimale peut être exigée sur l'ensemble du périmètre.
  • Identifier les produits critiques, qui peuvent être analysés plus précisément, et ainsi gagner en précision.

Ces questions vous aident à comprendre l'entreprise plus précisément. Par exemple, la division des modèles en fonction de l'importance des produits en termes de volume permet souvent d'accroître les performances. En effet, la demande de produits courants est très différente de la demande de produits promotionnels ou de produits moins courants, qui peuvent être fortement corrélés avec les périodes de promotion ou avoir un profil de vente très épars. Dans la plupart des cas, nous avons formé des modèles distincts pour traiter ces différents types de produits.

4. Les effets constitutifs sont-ils correctement pris en compte ?
Le modèle saisit-il correctement les effets de promotion ? Existe-t-il des effets de cannibalisation ? Le modèle s'adapte-t-il bien aux phénomènes exogènes (ex : grèves) ?
Pourquoi est-ce important ?

  • Dans la plupart des cas, les promotions jouent un rôle important pour stimuler la demande et peuvent entraîner des hausses importantes des ventes data.
  • Cela peut conduire à des phénomènes de gaspillage et de rupture de stock importants.
  • Un modèle plus réaliste prenant en compte des effets sophistiqués sera plus probablement adopté par vos futurs utilisateurs.

N'hésitez pas à vous référer à l'article précédent de notre série Prévisions pour aborder la promotion data: 5 conseils pour mieux prendre en compte la promotion data

Comment analyser votre modèle de prévision : des macro-IPC à l'évaluation sur un périmètre spécifique

Quelles sont les visualisations indispensables ?
Pour construire votre outil d'évaluation, vous devez combiner deux éléments :

  • Une partie du filtre pour évaluer la performance sur un champ d'application spécifique
  • Une série de visualisations pour repérer rapidement les axes d'amélioration
class="lazyload

La partie filtre doit permettre de filtrer sur plusieurs axes : la période d'analyse, les lieux (détaillant, entrepôt...), les produits (un ensemble de produits), et enfin les catégories de produits.
Nous recommandons au moins les 4 visualisations suivantes :

  • Tout d'abord, l' évolution du volume prévu, avec les informations sur les ventes réelles. C'est l'information la plus compréhensible et la première à examiner. Il vous aide à comprendre votre modèle : mon modèle suit-il la tendance globale ? Prévoit-il trop ou pas assez ? Est-ce que je capte les pics et les chutes ?

  • Deuxièmement, l'évolution de la précision des prévisions. Selon le mode de calcul de la précision des prévisions, ce chiffre peut être nécessaire pour compléter le premier. Ce chiffre vous aide à repérer rapidement les périodes difficiles dans vos prévisions, et vous indique donc sur quelle période vous devez vous pencher.
  • Troisièmement, quelques indicateurs de performance bien représentés pour calculer la précision de vos prévisions à différents niveaux. Nous vous recommandons de répartir votre précision à différents niveaux : entrepôts, catégories de produits, produits, et même de mélanger ces axes d'analyse (par exemple pour créer une carte thermique de la précision des prévisions pour chaque entrepôt x catégories de produits). Encore une fois, cela vous aide à trouver les localisations ou les produits critiques.
  • La dernière est l'évaluation de la contribution. Pour comprendre précisément le fonctionnement de votre modèle, vous devez évaluer les caractéristiques les plus utilisées. Les modèles classiques de TS (ARIMA & Co., Prophet, ...) proposent nativement une décomposition des caractéristiques. Pour les méthodes de boosting (XGBoost, CatBoost, LightGBM...) des frameworks comme SHAP sont très utiles pour modéliser précisément le comportement de chaque caractéristique. La représentation de ces contributions sur les périodes permet d'évaluer quel phénomène est à l'origine de la prévision à quel moment.

Comment commencer à construire le tableau de bord de votre studio de prévision en utilisant Streamlit ?

Streamlit est une bibliothèque python open source qui permet de créer des applications web partageables en quelques minutes et qui continue de gagner en popularité au sein de la communauté scientifique Data . Dans cet article, nous ne présenterons pas l'outil car de nombreux articles sont déjà disponibles sur ce sujet, mais nous nous concentrerons sur la mise en œuvre facile d'une visualisation.
Le choix d'utiliser Streamlit pour ce type de projet a été motivé par plusieurs conditions préalables :

  • Streamlit rend le tableau de bord MVP très facile à mettre en place.
  • Entièrement intégrable dans un projet scientifique Data . Comme vos pages Streamlit seront écrites en Python, vous pourrez utiliser les fonctions de votre projet principal. Par exemple, si vous avez développé une librairie pour accéder à vos data- préparations, tables de référence et prédictions, vous pourrez les utiliser directement dans le code de votre tableau de bord.
  • Partageable avec de nombreux utilisateurs, en exposant votre tableau de bord sur un port de votre machine distante ou en le déployant sur des solutions comme App Engine, Cloud Run ...

1. Structure globale de votre tableau de bord de prévision
Avant de se plonger dans la mise en œuvre, le préalable à la construction d'un tableau de bord est de dessiner les parties de votre application.

Pour une mise en œuvre propre, vous pouvez diviser votre code en plusieurs parties :

  • Le tableau de bord principal que vous pouvez lancer avec streamlit run forecasting_studio_app.py
  • Les pages distinctes (AED simple sur votre ensemble de données d'apprentissage, analyse des prévisions, contribution des caractéristiques,...)
  • Scripts Lib pour rassembler vos data-préparation / chiffres pour chaque page

├── config.py
├── forecasting_studio
│ ├─── forecast_analysis
│ │ └── fig_forecast_analysis.py
│ └─── pages
│ └── forecast_analysis.py
└── forecasting_studio_app.py

La page principale présente la structure globale de votre application, c'est-à-dire la disposition globale de votre application : dans notre cas, une disposition large, et une barre latérale pour afficher le nom de votre application et les pages disponibles.

importation streamlit comme st
from forecasting_studio.pages import forecast_analysis
PAGES =
def write_page(page) :
page.write()
def main() :
st.sidebar.title("Forecasting Studio")
selection = st.sidebar.selectbox("", list(PAGES.keys()))
page = PAGES[sélection]
write_page(page)
si __name__ == "__main__":
st.set_page_config(layout="wide")
main()

Le fichier de configuration, dans lequel nous rassemblons les couleurs et les différentes configurations pour toutes vos figures Plotly.

X_AXIS_TEMPLATE = dict(showline=True,
showgrid=False,
showticklabels=True,
linecolor="grey",
largeur deligne=2,
ticks="outside",
tickfont=dict(family="Arial",size=12, color="rgb(82, 82, 82)"))
Y_AXIS_TEMPLATE = dict(showline=True,
showgrid=True,
linecolor="grey",
gridcolor="lightgrey")
LEGEND = dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right",x=1)
COLORDISCRETE = ["#002244", "#ff0066", "#66cccc", "#ff9933", "#337788",
"#429e79", "#474747", "#f7d126", "#ee5eab", "#b8b8b8"].

2.Construction de la visualisation de l'évolution de la précision des prévisions
Tout d'abord, nous allons rassembler nos figures Plotly dans un script :

importation pandas comme pd
de typage importer Liste
import plotly.graph_objects as go
from config import COLORDISCRETE, LEGEND, X_AXIS_TEMPLATE, Y_AXIS_TEMPLATE
def fig_evolution_of_fa(forecasts_per_target_date: pd.DataFrame,
events: List = None) -> go.Figure :
"Figure représentant l'évolution de la précision des prévisions
sur la période de backtest
Paramètres
----
forecasts_per_target_date : pd.DataFrame
Ensemble de données prévisionnelles contenant au moins 3 colonnes :
- 'target_date' : la date pour laquelle vous faites des prévisions
- 'forecast_accuracy' : votre ICP de précision
- 'week_nb' : identifiant de la semaine (de 0 à 52)
- (facultatif) 'demand_planner_forecast_accuracy' : votre prévision de base
Clé primaire : 'target_date'
événements : Liste, optionnel
une liste de couples de dates, représentant des périodes, par défaut None
"""
fig_fa_score = go.Figure()
fig_fa_score.add_trace(
go.Scatter(
name="Model Forecast Accuracy",
x=forecasts_per_target_date['target_date'],
y=forecasts_per_target_date['forecast_accuracy'],
hovertext=forecasts_per_target_date['week_nb'],
marker_color=COLORDISCRETE[0]))
# Si vous disposez d'une ligne de base, vous pouvez ajouter une colonne supplémentaire à votre
# jeu de données pour l'afficher sur un graphique linéaire
if 'demand_planner_forecast_accuracy' in forecasts_per_target_date.columns:
fig_fa_score.add_trace(
go.Scatter(
name="Précision des prévisions des planificateurs de la demande",
x=forecasts_per_target_date['target_date'],
y=forecasts_per_target_date['demand_planner_forecast_accuracy'],
hovertext=forecasts_per_target_date['week_nb'],
marker_color=COLORDISCRETE[2]))
fig_fa_score.update_xaxes(range=(min(forecasts_per_target_date['target_date']),
max(forecasts_per_target_date['target_date'])))
fig_fa_score.update_traces(mode='lines+markers', line_shape='spline')
fig_fa_score.update_layout(
xaxis_title="Date cible",
yaxis_title="FA Score",
plot_bgcolor='white',
legend=LEGEND,
xaxis=X_AXIS_TEMPLATE,
yaxis=Y_AXIS_TEMPLATE)
si les événements:
fig_fa_score.update_layout(
shapes=[get_vertical_filled_area(segment[0], segment[1], 'rgb(102, 204, 204)')
pour segment dans événements])
retour fig_fa_score
def get_vertical_filled_area(start: float, end: float, color: str = "blue") -> dict:
"""Retourne une dictée de forme verticale tracée, utilisée pour mettre en évidence des événements sur des figures""
return dict(type="rect",
xref="x",
yref="paper",
x0=début,
y0=0,
x1=fin,
y1=1,
fillcolor=color,
layer="below",
largeur_de_ligne=0,
opacité=0,5)

Nous allons enfin mettre en place notre page d'analyse des prévisions, qui chargera notre jeu de données, répartira nos chiffres sur différentes colonnes, ...

importation pandas comme pd
importation streamlit comme st
from forecasting_studio.forecast_analysis.fig_forecast_analysis import fig_evolution_of_fa
def write() -> None:
st.title('Analyse des prévisions')
df = pd.read_csv('your_dataset.csv')
# Vous pouvez charger ici des événements personnalisés à afficher
# ex : events = [('2019-07-01', '2019-09-01'), ('2020-07-01', '2020-09-01')]
événements = Aucun
evo_cont1, evo_cont2 = st.beta_columns(2)
evo_cont1.subheader('Evolution de la précision des prévisions')
fig_evo_fa = fig_evolution_of_fa(df, events)
evo_cont1.plolty_fig(fig_evo_fa)
si __name__ == "__main__" :
écrire()

Tadam ! Voici notre application :

class="lazyload

Jetons un coup d'œil à la figure présentée. En ce qui concerne les points précédents que nous avons discutés, voici les points clés de notre figure :

  • Tout d'abord, il nous permet de repérer rapidement les semaines pour lesquelles notre modèle n'est pas précis : Le mois de décembre semble être un mois compliqué à prévoir. La fin de notre période de backtest est également un problème pour notre modèle. Nous devons discuter avec l'entreprise pour comprendre quels sont les effets qui régissent ces semaines, et adapter le modèle en conséquence.
  • La figure comporte également un paramètre appelé "events", une liste de paires de dates représentant des événements globaux et permettant de mettre en évidence des événements tels que les vacances scolaires. Nous pouvons rapidement constater que notre pire semaine est une semaine de vacances. Peut-être que certains entrepôts ont fermé pendant cette période, ou que les clients ont commandé plus que d'habitude pour préparer le début de l'année... Là encore, les chefs d'entreprise peuvent certainement ajouter un œil externe sur ces semaines.
  • Comme vous pouvez le voir, deux séries sont affichées. Dans notre cas, elles représentent la précision de notre modèle et de celui de Demand Planners sur la même période. En ce qui concerne la figure, nous pouvons voir que les pires semaines sont également des semaines compliquées pour Demand Planners. La chute la plus importante en avril a été bien prévue par notre modèle. La fin de la période de backtest semble plus compliquée pour notre modèle, alors que la précision des planificateurs de demande semble stable.

Conclusion :

  • L'AED est essentielle pour évaluer votre modèle de prévision
  • Regrouper tous vos chiffres dans un tableau de bord unique vous permet de vous concentrer sur les itérations, et donc de gagner en efficacité.
  • Le tableau de bord vous permet de vous concentrer sur les domaines clés et de repérer rapidement les axes d'amélioration.
  • Vous venez de mettre en place la structure de base de votre tableau de bord, allez-y et ajoutez de nouveaux chiffres !

Une fois que vous avez construit votre outil de visualisation, il est temps de le déployer. Voici une excellente ressource pour partager votre application : Comment déployer et sécuriser votre application Streamlit dans GCP ?

Merci beaucoup d'avoir lu jusqu'à présent, n'hésitez pas à nous contacter si vous avez des questions. Vous pouvez en savoir plus sur nos projets en visitant notre blog.

class="lazyload

Medium Blog by Artefact.

This article was initially published on Medium.com.
Follow us on our Medium Blog !