Une méthode pour expliquer une prédiction précise d'un modèle opaque. LIME crée des milliers de variantes de l'individu à expliquer, regarde ce que le modèle en pense, et ajuste autour de lui une petite régression linéaire lisible. Les coefficients de cette régression disent ce qui pèse sur cette prédiction-là, et dans quel sens.
Pour comprendre ce qui fâche un client, on ne cherche pas une théorie générale de la satisfaction. On change un détail à la fois dans sa situation et on observe sa réaction. LIME fait la même chose avec le modèle, autour d'un seul cas.
LIME génère des milliers d'individus fictifs en tirant des valeurs de variables d'après leur distribution dans les données : autres surfaces, autres budgets, autres zones.
Le modèle prédit chaque individu fictif. Ceux qui ressemblent le plus au cas étudié reçoivent un poids plus fort.
Une régression linéaire pondérée, limitée à quelques variables, imite le modèle dans ce voisinage. Ses coefficients forment l'explication.
Une Random Forest prévoit le CA de 400 magasins d'après leur surface, leur budget publicitaire, le nombre de concurrents et la zone. Un directeur régional demande pourquoi l'un de ses magasins est prévu aussi bas.
Sur le jeu d'exemple, le magasin au CA prévu le plus faible cumule une petite surface (445 m²), 7 concurrents et une zone rurale. LIME chiffre en k€ le poids de chaque condition dans la prévision : le directeur voit ce qui relève du format du magasin et ce qui relève de son environnement.
Le R² du modèle local dit s'il imite bien le modèle autour du magasin. On relance ensuite avec une autre graine : si l'ordre des raisons change, l'explication n'est pas fiable. Le code compare deux tirages pour cette raison.
Noms donnés pour R (lime) et Python (lime).
3 à 6 pour rester lisible. Au-delà, l'explication perd son intérêt et devient instable.
5 000 par défaut. Augmenter stabilise l'explication, au prix de plus d'appels au modèle.
Définit ce qu'est un individu proche. Trop étroit, peu d'individus comptent et l'explication est bruitée ; trop large, elle n'est plus locale. Le défaut ne convient pas toujours.
Par défaut, les variables numériques sont découpées en quartiles, ce qui donne des conditions du type « surface_m2 <= 769.75 » (le premier quartile). Plus lisible, mais dépendant des seuils choisis.
# Pourquoi ce CA prévu : LIME en R
library(randomForest)
library(lime)
magasins <- read.csv("magasins.csv")
X <- magasins[, c("surface_m2", "budget_pub_k", "nb_concurrents", "zone")]
X$zone <- factor(X$zone)
set.seed(42)
modele <- randomForest(x = X, y = magasins$ca_k, ntree = 300)
# On indique à lime comment interroger un modèle randomForest
model_type.randomForest <- function(x, ...) "regression"
predict_model.randomForest <- function(x, newdata, type, ...) data.frame(Response = predict(x, newdata))
# Le magasin au CA prévu le plus faible : pourquoi ?
prevision <- predict(modele, X)
i <- which.min(prevision)
print(magasins[i, ])
# LIME : 5 000 magasins fictifs autour de celui-ci, puis un petit modèle linéaire local
explainer <- lime(X, modele)
explication <- explain(X[i, ], explainer, n_features = 4, n_permutations = 5000)
print(explication[, c("feature_desc", "feature_weight", "model_prediction", "model_r2")])
# Pourquoi ce CA prévu : LIME en Python
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from lime.lime_tabular import LimeTabularExplainer
magasins = pd.read_csv("magasins.csv")
zones = ["centre_ville", "peripherie", "rural"]
X = magasins[["surface_m2", "budget_pub_k", "nb_concurrents"]].assign(zone=magasins["zone"].map(zones.index))
modele = RandomForestRegressor(n_estimators=300, random_state=42).fit(X.values, magasins["ca_k"])
# Le magasin au CA prévu le plus faible : pourquoi ?
prevision = modele.predict(X.values)
i = prevision.argmin()
print(magasins.loc[i].to_dict(), "| CA prévu :", round(prevision[i]), "k€")
# LIME : 5 000 magasins fictifs autour de celui-ci, puis un petit modèle linéaire local
for graine in (42, 7): # deux tirages, pour juger la stabilité
explainer = LimeTabularExplainer(X.values, mode="regression", feature_names=list(X.columns),
categorical_features=[3], categorical_names={3: zones}, random_state=graine)
explication = explainer.explain_instance(X.values[i], modele.predict, num_features=4, num_samples=5000)
print(f"Tirage {graine} :")
for regle, poids in explication.as_list():
print(f" {regle:35s} {poids:+7.1f} k€")
LIME signifie Local Interpretable Model-agnostic Explanations. La méthode, publiée en 2016 par Ribeiro, Singh et Guestrin, explique une prédiction individuelle de n'importe quel modèle en l'approchant localement par un modèle simple, en général une régression linéaire.
SHAP est aujourd'hui plus utilisé : ses contributions s'additionnent exactement jusqu'à la prédiction, et le calcul est rapide et exact pour les modèles d'arbres. LIME reste utile pour son principe très intuitif, pour les textes et les images, et quand le modèle n'est accessible que par ses prédictions.
Parce que LIME tire au hasard les individus fictifs qui servent à ajuster le modèle local. Avec un voisinage mal réglé ou trop peu de tirages, deux exécutions peuvent donner des variables ou des poids différents. Fixer la graine rend le résultat reproductible, pas plus fiable : il faut vérifier la stabilité.
Contributions additives fondées sur la théorie des jeux, stables, exactes pour les arbres.
Voir la fiche → l'explication qui guide l'actionDit ce qu'il faudrait changer pour obtenir une autre prédiction.
Voir la fiche → la vue d'ensembleMontre l'effet moyen d'une variable sur toutes les prédictions, pas sur un seul cas.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus