Dépendance Partielle & Courbes ICE
“Voir exactement comment la prédiction d'un modèle change quand on fait varier une caractéristique — en marginalisant tout le reste”
Les PDP marginalisent sur les autres features pour montrer l'effet moyen. Les courbes ICE exposent l'hétérogénéité par échantillon. Les ALE corrigent le problème d'extrapolation.
Prérequis
Concepts Couverts
∑Formules Clés
Fonction de Dépendance Partielle
Sortie moyenne du modèle sur toutes les valeurs des caractéristiques complémentaires — marginalise les interactions
Courbe ICE (individuelle)
Prédiction pour l'échantillon i quand la caractéristique j varie — garde toutes les autres caractéristiques à leurs valeurs réelles
c-ICE (centré)
Courbe ICE ancrée au point de référence x_j0 — supprime les différences d'intercept, met en évidence la forme des interactions
Relation PDP–ICE
PDP est exactement la moyenne ponctuelle de toutes les courbes ICE
▶Simulation Interactive
Au-Delà de 'Quelles Caractéristiques Comptent' — Comment Comptent-Elles ?
L'importance des caractéristiques vous dit que le revenu est la caractéristique la plus prédictive, mais elle ne dit rien sur la forme de cette relation. La prédiction augmente-t-elle linéairement avec le revenu ? Atteint-elle un plateau au-dessus de 80 k€ ? Y a-t-il un effet de seuil à 40 k€ ? Les Graphiques de Dépendance Partielle (PDPs) répondent à ces questions visuellement. Ils sont le pendant 'graphique d'effet' aux scores d'importance. Ensemble ils forment un tableau complet : l'importance indique l'ampleur, les PDPs indiquent la direction et la forme. Utilisés avec les courbes ICE, ils révèlent aussi si le PDP moyen est un résumé fiable ou une moyenne trompeuse d'effets hétérogènes.
Un PDP montrant une relation plate pour une caractéristique très importante est un signal d'alerte — cela signifie souvent que la marginalisation cache des effets d'interaction visibles seulement dans les courbes ICE.
L'Interprétation Monte Carlo
L'estimation PDP fonctionne par simulation Monte Carlo : pour une valeur donnée x_j = v, remplacez la j-ième colonne de votre jeu de données entier par v, faites passer tous les n échantillons dans le modèle, et faites la moyenne des prédictions. Répétez pour chaque v sur une grille. Le résultat est la courbe de réponse moyenne du modèle. L'hypothèse clé est l'indépendance des caractéristiques — la marginalisation prétend que x_j peut prendre la valeur v tandis que toutes les autres caractéristiques conservent leur distribution conjointe d'origine. Quand les caractéristiques sont corrélées (ex. revenu et âge), cela crée une extrapolation dans des régions improbables. Les graphiques ALE corrigent cela en conditionnant sur la distribution réelle des données.
Les courbes ICE sont l'équivalent au niveau individuel : au lieu de faire la moyenne, tracez la courbe de chaque échantillon séparément. Si les courbes ICE s'éventent ou se croisent, la moyenne PDP est trompeuse — il y a des effets d'interaction.
Calcul PDP + ICE : Étape par Étape
Choisissez la caractéristique j et une grille de valeurs G = {v₁, v₂, …, vₖ} (par défaut : 100 points entre le 5e–95e percentile).
Pour chaque valeur de grille v ∈ G : définissez X_j = v pour tous les n échantillons (créez n copies), calculez f(X_j=v, X_{-j}) pour tous les n échantillons, enregistrez la moyenne comme PDP(v) et toutes les n valeurs comme courbes ICE.
Tracez PDP(v) comme ligne moyenne. Tracez chaque courbe ICE comme ligne légère de la même couleur.
Centrez éventuellement les courbes ICE (c-ICE) : soustrayez la valeur de chaque courbe à v_min pour que toutes les courbes commencent à 0 — élimine le bruit d'intercept.
Pour les PDPs 2D (graphiques d'interaction) : fixez deux caractéristiques j1, j2 sur une grille, marginalisez sur toutes les autres — produit une carte de chaleur montrant l'effet conjoint.
PDP + ICE avec l'API d'Inspection scikit-learn
from sklearn.ensemble import GradientBoostingClassifier from sklearn.inspection import PartialDependenceDisplay from sklearn.model_selection import train_test_split import pandas as pd import numpy as np import matplotlib.pyplot as plt class="tok-comment"># ── Jeu de données ───────────────────────────────────────────────────────────── np.random.seed(class="tok-num">0) n = class="tok-num">2000 X = pd.DataFrame({ class="tok-str">"revenu": np.random.normal(class="tok-num">50, class="tok-num">15, n).clip(class="tok-num">15, class="tok-num">120), class="tok-str">"age": np.random.randint(class="tok-num">18, class="tok-num">70, n).astype(float), class="tok-str">"score_credit": np.random.normal(class="tok-num">650, class="tok-num">80, n).clip(class="tok-num">300, class="tok-num">850), }) y = (class="tok-num">0.5*(X[class="tok-str">"revenu"]>class="tok-num">55) + class="tok-num">0.3*(X[class="tok-str">"score_credit"]>class="tok-num">660) + class="tok-num">0.2*(X[class="tok-str">"age"]>class="tok-num">40)) > class="tok-num">0.5 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=class="tok-num">0.2) class="tok-comment"># ── Entraîner le modèle ──────────────────────────────────────────────────────── clf = GradientBoostingClassifier(n_estimators=class="tok-num">200, max_depth=class="tok-num">4, random_state=class="tok-num">42) clf.fit(X_train, y_train) class="tok-comment"># ── class="tok-num">1. PDP standard pour class="tok-num">3 caractéristiques ────────────────────────────────── fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[class="tok-str">"revenu", class="tok-str">"age", class="tok-str">"score_credit"], kind=class="tok-str">"average", class="tok-comment"># class="tok-str">"average" = PDP uniquement grid_resolution=class="tok-num">50, ax=axes, ) plt.suptitle(class="tok-str">"Graphiques de Dépendance Partielle (PDP)") plt.tight_layout(); plt.show() class="tok-comment"># ── class="tok-num">2. PDP + ICE superposés ─────────────────────────────────────────────────── fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[class="tok-str">"revenu", class="tok-str">"age", class="tok-str">"score_credit"], kind=class="tok-str">"both", class="tok-comment"># class="tok-str">"both" = PDP (gras) + ICE (léger) subsample=class="tok-num">100, alpha=class="tok-num">0.3, ax=axes, ) plt.suptitle(class="tok-str">"PDP + Courbes ICE — la divergence révèle les interactions") plt.tight_layout(); plt.show() class="tok-comment"># ── class="tok-num">3. ICE centré (c-ICE) ──────────────────────────────────────────────────── fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[class="tok-str">"revenu", class="tok-str">"age", class="tok-str">"score_credit"], kind=class="tok-str">"individual", class="tok-comment"># ICE uniquement centered=True, class="tok-comment"># ancrer chaque courbe à sa valeur la plus à gauche subsample=class="tok-num">150, alpha=class="tok-num">0.2, ax=axes, ) plt.suptitle(class="tok-str">"ICE centré (c-ICE) — formes d'interaction visibles") plt.tight_layout(); plt.show() class="tok-comment"># ── class="tok-num">4. PDP 2D d'interaction (carte de chaleur) ───────────────────────────── fig, ax = plt.subplots(figsize=(class="tok-num">6, class="tok-num">5)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[(class="tok-str">"revenu", class="tok-str">"score_credit")], class="tok-comment"># tuple = PDP 2D ax=ax, ) plt.title(class="tok-str">"PDP 2D : interaction revenu × score_credit") plt.tight_layout(); plt.show() class="tok-comment"># ── class="tok-num">5. Calcul manuel du PDP (éducatif) ─────────────────────────────────────── grille = np.linspace(X_train[class="tok-str">"revenu"].quantile(class="tok-num">0.05), X_train[class="tok-str">"revenu"].quantile(class="tok-num">0.95), class="tok-num">50) valeurs_pdp = [] for v in grille: X_mod = X_train.copy() X_mod[class="tok-str">"revenu"] = v valeurs_pdp.append(clf.predict_proba(X_mod)[:, class="tok-num">1].mean()) plt.figure(figsize=(class="tok-num">6, class="tok-num">3)) plt.plot(grille, valeurs_pdp, lw=class="tok-num">2, color=class="tok-str">"class="tok-comment">#8b5cf6") plt.xlabel(class="tok-str">"revenu"); plt.ylabel(class="tok-str">"P(défaut=class="tok-num">1) prédit moyen") plt.title(class="tok-str">"PDP manuel — effet du revenu") plt.tight_layout(); plt.show()
Graphiques ALE : Corriger l'Extrapolation de PDP
Les graphiques ALE (Accumulated Local Effects) conditionnent sur le voisinage de x_j = v plutôt que de marginaliser sur l'ensemble des données. Cela respecte la distribution réelle des données et évite l'extrapolation dans des régions impossibles (ex. personnes de 20 ans avec 150k€ de revenu). La formulation basée sur les dérivées calcule l'effet local d'un petit déplacement de x_j, puis intègre ces effets locaux — donnant une version fidèle à la distribution du PDP. Pour les caractéristiques non corrélées, PDP et ALE produisent des graphiques quasi identiques. Pour les caractéristiques corrélées, ALE est strictement plus fiable.
Quand PDP Ment : Le Problème de l'Effet Hétérogène
Un PDP peut montrer une ligne parfaitement plate pour le revenu tandis que les courbes ICE individuelles varient de fortement positif à fortement négatif — si les effets de signes opposés s'annulent dans la moyenne. Cela se produit quand il y a de forts effets d'interaction (ex. le revenu importe beaucoup pour les jeunes emprunteurs mais pas pour les plus âgés). Vérifiez toujours les courbes ICE à côté des PDPs. De plus, les PDPs sont coûteux pour les grands jeux de données : n × k évaluations de modèle par caractéristique. Utilisez subsample=200 pour limiter le calcul des courbes ICE. Enfin, les PDPs n'ont pas d'intervalles de confiance par défaut — utilisez des PDPs bootstrappés pour obtenir des bandes d'incertitude.
Si le PDP montre une ligne plate mais que l'importance par permutation dit que la caractéristique est critique, vérifiez les courbes ICE — vous avez probablement un effet d'interaction masqué.
?Vérification des Connaissances
La progression est sauvegardée dans votre navigateur — aucun compte requis.
Besoin d'un ingénieur IA ou data scientist ?
Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.