6 min de lecturePar Camille Moreau

SHAP en production : ce que la doc ne dit pas

Coût de calcul, stabilité des explications, pièges de corrélation — un an de retour d'expérience.

Le coût caché du calcul

En notebook, SHAP est magique : deux lignes, un beau graphique. En production, la même explication calculée à la volée peut ajouter plusieurs secondes à chaque prédiction — inacceptable pour une API temps réel.

La solution que la doc mentionne à peine : ne jamais calculer SHAP en ligne. Nous calculons les explications en batch, en différé, et nous les stockons à côté des prédictions :

import shap

explainer = shap.TreeExplainer(model)

# Batch nocturne sur les prédictions du jour — pas dans le chemin critique
shap_values = explainer.shap_values(X_scored_today)

# On ne stocke que le top 5 des contributions par prédiction
top5 = {
    row["prediction_id"]: top_k_features(shap_values[i], feature_names, k=5)
    for i, row in enumerate(X_scored_today.iterrows())
}
store.save(top5)  # table annexe, jointe à la demande

Résultat : l'explication est disponible en quelques millisecondes, au prix d'un calcul différé que personne ne remarque.

Des explications qui bougent

Deuxième surprise : relancez le calcul sur les mêmes données avec un échantillon de fond différent, et les contributions changent — parfois beaucoup. Une explication instable est pire qu'aucune explication, car elle inspire une confiance imméritée.

  • Figez l'échantillon de référence (background dataset) avec le modèle, et versionnez-le comme lui.
  • Augmentez les échantillons pour les estimateurs approximatifs (KernelSHAP), ou préférez TreeExplainer, exact et rapide pour les arbres.
  • Testez la stabilité en CI : recalculer deux fois doit donner le même top 5, sinon alerte.

Le piège de la corrélation

C'est le point le moins compris : SHAP explique comment le modèle utilise les variables, pas la causalité. Si code_postal est corrélé au revenu, SHAP peut attribuer au code postal une importance qui « appartient » au revenu — et votre interlocuteur métier en conclura des choses fausses.

La phrase à afficher partout

Dans nos dashboards, chaque explication SHAP est accompagnée de cette mention : « Ces contributions décrivent le raisonnement du modèle, pas l'effet réel des facteurs. » Cette phrase nous a évité au moins deux mauvaises décisions.

Ma configuration de production

  1. TreeExplainer dès que le modèle le permet (exact, rapide, déterministe).
  2. Calcul batch nocturne, stockage du top 5 par prédiction.
  3. Monitoring de la distribution des importances globales : une dérive des explications signale souvent un data drift avant même les métriques.
  4. Vulgarisation systématique : jamais de graphique brut pour le métier, toujours trois phrases générées à partir du top 5.

SHAP est un excellent outil — à condition de le traiter comme un composant de production, pas comme une cellule de notebook.