Aller au contenu principal

Explicabilite des modeles avec LIME et SHAP

Theorie 60 min

Pourquoi l'explicabilite est importante

Imaginez qu'une banque rejette votre demande de credit. Vous demandez pourquoi, et on vous repond : « L'algorithme a dit non. » Accepteriez-vous cela ? Bien sur que non — vous voudriez savoir quels facteurs ont conduit a la decision. C'est le cœur de l'explicabilite des modeles.

L'analogie du diagnostic medical

Un bon medecin ne se contente pas de dire « vous avez la condition X ». Il explique :

  • Quels symptomes ont conduit au diagnostic (importance des caracteristiques)
  • Son niveau de confiance (probabilite de prediction)
  • Les alternatives envisagees (autres classes)
  • Ce qui changerait le diagnostic (raisonnement contrefactuel)

Un modele IA explicable fonctionne de la meme maniere — il vous indique non seulement ce qu'il a predit, mais pourquoi.

Quatre piliers de l'explicabilite

PilierDescriptionPartie prenante
ConfianceLes utilisateurs et les parties prenantes doivent faire confiance aux decisions du modeleUtilisateurs finaux, direction
ReglementationLes lois exigent des explications pour les decisions automatisees (loi europeenne sur l'IA, RGPD article 22)Juridique, conformite
DebogageComprendre pourquoi un modele echoue aide a le corrigerData scientists, ingenieurs ML
EquiteDetecter si un modele discrimine en fonction d'attributs protegesEquipes ethique, auditeurs
Loi europeenne sur l'IA — L'imperatif legal

La loi europeenne sur l'IA (en vigueur en 2025) classe les systemes d'IA par niveau de risque. Les systemes a haut risque (sante, finance, recrutement, application de la loi) DOIVENT fournir des explications pour leurs decisions. Le non-respect peut entrainer des amendes allant jusqu'a 35 millions d'euros ou 7 % du chiffre d'affaires mondial.


Modeles boite noire vs. boite blanche

Modeles boite blanche (intrinsequement interpretables)

Ces modeles sont suffisamment simples pour etre compris directement :

ModeleComment interpreter
Regression lineaireLes coefficients montrent l'impact direct des caracteristiques : price = 200 × sqft + 50000 × bedrooms - 10000 × age
Arbre de decisionSuivre les branches de l'arbre : si age > 30 ET revenu > 50k → approuver
Regression logistiqueLes rapports de cotes montrent comment chaque caracteristique modifie la probabilite

Modeles boite noire (opaques)

Ces modeles sont trop complexes pour etre inspectes directement :

ModelePourquoi c'est une boite noire
Random ForestDes centaines d'arbres, chacun avec des divisions differentes
Gradient Boosting (XGBoost, LightGBM)Des milliers d'arbres sequentiels, interactions complexes
Reseaux de neuronesDes millions de parametres, transformations non lineaires
Modeles d'ensembleCombinaison de plusieurs modeles differents

Le compromis explicabilite-precision

Voir le spectre d'interpretabilite
La solution

Les methodes d'explicabilite post-hoc comme LIME et SHAP permettent d'expliquer les modeles boite noire sans sacrifier la precision. Vous obtenez le meilleur des deux mondes : des modeles puissants + des explications interpretables.


Explications locales vs. globales

TypeQuestion reponduePorteeExemple
Locale« Pourquoi le modele a-t-il predit ce resultat precis pour cette entree precise ? »Une seule prediction« Ce credit a ete refuse car le ratio dette/revenu du demandeur est de 0,85 »
Globale« Quelles caracteristiques comptent en general pour toutes les predictions ? »Ensemble du jeu de donnees« Le revenu et le score de credit sont les deux caracteristiques les plus importantes globalement »

LIME — Local Interpretable Model-agnostic Explanations

Comment LIME fonctionne

LIME explique les predictions individuelles en construisant un modele simple et interpretable (comme une regression lineaire) autour du point de prediction.

L'intuition : Meme si le modele global est complexe, la frontiere de decision pres d'un point specifique peut etre approximativement lineaire.

Algorithme LIME etape par etape

Analogie : Expliquer une decision a un enfant

Imaginez expliquer a un enfant de 5 ans pourquoi vous avez choisi un restaurant :

  1. Pensez a ce que vous avez considere (caracteristiques) : prix, distance, note, cuisine
  2. Modifiez legerement un facteur a la fois (perturbations) : « Et si c'etait moins cher ? Et si c'etait plus loin ? »
  3. Observez comment votre decision change (predictions sur les perturbations)
  4. Resumez en termes simples (modele lineaire) : « Je l'ai surtout choisi parce qu'il est proche et pas cher »

Implementation LIME

import lime
import lime.lime_tabular
import numpy as np
import joblib

model = joblib.load("models/model_v1.joblib")

X_train = np.load("data/X_train.npy")
feature_names = ["feature_1", "feature_2", "feature_3", "feature_4", "feature_5"]
class_names = ["Class 0", "Class 1"]

explainer = lime.lime_tabular.LimeTabularExplainer(
training_data=X_train,
feature_names=feature_names,
class_names=class_names,
mode="classification",
random_state=42,
)

instance = X_train[0]

explanation = explainer.explain_instance(
data_row=instance,
predict_fn=model.predict_proba,
num_features=5,
num_samples=1000,
)

print("Prediction:", model.predict([instance])[0])
print("Prediction probabilities:", model.predict_proba([instance])[0])
print("\nFeature contributions:")
for feature, weight in explanation.as_list():
direction = "↑ pushes toward Class 1" if weight > 0 else "↓ pushes toward Class 0"
print(f" {feature}: {weight:+.4f} ({direction})")

Exemple de sortie :

Prediction: 1
Prediction probabilities: [0.15 0.85]

Feature contributions:
feature_2 > 3.2: +0.2845 (↑ pushes toward Class 1)
feature_1 <= 5.5: +0.1923 (↑ pushes toward Class 1)
feature_4 <= 0.5: +0.1456 (↑ pushes toward Class 1)
feature_5 > 2.0: +0.1102 (↑ pushes toward Class 1)
feature_3 <= 1.8: +0.0834 (↑ pushes toward Class 1)

Visualisation des explications LIME

fig = explanation.as_pyplot_figure()
fig.tight_layout()
fig.savefig("lime_explanation.png", dpi=150, bbox_inches="tight")

explanation.save_to_file("lime_explanation.html")

Forces et limites de LIME

ForcesLimites
✅ Independant du modele — fonctionne avec n'importe quel modele⚠️ Les explications peuvent varier entre les executions (echantillonnage)
✅ Sortie intuitive — facile a communiquer⚠️ Suppose la linearite locale — peut manquer les interactions
✅ Fonctionne pour les donnees tabulaires, texte et images⚠️ La generation de perturbations est quelque peu arbitraire
✅ Rapide pour les predictions individuelles⚠️ Pas d'explication globale par defaut

SHAP — SHapley Additive exPlanations

Fondement en theorie des jeux

SHAP est base sur les valeurs de Shapley de la theorie des jeux cooperatifs (prix Nobel d'economie 1953). La question a laquelle il repond :

Si un groupe de joueurs (caracteristiques) travaille ensemble pour obtenir un gain (prediction), comment repartir equitablement le credit entre eux ?

L'analogie de l'addition de pizza

Imaginez que quatre amis commandent une pizza qui coute 40 € :

  • Alice a commande les garnitures cheres (+12 €)
  • Bob a commande du fromage en plus (+5 €)
  • Charlie a commande la taille grande (+8 €)
  • Diana n'a rien commande de special (+0 €)

La valeur de Shapley repartit equitablement le cout en fonction de la contribution marginale de chaque personne — ce qu'elle a ajoute dans chaque ordre possible.

Proprietes SHAP (garanties mathematiques)

ProprieteDescription
Exactitude localeLes valeurs SHAP s'additionnent pour donner la difference entre la prediction et la valeur de base
AbsenceLes caracteristiques qui n'affectent pas la prediction ont une valeur SHAP = 0
CoherenceSi une caracteristique contribue plus dans le modele B que dans le modele A, sa valeur SHAP est plus elevee
EquiteBase sur une theorie des jeux rigoureuse — la seule methode avec ces garanties

Implementation SHAP

import shap
import joblib
import numpy as np
import matplotlib.pyplot as plt

model = joblib.load("models/model_v1.joblib")
X_train = np.load("data/X_train.npy")
X_test = np.load("data/X_test.npy")
feature_names = ["feature_1", "feature_2", "feature_3", "feature_4", "feature_5"]

explainer = shap.TreeExplainer(model)

shap_values = explainer.shap_values(X_test)

print("SHAP values shape:", np.array(shap_values).shape)
print("Base value (expected value):", explainer.expected_value)

Visualisations SHAP

Force Plot (prediction unique)

instance_idx = 0

shap.initjs()

shap.force_plot(
base_value=explainer.expected_value[1],
shap_values=shap_values[1][instance_idx],
features=X_test[instance_idx],
feature_names=feature_names,
matplotlib=True,
)
plt.savefig("shap_force_plot.png", dpi=150, bbox_inches="tight")

Le force plot montre comment chaque caracteristique pousse la prediction de la valeur de base vers la prediction finale :

  • Les caracteristiques rouges poussent la prediction vers le haut (vers la classe 1)
  • Les caracteristiques bleues poussent la prediction vers le bas (vers la classe 0)
  • Barres plus larges = contribution plus forte

Summary Plot (importance globale des caracteristiques)

shap.summary_plot(
shap_values[1],
features=X_test,
feature_names=feature_names,
show=False,
)
plt.tight_layout()
plt.savefig("shap_summary_plot.png", dpi=150, bbox_inches="tight")

Le summary plot montre :

  • Axe Y : Caracteristiques classees par importance (en haut = plus importantes)
  • Axe X : Valeur SHAP (impact sur la prediction)
  • Couleur : Valeur de la caracteristique (rouge = elevee, bleu = faible)

Waterfall Plot (prediction unique detaillee)

shap_explanation = shap.Explanation(
values=shap_values[1][instance_idx],
base_values=explainer.expected_value[1],
data=X_test[instance_idx],
feature_names=feature_names,
)

shap.waterfall_plot(shap_explanation, show=False)
plt.tight_layout()
plt.savefig("shap_waterfall_plot.png", dpi=150, bbox_inches="tight")

Bar Plot (valeurs SHAP absolues moyennes)

shap.summary_plot(
shap_values[1],
features=X_test,
feature_names=feature_names,
plot_type="bar",
show=False,
)
plt.tight_layout()
plt.savefig("shap_bar_plot.png", dpi=150, bbox_inches="tight")

Dependence Plot (interaction des caracteristiques)

shap.dependence_plot(
ind="feature_1",
shap_values=shap_values[1],
features=X_test,
feature_names=feature_names,
interaction_index="feature_2",
show=False,
)
plt.tight_layout()
plt.savefig("shap_dependence_plot.png", dpi=150, bbox_inches="tight")

LIME vs. SHAP — Comparaison detaillee

AspectLIMESHAP
FondementApproximation lineaire localeValeurs de Shapley (theorie des jeux)
Garanties theoriques❌ Aucune garantie formelle✅ Exactitude locale, coherence, absence
PorteeLocal uniquementLocal + Global
Vitesse⚡ Rapide (instance unique)🐢 Plus lent (toutes les instances pour le global)
Stabilite⚠️ Peut varier entre les executions✅ Deterministe pour les modeles arborescents
Support des modelesN'importe quel modele (independant du modele)N'importe quel modele (KernelSHAP), optimise pour les arbres (TreeSHAP)
SortiePoids d'importance des caracteristiquesAttributions additives des caracteristiques
VisualisationGraphique en barres, rapport HTMLForce plot, summary, waterfall, dependence
Ideal pourExplications rapides pour une predictionAnalyse rigoureuse, conformite reglementaire
Installationpip install limepip install shap
Quand utiliser lequel
  • Utilisez LIME lorsque vous avez besoin d'une explication rapide et approximative pour une prediction
  • Utilisez SHAP lorsque vous avez besoin d'explications rigoureuses et theoriquement fondees — notamment pour la conformite reglementaire
  • Utilisez les deux en production : LIME pour les explications en temps reel, SHAP pour les audits periodiques du modele

Methodes d'importance des caracteristiques

Au-dela de LIME et SHAP, il existe d'autres facons de comprendre l'importance des caracteristiques :

Importance integree (modeles arborescents)

import pandas as pd

importances = model.feature_importances_
feature_importance_df = pd.DataFrame({
"feature": feature_names,
"importance": importances,
}).sort_values("importance", ascending=False)

print(feature_importance_df.to_string(index=False))

Importance par permutation

from sklearn.inspection import permutation_importance

result = permutation_importance(
model, X_test, y_test,
n_repeats=10,
random_state=42,
)

for i in result.importances_mean.argsort()[::-1]:
print(f"{feature_names[i]}: {result.importances_mean[i]:.4f} "
f"± {result.importances_std[i]:.4f}")

Comparaison des methodes d'importance

MethodeBaseAvantagesInconvenients
Integree (Gini/Gain)Reduction d'impurete pendant l'entrainementRapide, pas de calcul supplementaireBiaisee vers les caracteristiques a forte cardinalite
PermutationBaisse de precision quand la caracteristique est melangeeIndependante du modele, non biaiseeLente pour les grands jeux de donnees, caracteristiques correlees
SHAPAttribution equitable par la theorie des jeuxTheoriquement solide, gere les interactionsCouteuse en calcul
LIMEApproximation lineaire localeRapide, intuitiveInstable, local uniquement

Courbes de dependance partielles (PDP)

Les PDP montrent comment une caracteristique affecte les predictions en moyenne, en gardant toutes les autres caracteristiques constantes :

from sklearn.inspection import PartialDependenceDisplay

fig, ax = plt.subplots(1, 3, figsize=(15, 4))

PartialDependenceDisplay.from_estimator(
model, X_test,
features=[0, 1, 2],
feature_names=feature_names,
ax=ax,
kind="both",
)

fig.tight_layout()
fig.savefig("partial_dependence_plots.png", dpi=150, bbox_inches="tight")

Communiquer les resultats aux parties prenantes

Differentes audiences ont besoin de differents niveaux de detail :

Pour les dirigeants

« Notre modele approuve ou refuse les demandes de credit principalement en fonction du revenu (40 % d'influence), du score de credit (30 %) et de l'historique d'emploi (15 %). Les autres caracteristiques ont un impact mineur. »

Pour les regulateurs

« Pour la demande n° 12345, le modele a predit un refus avec 92 % de confiance. Les principaux facteurs contributifs etaient :

  1. Ratio dette/revenu de 0,85 (au-dessus du seuil de 0,60) : contribution SHAP = -0,28
  2. Score de credit de 580 (en dessous de la moyenne de 720) : contribution SHAP = -0,22
  3. Duree d'emploi de 3 mois (en dessous de la mediane de 24 mois) : contribution SHAP = -0,15 »

Pour les data scientists

Partagez l'analyse SHAP complete :

  • Summary plots pour l'importance globale des caracteristiques
  • Force plots pour les predictions individuelles
  • Dependence plots pour les interactions entre caracteristiques
  • Tests statistiques pour la stabilite des caracteristiques

Modele de rapport d'explicabilite

# Model Explainability Report

## Model Overview
- **Model type**: Random Forest Classifier
- **Training data**: 10,000 samples, 5 features
- **Performance**: Accuracy 92%, F1 0.91

## Global Feature Importance (SHAP)
| Rank | Feature | Mean |SHAP| | Direction |
|------|-----------|-----------|------------------------|
| 1 | Income | 0.245 | Higher → more likely approved |
| 2 | Credit | 0.198 | Higher → more likely approved |
| 3 | Employment| 0.112 | Longer → more likely approved |
| 4 | Age | 0.067 | Moderate impact |
| 5 | Zip Code | 0.023 | Minimal impact |

## Individual Explanation (Sample #12345)
[Force plot image]
[Waterfall plot image]

## Fairness Analysis
- No significant bias detected for protected attributes
- Gender SHAP value: 0.002 (negligible)

Points cles a retenir

Points cles a retenir
  1. L'explicabilite n'est pas optionnelle — elle est exigee par la reglementation (loi europeenne sur l'IA) et essentielle pour la confiance
  2. LIME explique les predictions individuelles en ajustant un modele interpretable local autour du point de prediction
  3. SHAP utilise la theorie des jeux (valeurs de Shapley) pour repartir equitablement le credit entre les caracteristiques — avec des garanties mathematiques
  4. Utilisez les explications locales pour justifier les decisions individuelles ; utilisez les explications globales pour comprendre le comportement global du modele
  5. SHAP est prefere pour la conformite reglementaire en raison de ses garanties theoriques
  6. Differentes parties prenantes ont besoin de formats d'explication differents : les dirigeants veulent des resumes, les regulateurs veulent des details
  7. Combinez l'explicabilite avec l'analyse d'equite pour detecter et attenuer les biais
  8. Integrez l'explicabilite dans votre cycle de vie du developpement de modeles, et non comme une reflexion apres coup

Ressources supplementaires