Lisez l’effet moyen d’un prédicteur avec un graphique de dépendance partielle (PDP), puis révélez l’hétérogénéité et les interactions qu’il masque avec des courbes d’espérance conditionnelle individuelle (ICE)
Guide pratique des graphiques de dépendance partielle (PDP) et des courbes d’espérance conditionnelle individuelle (ICE) en R. Un PDP montre la réponse moyenne prédite lorsqu’une variable varie, en marginalisant le reste — révélant si l’effet est monotone, un seuil, ou plat. Les courbes ICE tracent une ligne par observation, exposant les interactions et l’hétérogénéité que la moyenne du PDP masque. Mis en œuvre sur une random forest avec le package pdp (partial() + autoplot) et la voie DALEX indépendante du modèle (model_profile()), sur les données immobilières de Boston — plus la réserve clé qu’un PDP suppose l’indépendance des variables.
Date de publication
25 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
Un graphique de dépendance partielle (PDP) répond à la question comment une variable influence les prédictions, et pas seulement qu’elle compte : il montre la réponse moyenne prédite lorsqu’une variable balaie toute son étendue, toutes les autres variables étant marginalisées. La forme est le message — monotone, un seuil, un plateau, ou non monotone.
Une courbe ICE (espérance conditionnelle individuelle) trace une ligne par observation — la prédiction pour cette ligne lorsque la variable varie. Le PDP n’est rien d’autre que la moyenne de toutes les courbes ICE.
L’ICE justifie son intérêt en révélant ce que la moyenne cache : si les courbes ICE sont parallèles, l’effet est uniforme et le PDP raconte toute l’histoire ; si elles s’évasent ou se croisent, la variable interagit avec d’autres — les observations réagissent différemment.
pdp::partial() calcule les deux (ice = TRUE pour l’ICE), et autoplot() / plotPartial() les tracent. La fonction DALEX::model_profile(), indépendante du modèle, fait de même (ses profils ceteris-paribus = l’ICE ; leur agrégat = le PDP) et fonctionne sur n’importe quel modèle.
La réserve : un PDP marginalise en moyennant sur les données, ce qui suppose que la variable balayée est indépendante des autres. Lorsque les variables sont fortement corrélées, le PDP peut extrapoler vers des régions sans données réelles — lisez-le conjointement avec la dispersion des courbes ICE et une vérification des corrélations.
Variable importance vous dit quels prédicteurs un modèle privilégie. Cela ne vous dit pas comment. Le prix prédit monte-t-il avec cette variable, ou descend-il ? En douceur, ou seulement au-delà d’un seuil ? De la même manière pour chaque maison, ou différemment selon le quartier ? Ce comment est précisément ce à quoi servent les courbes de dépendance partielle et ICE — elles transforment un modèle boîte noire en un récit lisible de l’effet de chaque variable.
Un graphique de dépendance partielle (PDP) balaie une variable sur toute son étendue, et pour chaque valeur demande au modèle : en maintenant cette variable fixe et en moyennant sur tout le reste, que prédirais-tu ? Le résultat est une courbe unique — l’effet marginal moyen de la variable. La forme est la récompense : une ligne droite signale un effet linéaire, une courbe plate-puis-descendante signale un seuil, une bosse signale un point optimal.
Le problème de toute moyenne, c’est qu’elle peut masquer des désaccords. Les courbes ICE y remédient. Au lieu de moyenner, l’ICE trace la prédiction du modèle pour chaque observation individuelle lorsque la variable varie — une ligne ténue par observation. Le PDP est exactement la moyenne de ces lignes. Si les courbes ICE sont parallèles, la variable agit de la même façon pour tout le monde et le PDP raconte toute l’histoire. Si elles s’évasent, la variable interagit avec d’autres, et la courbe PDP unique camouflait une véritable hétérogénéité.
Cette leçon traite les deux de bout en bout, de manière concrète : nous ajustons une random forest qui prédit le prix des maisons, traçons la superposition PDP-avec-ICE caractéristique avec le package pdp, lisons sa forme non linéaire, puis la reproduisons indépendamment du modèle avec DALEX — et terminons sur la seule réserve qui vous garde honnête.
NoteQuand y recourir
Recourez à un PDP dès que vous avez un modèle flexible (random forest, boosting, SVM, un réseau de neurones) et que vous devez expliquer l’effet d’une variable — pour une partie prenante, un article, ou votre propre vérification de bon sens que le modèle a appris quelque chose de sensé. Ajoutez l’ICE dès que vous soupçonnez des interactions ou de l’hétérogénéité (le PDP paraît étrangement plat, ou vous savez que des sous-groupes se comportent différemment). Utilisez variable importance d’abord pour choisir quelles variables profiler, et SHAP values lorsque vous devez expliquer une prédiction unique plutôt que l’effet global d’une variable.
Les données et le modèle
Nous utilisons le jeu de données immobilier classique Boston du package MASS : 506 secteurs de recensement de Boston, l’objectif étant de prédire la valeur médiane des logements (medv, en milliers de dollars) à partir de 13 prédicteurs — nombre moyen de pièces (rm), pourcentage de population à faible statut socio-économique (lstat), ratio élèves-enseignant (ptratio), concentration en oxyde d’azote (nox), et ainsi de suite. C’est le terrain de jeu standard de la régression parce que plusieurs de ses effets sont véritablement non linéaires — exactement ce que le PDP et l’ICE sont conçus pour révéler.
Nous découpons 80/20 (stratifié sur medv) et ajustons une random forest avec ranger — un modèle flexible qui capture automatiquement les effets non linéaires et les interactions, de sorte qu’il y ait quelque chose d’intéressant à trouver pour le PDP. Nous fixons une graine pour la reproductibilité :
library(rsample)library(ranger)library(MASS)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)test_data <-testing(split)# A flexible model with nonlinear effects + interactions for the PDP to explainset.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)c(train =nrow(train_data), test =nrow(test_data), predictors =ncol(train_data) -1L)
train test predictors
403 103 13
rf
Ranger result
Call:
ranger(medv ~ ., data = train_data, num.trees = 500)
Type: Regression
Number of trees: 500
Sample size: 403
Number of independent variables: 13
Mtry: 3
Target node size: 5
Variable importance mode: none
Splitrule: variance
OOB prediction error (MSE): 12.93076
R squared (OOB): 0.8480117
Soit 405 secteurs pour apprendre et une forêt de 500 arbres qui explique environ 85 % de la variance hors sac de la valeur des logements (la ligne R squared (OOB)). Un ajustement solide et flexible — mais totalement opaque. Le reste de la leçon l’ouvre, une variable à la fois.
Le graphique de dépendance partielle (PDP)
Commençons par la question phare : comment lstat — le pourcentage de population à faible statut socio-économique dans un secteur — influence-t-il la valeur prédite des logements ? Le package pdp y répond en un seul appel. partial() balaie lstat sur une grille de valeurs, et à chaque valeur re-prédit l’ensemble du jeu d’entraînement avec cette variable figée, puis moyenne les prédictions :
library(rsample)library(ranger)library(MASS)library(pdp)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)set.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)# Sweep lstat across its range; average the model's prediction at each valuepd_lstat <-partial(rf, pred.var ="lstat", train = train_data)head(pd_lstat, 4)
Chaque ligne est un point de la courbe : une valeur de lstat (yhat est la medv moyenne prédite à cet endroit). Lisez les deux extrémités — quand lstat est faible (~2 %), le modèle prédit environ 30 k\(** ; quand `lstat` est élevé (~38 %), il prédit environ **20 k\). La variable abaisse clairement le prix prédit, mais un tableau ne peut pas montrer la forme. Traçons-la :
library(rsample)library(ranger)library(MASS)library(pdp)library(ggplot2)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)set.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)pd_lstat <-partial(rf, pred.var ="lstat", train = train_data)ggplot(pd_lstat, aes(lstat, yhat)) +geom_line(color ="#3a86d4", linewidth =1.2) +geom_rug(data = train_data, aes(x = lstat), inherit.aes =FALSE,alpha =0.3, sides ="b") +labs(x ="lstat (% lower-status population)",y ="Average predicted median home value ($1000s)",title ="Partial dependence of price on lstat") +theme_minimal()
Lisez la forme. Ce n’est pas une ligne droite — c’est un seuil. De lstat ≈ 2 % à ≈ 5 %, la courbe est presque plate et haute ; entre ≈ 5 % et ≈ 12 % elle chute fortement ; au-delà de ≈ 15 % elle s’aplatit autour de 20 k$ et bouge à peine. Le modèle a appris que les premiers points de pourcentage de population à faible statut socio-économique comptent énormément, mais qu’une fois un secteur déjà défavorisé, davantage ne fait plus grande différence. Un modèle linéaire aurait imposé une ligne droite à travers tout cela et serait passé complètement à côté de l’histoire — c’est précisément pourquoi vous tracez un PDP pour un modèle flexible. (Le tapis (rug) en bas marque où se situent les valeurs réelles de lstat, vous permettant de voir quelle partie de la courbe est bien étayée par les données et laquelle est clairsemée.)
Les courbes ICE — ce que la moyenne cache
Le PDP est une moyenne. Les moyennes peuvent masquer des désaccords : la chute brutale est peut-être réelle pour certains secteurs mais pas pour d’autres. Les courbes ICE (espérance conditionnelle individuelle) vérifient cela directement — au lieu de moyenner, elles tracent une ligne par observation : la prédiction du modèle pour ce secteur lorsque lstat varie, tout le reste étant maintenu aux valeurs réelles de ce secteur. Passez ice = TRUE :
library(rsample)library(ranger)library(MASS)library(pdp)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)set.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)# One curve per observation: yhat.id labels which tract each line belongs toice_lstat <-partial(rf, pred.var ="lstat", ice =TRUE, train = train_data)head(ice_lstat, 3)
length(unique(ice_lstat$yhat.id)) # = number of ICE curves (one per training tract)
[1] 403
La colonne supplémentaire yhat.id indexe les courbes — une par secteur d’entraînement. Superposons-les maintenant : des lignes ICE grises ténues, avec le PDP bleu épais (leur moyenne) par-dessus. Cette superposition PDP-avec-ICE est la figure caractéristique de la méthode :
library(rsample)library(ranger)library(MASS)library(pdp)library(ggplot2)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)set.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)ice_lstat <-partial(rf, pred.var ="lstat", ice =TRUE, train = train_data)pd_lstat <-partial(rf, pred.var ="lstat", train = train_data)ggplot(ice_lstat, aes(lstat, yhat)) +# one faint grey line per tract (the ICE curves)geom_line(aes(group = yhat.id), color ="grey60", alpha =0.08) +# the bold blue average = the PDPgeom_line(data = pd_lstat, color ="#3a86d4", linewidth =1.3) +geom_rug(data = train_data, aes(x = lstat), inherit.aes =FALSE,alpha =0.3, sides ="b") +labs(x ="lstat (% lower-status population)",y ="Predicted median home value ($1000s)",title ="PDP (blue) over ICE curves (grey)") +theme_minimal()
Lisez la dispersion. Chaque courbe grise est le prix prédit d’un secteur lorsque vous imaginez augmenter son lstat. Elles partagent toutes la même forme en seuil — chute brutale, puis plateau — et restent à peu près parallèles. Ce parallélisme est le verdict : l’effet de lstat est assez uniforme d’un secteur à l’autre, donc la moyenne du PDP est ici un résumé fidèle. Le décalage vertical entre les courbes reflète simplement le fait que certains secteurs sont prédits élevés et d’autres bas au départ (à cause de leurs autres variables). Si les courbes s’étaient croisées ou évasées, cela aurait signalé que lstat interagit avec autre chose — le cas que nous diagnostiquons ensuite.
NoteICE centrée (c-ICE) — alignez les départs pour voir la forme
Les courbes ICE sont décalées verticalement parce que chaque secteur part d’une prédiction de base différente. Pour comparer les formes plutôt que les niveaux, centrez-les — soustrayez de chaque courbe sa valeur au bord gauche pour qu’elles partent toutes de 0 (partial(..., ice = TRUE, center = TRUE), ou autoplot(ice, center = TRUE)). Alors les courbes parallèles s’empilent en une seule bande (effet uniforme) et tout évasement — une véritable interaction — saute immédiatement aux yeux. La c-ICE est le diagnostic le plus net lorsque vous voulez spécifiquement juger d’une interaction.
L’ICE révèle une interaction
Lorsque les courbes ICE ne sont pas parallèles, l’effet de la variable dépend des autres variables — une interaction. La forêt les capture automatiquement, et l’ICE est la façon de les repérer. Regardez plutôt rm (nombre moyen de pièces par logement), tracé en ICE centrée afin de comparer directement les formes :
library(rsample)library(ranger)library(MASS)library(pdp)library(ggplot2)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)set.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)# center = TRUE: every ICE curve starts at 0 so SHAPES are comparableice_rm <-partial(rf, pred.var ="rm", ice =TRUE, center =TRUE,train = train_data)autoplot(ice_rm, alpha =0.1) +geom_rug(data = train_data, aes(x = rm), inherit.aes =FALSE,alpha =0.3, sides ="b") +labs(x ="rm (average rooms per dwelling)",y ="Centered change in predicted value ($1000s)",title ="Centered ICE for rm — curves fan out (interaction)") +theme_minimal()
Maintenant les courbes s’évasent : la plupart des secteurs gagnent un peu de valeur prédite à mesure que les pièces augmentent, puis bondissent fortement au-delà d’environ 7 pièces — mais la taille de ce bond diffère d’un secteur à l’autre. Certains secteurs tirent un grand bénéfice de pièces supplémentaires, d’autres bougent à peine. Cette dispersion signifie que rminteragit avec d’autres variables (notamment lstat) : une pièce supplémentaire vaut bien plus dans un secteur déjà recherché que dans un secteur défavorisé. Un PDP unique pour rm aurait moyenné tout cela en une seule courbe et vous n’auriez jamais su que l’effet était conditionnel. L’ICE a saisi l’interaction ; le PDP, lui, ne le pouvait pas.
Vous pouvez confirmer l’interaction rm × lstat avec un PDP à deux variables, qui balaie les deux à la fois et colore la prédiction moyenne conjointe :
library(rsample)library(ranger)library(MASS)library(pdp)library(ggplot2)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)set.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)# sweep BOTH rm and lstat; chull = TRUE trims the grid to the data's convex hullpd_2 <-partial(rf, pred.var =c("rm", "lstat"), chull =TRUE,train = train_data)autoplot(pd_2) +scale_fill_viridis_c() +labs(x ="rm (average rooms)", y ="lstat (% lower-status)",fill ="Predicted\nmedv",title ="Joint partial dependence: rm × lstat") +theme_minimal()
Le coin clair (prix élevé) est en bas à droite — beaucoup de pièces et un lstat faible — et c’est une tache concentrée, non un gradient progressif. Des pièces supplémentaires paient le plus lorsque lstat est déjà faible : les deux variables se renforcent mutuellement. Ce schéma non additif est l’interaction que l’ICE centrée avait signalée, montrée à présent directement.
La voie indépendante du modèle : DALEX
Le package pdp accède à l’intérieur de l’objet modèle, il a donc besoin d’un modèle qu’il reconnaît. DALEX adopte l’approche opposée, entièrement indépendante du modèle : vous enveloppez n’importe quel modèle ajusté dans un explainer (une fonction de prédiction + les données), et toute explication fonctionne ensuite de la même façon — pratique quand vous voulez une interface cohérente unique à travers un modèle linéaire, une forêt et un XGBoost. Sa fonction model_profile() calcule la même chose sous des noms différents : les profils ceteris-paribus (CP) sont les courbes ICE, et leur agrégat est le PDP.
library(rsample)library(ranger)library(MASS)library(DALEX)library(ggplot2)data("Boston", package ="MASS")set.seed(123)split <-initial_split(Boston, prop =0.80, strata = medv)train_data <-training(split)set.seed(123)rf <-ranger(medv ~ ., data = train_data, num.trees =500)# Wrap the model: a predict function + the data = a model-agnostic explainerexplainer <- DALEX::explain(model = rf,data = train_data[, setdiff(names(train_data), "medv")],y = train_data$medv,predict_function =function(model, newdata) predict(model, data = newdata)$predictions,label ="random forest",verbose =FALSE)# A profile over lstat: aggregate = PDP, the cp_profiles = ICEprof_lstat <-model_profile(explainer, variables ="lstat",N =300, type ="partial")# geom = "profiles" draws the ICE (ceteris-paribus) curves + the aggregate PDPplot(prof_lstat, geom ="profiles") +ggtitle("DALEX: PDP + ICE for lstat", "")
Même seuil non linéaire, même bande ICE quasi parallèle — l’explication ne dépend pas du package qui l’a tracée, seulement de ce que le modèle a appris. Recourez à DALEX quand vous voulez une seule interface d’explainer pour de nombreux types de modèles (il fait aussi le break-down et SHAP, voir SHAP values) ; recourez à pdp quand vous voulez le PDP/ICE le plus léger et le plus direct pour un modèle unique.
La réserve : le PDP suppose l’indépendance des variables
Il y a un piège à connaître avant de faire confiance à un PDP. Pour moyenner sur les autres variables, le PDP maintient la variable balayée à une valeur de la grille tout en conservant les valeurs réelles de chaque ligne pour le reste — y compris des combinaisons qui peuvent ne jamais se produire dans la réalité. Si la variable balayée est corrélée aux autres, le PDP force le modèle à prédire pour des entrées impossibles (par ex. un secteur de petites maisons avec un lstat de quartier aisé), et la courbe peut extrapoler vers des régions sans données.
library(MASS)data("Boston", package ="MASS")# How correlated is lstat with the other predictors?round(sort(cor(Boston)[, "lstat"]), 2)
medv rm dis zn black chas ptratio crim rad tax
-0.74 -0.61 -0.50 -0.41 -0.37 -0.05 0.37 0.46 0.49 0.54
nox age indus lstat
0.59 0.60 0.60 1.00
lstat est fortement corrélé avec rm (−0.61) et medv lui-même, donc son PDP doit se lire avec une légère prudence — même si la bande ICE serrée et parallèle ci-dessus est rassurante (une extrapolation marquée se manifeste généralement par des courbes ICE désordonnées et entrecroisées). Les règles pratiques :
Lisez toujours la dispersion des courbes ICE, pas seulement la ligne du PDP. Une bande parallèle nette signifie que la moyenne est fiable ; un évasement désordonné peut signaler une interaction ou une extrapolation.
Vérifiez les corrélations entre prédicteurs avant de vous fier à la forme exacte d’un PDP.
Surveillez le tapis (rug). Là où les données sont clairsemées (peu de marques de tapis), la courbe est une extrapolation — ne lisez la forme que là où elle est bien étayée.
Pour les variables corrélées, les graphiques d’effets locaux accumulés (ALE) sont l’alternative corrigée du biais (ils balaient à l’intérieur de voisinages locaux de données) ; DALEX::model_profile(..., type = "accumulated") les fournit.
NoteComment se calcule un PDP (optionnel)
Séparez les variables en celle que vous profilez, \(x_S\) (disons lstat), et tout le reste, \(x_C\). La dépendance partielle du modèle \(\hat{f}\) en \(x_S\) est sa prédiction moyennée sur la distribution marginale des autres variables :
où \(x_{C}^{(i)}\) sont les valeurs observées des autres variables pour la ligne \(i\). En clair : fixez\(x_S\) à une valeur de la grille, insérez les valeurs réelles\(x_C\) de chaque ligne, prédisez, et moyennez les \(n\) prédictions — cette moyenne est un point du PDP. Répétez sur toute la grille pour tracer la courbe.
Une courbe ICE abandonne le moyennage : c’est le terme unique
pour une ligne fixe \(i\), tracé sur toute la grille. Le PDP est donc exactement la moyenne ponctuelle des \(n\) courbes ICE — d’où le caractère si naturel de leur superposition. L’hypothèse d’indépendance réside dans cette somme : moyenner sur le \(x_C^{(i)}\)marginal (plutôt que sur la distribution de \(x_C\)conditionnelle à\(x_S\)) est ce qui laisse des combinaisons \((x_S, x_C)\) impossibles entrer dans la moyenne lorsque les variables sont corrélées.
🟢 Avec un agent IA
Vous avez un modèle boîte noire et vous voulez voir comment une variable le pilote ? Demandez à Prova« trace un graphique de dépendance partielle avec des courbes ICE pour cette variable, et dis-moi si elle interagit avec les autres » — elle répond avec du code pdp / DALEX que vous pouvez exécuter sur votre propre modèle et vos propres données, puis vous aide à lire la forme, la dispersion des courbes ICE et la réserve d’indépendance. The runtime is the judge.Ask Prova →
Problèmes courants
Le PDP est suspectement plat ou irrégulier. Un PDP plat peut signifier une variable réellement faible — ou que la variable interagit de sorte que son effet moyen s’annule. Tracez toujours les courbes ICE avant de conclure « aucun effet » : des courbes évasées autour d’un PDP plat signifient que l’effet est réel mais conditionnel. Un PDP irrégulier signifie généralement une grille trop grossière — augmentez grid.resolution dans partial().
pdp::partial() est lent ou tombe à court de mémoire. Il re-prédit l’ensemble du jeu d’entraînement à chaque point de la grille, donc le coût croît comme lignes × grille × (pour l’ICE) courbes. Réduisez-le : passez un échantillon train plus petit, abaissez grid.resolution, ou dans DALEX fixez un N modeste (nous utilisons N = 300). Pour l’ICE, tracer chaque courbe en pleine opacité est de toute façon illisible — sous-échantillonnez.
Les PDP de classification renvoient la mauvaise échelle. Pour un classifieur, décidez d’emblée si vous voulez la probabilité d’une classe ou le score brut, et fournissez un pred.fun (pdp) ou un predict_function (DALEX) qui la renvoie — sinon vous pourriez obtenir un log-odds ou un décompte de votes au lieu d’une probabilité.
L’explainer DALEX échoue sur ranger. Le predict() de ranger renvoie une liste — la prédiction est dans $predictions. Passez un predict_function = function(m, d) predict(m, data = d)$predictions explicite (comme ci-dessus), faute de quoi DALEX risque de ne pas trouver la sortie numérique.
autoplot() se plaint de center. Si vous avez déjà passé center = TRUE à partial(), ne le passez pas aussi à autoplot() (et inversement) — centrez à un seul endroit exactement.
Questions fréquentes
NoteComment faire un graphique de dépendance partielle en R ?
Utilisez le package pdp : ajustez votre modèle, puis partial(model, pred.var = "feature", train = data) balaie la variable et moyenne les prédictions, et autoplot() (ou plotPartial()) trace la courbe. Par exemple, partial(rf, pred.var = "lstat", train = train_data) |> autoplot(). Cela fonctionne pour les random forests, le boosting, les SVM et bien d’autres. L’alternative indépendante du modèle est DALEX::model_profile().
NoteQu’est-ce que le package pdp en R ?
pdp est un package R pour les graphiques de dépendance partielle et les courbes ICE. Sa fonction principale, partial(), calcule l’effet moyen (PDP) ou par observation (ice = TRUE) d’une ou deux variables sur les prédictions d’un modèle ; autoplot() / plotPartial() visualisent le résultat. Il prend en charge la plupart des types de modèles courants et s’intègre aux ajustements caret/tidymodels.
NoteQu’est-ce qu’un graphique ICE, et en quoi diffère-t-il d’un PDP ?
Un graphique ICE (espérance conditionnelle individuelle) trace une courbe par observation — la prédiction du modèle pour cette seule ligne lorsqu’une variable varie. Un PDP est la moyenne de toutes ces courbes ICE. Le PDP montre l’effet typique ; l’ICE montre si cet effet est le même pour tout le monde (courbes parallèles) ou varie (courbes qui s’évasent / se croisent), ce qu’une moyenne de PDP masquerait. Utilisez l’ICE pour détecter les interactions et l’hétérogénéité.
NoteComment lire un graphique d’espérance conditionnelle individuelle (ICE) ?
Chaque ligne ténue est la réponse prédite d’une observation lorsque la variable change. Lisez deux choses : la forme (montante, descendante, en seuil) et la dispersion. Si les courbes sont à peu près parallèles, la variable affecte toutes les observations de la même façon et le PDP les résume bien. Si elles s’évasent ou se croisent, la variable interagit avec d’autres. Centrez les courbes (center = TRUE) pour comparer les formes sans le décalage vertical dû à des bases de référence différentes.
NoteQuelle est la principale limite des graphiques de dépendance partielle ?
Un PDP suppose que la variable balayée est indépendante des autres. Pour moyenner sur le reste, il conserve les valeurs réelles de chaque ligne pour les autres variables tout en forçant celle qui est profilée à des valeurs de grille — créant des combinaisons de variables irréalistes lorsque les variables sont corrélées, de sorte que la courbe peut extrapoler là où il n’y a pas de données. Atténuez-le en lisant la dispersion des courbes ICE et le tapis (rug) des données, en vérifiant les corrélations, et en utilisant les graphiques d’effets locaux accumulés (ALE) pour les variables fortement corrélées.
Testez vos connaissances
ImportantExercice : profilez une autre variable et jugez l’interaction
À l’aide des données Boston et de la random forest de cette leçon, tracez une superposition PDP-avec-ICE pour nox (concentration en oxyde d’azote). Puis redessinez-la en ICE centrée. À partir du graphique centré, décidez : nox affecte-t-il le prix de façon uniforme d’un secteur à l’autre, ou interagit-il avec d’autres variables ?
AstuceIndice
Réutilisez la recette de superposition, en remplaçant par pred.var = "nox". Pour le diagnostic, la question est de savoir si les courbes ICE centrées restent dans une bande serrée (effet uniforme) ou s’évasent (interaction). Vous aurez besoin de rsample, ranger, MASS, pdp et ggplot2.
Le PDP de nox décline (plus de pollution, prix prédit plus bas). Sur l’ICE centrée, les courbes s’évasent au lieu de s’empiler en une seule bande — donc nox n’agit pas uniformément : son effet sur le prix dépend des autres variables d’un secteur (une interaction). La leçon se généralise : un PDP unique n’est jamais toute l’histoire tant que vous n’avez pas vérifié la dispersion des courbes ICE.
Vérification rapide. Un collègue vous montre un PDP presque parfaitement plat et conclut « cette variable n’a pas d’importance ». Quel unique graphique de suivi tracerez-vous avant d’acquiescer, et qu’est-ce qui vous ferait changer d’avis ?
NoteAfficher la réponse
Tracez les courbes ICE (idéalement centrées). Un PDP plat peut cacher un effet réel mais conditionnel : si la variable augmente la prédiction pour certaines observations et l’abaisse pour d’autres, ces effets opposés s’annulent dans la moyenne, aplatissant le PDP. Si les courbes ICE centrées s’évasent (certaines montant, d’autres descendant) au lieu de se tenir dans une bande plate, la variable a bien de l’importance — elle interagit simplement avec d’autres variables, ce que la moyenne du PDP dissimulait. Seuls un PDP plat et une bande ICE serrée et plate, réunis, justifient « cette variable n’a pas d’importance ».
Conclusion
Vous avez ouvert une random forest boîte noire avec les courbes de dépendance partielle et ICE. Un PDP balaie une variable et moyenne les prédictions pour montrer son effet typique — et sa forme (seuil, monotone, bosse) est le message qu’un résumé linéaire manquerait. Les courbes ICE tracent une ligne par observation ; le PDP est leur moyenne, et leur dispersion révèle ce que la moyenne cache : des courbes parallèles signifient un effet uniforme (faites confiance au PDP), des courbes qui s’évasent signifient une interaction. Vous avez tracé la superposition PDP-avec-ICE caractéristique avec pdp, l’avez reproduite indépendamment du modèle avec DALEX, confirmé une interaction rm × lstat, et appris la seule réserve — un PDP suppose l’indépendance des variables, donc lisez-le avec la dispersion des courbes ICE, le tapis (rug) et une vérification des corrélations. La règle pratique : un PDP vous donne l’effet moyen ; tracez toujours l’ICE avant de lui faire confiance.
Ensuite, découvrez quelles variables profiler en premier lieu avec variable importance, expliquez une seule prédiction (et non l’effet global d’une variable) avec SHAP values, ou revenez au modèle que ces graphiques ont expliqué dans random forest.
Leçons connexes
Variable importance — quelles variables comptent (commencez par celle-ci pour choisir quoi profiler). · SHAP values — expliquez une prédiction unique, variable par variable. · Random forest — le modèle flexible que ces graphiques expliquent. · Build & validate models with tidymodels — le workflow split → recipe → fit derrière le modèle.
Prouvez que vous savez le faire. Maîtrisez toute la série Explicabilité des modèles en R — suivez votre parcours, construisez des projets et obtenez un certificat.
Cette leçon est reproductible : chaque courbe, tableau et figure a été produit par le code montré — copiez n’importe quel bloc et exécutez-le pour les reproduire. The runtime is the judge.
Références
Friedman, J. H. (2001). Greedy Function Approximation: A Gradient Boosting Machine. Annals of Statistics, 29(5), 1189–1232. (Le graphique de dépendance partielle d’origine.)
Goldstein, A., Kapelner, A., Bleich, J., & Pitkin, E. (2015). Peeking Inside the Black Box: Visualizing Statistical Learning with Plots of Individual Conditional Expectation. Journal of Computational and Graphical Statistics, 24(1), 44–65. (Le graphique ICE.)
Greenwell, B. M. (2017). pdp: An R Package for Constructing Partial Dependence Plots. The R Journal, 9(1), 421–436. (Le package pdp.)
Biecek, P., & Burzykowski, T. (2021). Explanatory Model Analysis. Chapman & Hall/CRC. (Le cadriciel DALEX.)
Molnar, C. (2022). Interpretable Machine Learning (2nd ed.). Free online. (PDP, ICE, ALE et la réserve d’indépendance.)
Kuhn, M., & Silge, J. Tidy Modeling with R. Free online (CC BY-NC-SA). (Chapitre 18 — expliquer les modèles et les prédictions.)