Pour savoir si une variable compte pour un modèle, on la mélange au hasard entre les lignes et on regarde de combien la performance se dégrade. Si le modèle ne voit pas la différence, il ne s'en servait pas. Simple, applicable à tout modèle, c'est la façon la plus honnête de dire quelles variables comptent vraiment.
Pour savoir si un joueur est indispensable à l'équipe, on le remplace par un joueur tiré au hasard et on regarde le score. Si l'équipe perd nettement, il comptait. Sinon, il faisait de la figuration.
Le modèle entraîné prédit un jeu de test, et on calcule l'erreur avec la métrique métier.
On permute au hasard les valeurs d'une seule colonne entre les lignes. Le lien entre cette variable et la cible est cassé, tout le reste est intact.
L'écart d'erreur est l'importance de la variable. On répète le mélange plusieurs fois pour obtenir une moyenne et un écart-type, puis on passe à la variable suivante.
Une Random Forest prédit le nombre de sinistres par an de 6 000 contrats, d'après l'âge du conducteur, la puissance, la zone et le bonus-malus. On ajoute une variable de bruit pur, sans aucun lien avec la sinistralité, comme témoin.
Sur le jeu d'exemple, l'âge du conducteur arrive très loin devant, suivi du bonus-malus puis de la zone. La puissance ne se distingue pas nettement du bruit : son effet est faible. La variable témoin a une importance quasi nulle, comme attendu.
L'importance « par impureté » fournie par défaut par les forêts donne 19 % de l'importance totale à la variable de bruit, devant la zone et la puissance. Elle favorise les variables continues aux nombreuses valeurs. La permutation sur données de test ne tombe pas dans ce piège.
Noms donnés pour R (ranger, calcul intégré sur les données hors du sac) et Python (scikit-learn, sur un jeu de test).
Calculée sur les données d'entraînement, l'importance récompense aussi ce que le modèle a appris par cœur. Utiliser un jeu de test, ou les observations hors du sac (OOB) d'une forêt.
La dégradation se mesure avec la métrique qui compte : déviance de Poisson pour une fréquence, AUC pour un score, erreur en euros pour un montant.
Le mélange est aléatoire. 10 à 30 répétitions donnent une moyenne et un écart-type ; une importance plus petite que son écart-type ne se distingue pas de zéro.
Une variable codée en plusieurs colonnes (zone) doit être mélangée d'un bloc. Pour des variables corrélées, les permuter ensemble ou n'en garder qu'une.
# Ce qui pèse sur la sinistralité : importance par permutation en R
library(ranger)
sin <- read.csv("sinistres.csv")
sin$zone <- factor(sin$zone)
sin$frequence <- sin$nb_sinistres / sin$exposition # fréquence annuelle
set.seed(42)
sin$bruit <- rnorm(nrow(sin)) # variable témoin, sans aucun lien
formule <- frequence ~ age_conducteur + puissance_cv + zone + bonus_malus + bruit
# Contrats tirés en proportion de leur exposition ; chaque variable est mélangée
# sur les contrats que l'arbre n'a pas vus (hors du sac, OOB) et on mesure la dégradation
perm <- ranger(formule, data = sin, num.trees = 300, min.node.size = 50,
case.weights = sin$exposition, importance = "permutation", seed = 42)
impur <- ranger(formule, data = sin, num.trees = 300, min.node.size = 50,
case.weights = sin$exposition, importance = "impurity", seed = 42)
resultat <- data.frame(permutation = importance(perm), impurete = importance(impur))
print(round(resultat[order(-resultat$permutation), ], 5))
# Ce qui pèse sur la sinistralité : importance par permutation en Python
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split
sin = pd.read_csv("sinistres.csv")
X = sin[["age_conducteur", "puissance_cv", "bonus_malus"]].copy()
X["zone"] = sin["zone"].map({"rural": 0, "periurbain": 1, "urbain": 2}) # une seule colonne à mélanger
X["bruit"] = np.random.default_rng(42).normal(size=len(X)) # variable témoin, sans aucun lien
y = sin["nb_sinistres"] / sin["exposition"]
X_train, X_test, y_train, y_test, w_train, w_test = train_test_split(
X, y, sin["exposition"], test_size=0.3, random_state=42)
modele = RandomForestRegressor(n_estimators=300, min_samples_leaf=50, random_state=42)
modele.fit(X_train, y_train, sample_weight=w_train)
# On mélange chaque variable 20 fois sur les contrats de test et on mesure la dégradation
perm = permutation_importance(modele, X_test, y_test, sample_weight=w_test, n_repeats=20,
scoring="neg_mean_poisson_deviance", random_state=42)
resultat = pd.DataFrame({"perte_moyenne": perm.importances_mean, "ecart_type": perm.importances_std,
"importance_impurete": modele.feature_importances_}, index=X.columns)
print(resultat.sort_values("perte_moyenne", ascending=False).round(4))
C'est une mesure de l'importance d'une variable pour un modèle déjà entraîné. On mélange au hasard les valeurs de cette variable, on recalcule la performance du modèle, et la perte de performance donne l'importance. La méthode a été proposée par Breiman en 2001 pour les forêts aléatoires, puis généralisée à tous les modèles.
feature_importances_, dans scikit-learn, mesure la baisse d'impureté apportée par chaque variable dans les arbres, sur les données d'entraînement. Elle est rapide mais favorise les variables continues ou à nombreuses modalités, même sans lien réel avec la cible. L'importance par permutation, calculée sur des données de test, n'a pas ce biais.
Oui. Cela signifie que le modèle fait un peu mieux quand la variable est mélangée, ce qui arrive par hasard quand la variable est inutile. Une petite valeur négative, du même ordre que l'écart-type, doit se lire comme une importance nulle.
Répartit chaque prédiction entre les variables. La moyenne des valeurs absolues donne aussi une importance globale.
Voir la fiche → le sens de l'effetMontre comment la prédiction évolue quand une variable varie. L'étape d'après, une fois les variables clés identifiées.
Voir la fiche → le modèle expliqué iciSon importance intégrée par impureté est rapide mais biaisée. La permutation la corrige.
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