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.
Sommaire
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
- TreeExplainer dès que le modèle le permet (exact, rapide, déterministe).
- Calcul batch nocturne, stockage du top 5 par prédiction.
- Monitoring de la distribution des importances globales : une dérive des explications signale souvent un data drift avant même les métriques.
- 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.