K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

PDP / ICE

中級

02.9.2

PDP / ICE

最終更新 2026-03-03 読了時間 3 分
まとめ
PDP(Partial Dependence Plot)は、学習済みモデルに対して「注目する 1 列(たとえば所得 MedInc)の値を 50 段階に書き換え、他の列はデータのまま固定して予測し、その平均を結ぶ」ことで、その列が予測に与える平均的な影響を 1 本の曲線にします。ICE(Individual Conditional Expectation)は平均を取る前のサンプル 1 件ごとの曲線をそのまま重ねたもので、PDP の平均に隠れた「所得が増えても価格が上がらないグループ」のような不均一性や交互作用が見えます。scikit-learn の PartialDependenceDisplay.from_estimator に学習済みモデルと列名を渡すだけで描け、kind="both" で PDP と ICE を重ねられます。このページではカリフォルニア住宅価格に当てた勾配ブースティングで、MedInc・AveRooms・HouseAge の 3 列と、MedInc × HouseAge の 2 変数 PDP を描きます。

PDP は学習済みモデルなら何にでも使えますが、このページでは XGBoost と同系の GradientBoostingRegressor を解釈します。木のモデルは階段状の予測を返すので、Random Forest などアンサンブルの基本を知っていると、PDP の曲線に出る小さな段の意味が読めます。

直感 #

「年収が 100 万円増えたら、住宅ローンの審査通過率はどれくらい上がるか」という問いに、学習済みモデルを使って答えるのが PDP です。手順は単純で、手元の 1000 人分のデータの年収の列だけを「全員 300 万円」「全員 400 万円」……と書き換えて予測し、各年収での予測の平均を点にして結びます。他の列(年齢や勤続年数)は書き換えずそのままなので、「他の条件はデータの分布に任せたまま年収だけ動かした平均的な効果」が曲線になります。ICE は平均を取る前の 1000 本の線をそのまま描いたもので、「年収を増やしても通過率が上がらない人たち」のように、平均では消えてしまう人ごとの違いが見えます。PDP の曲線が平らでも ICE が上下に分かれていれば、別の列との交互作用が隠れています。

Python で確かめる #

カリフォルニア住宅価格(20640 件、8 特徴)に勾配ブースティングを学習し、PartialDependenceDisplay で 1 変数の PDP、ICE を重ねた図、2 変数の PDP の 3 種類を描きます。

ライブラリとデータ #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.inspection import PartialDependenceDisplay
from sklearn.model_selection import train_test_split

data = fetch_california_housing()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.2, random_state=42
)
feature_names = data.feature_names

モデル学習 #

深さ 4 の木を 200 本、学習率 0.1 で積み上げた勾配ブースティングを解釈対象にします。

1
2
3
4
model = GradientBoostingRegressor(
    n_estimators=200, max_depth=4, learning_rate=0.1, random_state=42
)
model.fit(X_train, y_train)

PDP の描画 #

MedInc、AveRooms、HouseAge の 3 列について、それぞれの値を 50 段階に動かしたときの予測価格の平均を 3 枚並べて描きます。

1
2
3
4
5
6
7
fig, ax = plt.subplots(1, 3, figsize=(15, 4))
PartialDependenceDisplay.from_estimator(
    model, X_train, features=["MedInc", "AveRooms", "HouseAge"],
    feature_names=feature_names, ax=ax, grid_resolution=50
)
plt.tight_layout()
plt.show()

MedInc の曲線は右上がりで、所得が高い地区ほど価格が高いという平均的な効果が出ます。AveRooms は部屋数 5〜6 までは効果が小さく、HouseAge は築年数が古いほどわずかに高い、という直感に反する形になることがあります。古い家が多いのは都市部で地価が高いためで、PDP は「モデルがどう予測するか」を描くだけで因果ではない、という注意がここで実感できます。

ICE プロットの描画 #

同じ 2 列について、平均を取る前のサンプル 1 件ごとの曲線(ICE)を薄い青で重ね、その上に PDP を赤で描きます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
PartialDependenceDisplay.from_estimator(
    model, X_train, features=["MedInc", "AveRooms"],
    feature_names=feature_names, ax=ax,
    kind="both",  # PDP + ICE を重ねて描画
    ice_lines_kw={"color": "steelblue", "alpha": 0.1, "linewidth": 0.5},
    pd_line_kw={"color": "red", "linewidth": 2},
    grid_resolution=50
)
plt.tight_layout()
plt.show()

MedInc の ICE はほぼ全部の線が右上がりで、傾きの違いはあっても向きは揃っています。一方 AveRooms の ICE は、部屋数が増えても平らな線と、急に上がる線が混ざることがあり、これが「部屋数の効果は他の列(たとえば所得や立地)によって変わる」交互作用の兆候です。PDP の赤線だけを見ていては気付けない情報です。

2変数の相互作用 #

MedInc と HouseAge を同時に動かし、予測価格を等高線で描きます。等高線が平行な縦線や横線なら 2 列の効果は独立で、曲がったり斜めになれば交互作用があります。

1
2
3
4
5
6
fig, ax = plt.subplots(figsize=(6, 5))
PartialDependenceDisplay.from_estimator(
    model, X_train, features=[("MedInc", "HouseAge")],
    feature_names=feature_names, ax=ax, grid_resolution=30
)
plt.show()

等高線がほぼ縦線(MedInc の軸に垂直)なら、価格は所得だけで決まり築年数は効いていません。所得が高い側で等高線が斜めになれば、「所得が高い地区では築年数が古いほど高い」のような交互作用をモデルが学んでいることになります。

使いどころと落とし穴 #

PDP は「モデルが列 \(x_j\) をどう使っているか」を見る道具で、因果関係ではありません。古い家ほど高いという HouseAge の曲線は、古い家が都市部に多いというデータの偏りをモデルがなぞった結果です。もう 1 つの落とし穴は相関の強い列で、AveRooms と AveBedrms のように連動する列の片方だけを動かすと、「部屋数 10・寝室数 1」のような現実にない組み合わせで予測させることになり、曲線の端が信用できなくなります。その場合は ALE(Accumulated Local Effects)や SHAP の依存プロットを併用します。計算量は訓練データ件数 × grid_resolution に比例するので、数十万件のデータでは X_train を数千件にサブサンプルして渡します。

まとめ #

PDP は注目する 1 列を grid_resolution 段階に書き換えて全サンプルを予測し、その平均を結んだ曲線で、PartialDependenceDisplay.from_estimator(model, X, features=[...]) の 1 行で描けます。ICE は平均を取る前のサンプルごとの曲線で、kind="both" で PDP と重ねると、平均に隠れた不均一性や交互作用が青い帯の割れ方として見えます。2 列をタプルで渡せば等高線の 2 変数 PDP になり、等高線の傾きで交互作用の有無を読めます。曲線はモデルの振る舞いであって因果ではなく、相関の強い列ではデータにない組み合わせを評価している点に注意して読みます。

PDP vs ICE vs SHAP #

手法可視化対象交互作用の検出計算コスト
PDP平均的な限界効果2変数まで中
ICE個別の限界効果サブグループの違い中
SHAP特徴量の貢献度分配Shapley interaction高