Partial Dependence Plot: 機械学習モデルを「特徴量と予測値の平均的な関係」から解釈する

機械学習モデルを解釈する手法の一つとして、「ある特徴量の値が変化したときにモデルの予測値がどのように変化するのか」を可視化する Partial Dependence Plot (PDP) があります。本ブログ記事では、PDPの計算方法やPythonによる実行例、実際に利用する際の注意点などについて説明します。
1 はじめに
機械学習モデルを特徴量重要度という観点から解釈する手法に Permutation Importance (PI) があります。PIは計算方法がシンプルで直感的な解釈が可能である一方、モデルの予測値と特徴量がどのような関係であるのかを明らかにすることはできません。PIで計算される特徴量重要度から更に踏み込んで、「ある特徴量の値が変化したときにモデルの予測値がどのように変化するのか」を理解する手法として Partial Dependence Plot (PDP) が知られています。
本ブログ記事では、PDPの計算方法やPythonによる実行例、実際に利用する際の注意点について説明します。
Permutation Importanceの記事はこちら:
2 Partial Dependence Plot の計算方法
Partial Dependence Plot (PDP) は、機械学習モデルにおける特定の特徴量とターゲット変数との平均的な関係を視覚的に示す手法です。PDPを用いれば、ある特徴量の値が大きくなった時にモデルの予測値はどのように変化するのかを捉えることができます。
計算方法
具体的には次の手順によってPDPが計算されます。
1. ターゲット変数との関係を知りたい特徴量以外のすべての特徴量の値を固定し、テストデータの各データ点について、対象の特徴量の値を適切な範囲にわたって置き換える。
2. それぞれ値を置き換えたデータに対して予測を行い、その平均値を算出する。
3. 「変更した特徴量の値」と「モデルの予測値の平均値」をプロットすることで、対象の特徴量とモデルの予測値の平均的な関係を可視化する。
(森下 (2021)『機械学習を解釈する技術』を元に作成)
3 Pythonでの実行例
実行環境
Python 3.11.9
まず、必要なライブラリをインポートします。
# 必要なライブラリをインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.inspection import
データの準備
ここでは、scikit-learnの fetch_california_housing データセットを使用します。 このデータセットに含まれる様々な特徴量から、カリフォルニア州の住宅価格を予測する回帰モデルを構築します。
# カリフォルニア住宅価格データセットを読み込む
california = fetch_california_housing()
# データをDataFrameに変換
df = pd.DataFrame(california.data, columns=california.feature_names)
# カラム名を日本語に変更
japanese_columns = {
'MedInc': '世帯の中央値収入',
'HouseAge': '住宅の築年数',
'AveRooms': '平均部屋数',
'AveBedrms': '平均寝室数',
'Population': '人口',
'AveOccup': '世帯の平均人数',
'Latitude': '緯度',
'Longitude': '経度',
}
df.rename(columns=japanese_columns, inplace=True)
df['住宅価格'] = california.target
# 特徴量とターゲットに分ける
X = df.drop('住宅価格', axis=1)
y = df['住宅価格']
# データをトレーニングセットとテストセットに分割(8:2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
学習済みモデルの準備
今回は、scikit-learnの GradientBoostingRegressor を用いて予測モデルを学習します。
PDPはモデルの学習アルゴリズムに依存しないため、解きたい問題設定に応じて他のアルゴリズムを使用することもできます。
# モデルの構築
gbr = GradientBoostingRegressor()
# モデルのトレーニング
gbr.fit(X_train, y_train)
PDPの計算と可視化
Pythonでは、scikit-learnの PartialDependenceDisplay を用いて簡単にPDPを計算・可視化することができます。
# PDPを描画したい特徴量を指定
features_to_plot = [0] # 例として1つ目の特徴量を指定
# PDPの描画
plt.figure(figsize=(10, 6))
PartialDependenceDisplay.from_estimator(gbr, X_train, features=features_to_plot, feature_names=X.columns)
plt.show()
結果として、以下のようなグラフが出力されます。 折れ線グラフの横軸は特徴量「世帯の中央値収入」を適切な範囲にわたって置き換えた値、縦軸はそのときのモデルの予測値の平均値を表しています。 縦棒グラフは「世帯の中央値収入」の分布を表しています。
4 利点と注意点
PDPには、主に以下のようなメリットがあります。
特徴量の重要度より詳細な解釈が可能
対象の特徴量のみが変化したときの平均的なモデルの予測値を計算するため、特徴量と予測値がどのように関係しているのかを可視化することができます。
機械学習アルゴリズムに依存しない
モデルの学習アルゴリズムに依存せずに使用できるため、モデル間の比較も可能。
一方で、PDPにはいくつかの限界点があるため、使用する際には注意が必要です。
特徴量間の相関を無視している
PDPでは、対象とする特徴量の値が他の特徴量と独立して変化した場合のモデルの予測値を計算します。そのため、対象とする特徴量が他の特徴量と相関していない場合にはクリアな解釈が可能である一方、特徴量間に強い相関が存在する場合には結果の解釈に注意が必要です。
データ点ごとの異質性を無視している
特徴量とモデルの予測値との関係は、各データ点によって異なるはずです。 しかし、PDPでは特徴量の値を変化させたときの各データ点に対するモデルの予測値を平均してしまうため、その異質性を捉えることはできません。
因果関係として解釈できない
PDPで計算されるのはあくまで予測モデルの中での特徴量とターゲット変数の相関関係である。PDPによって、ある特徴量の値とモデルの予測値の間に右上がりの傾向が見られたとしても、それはあくまで両者に正の相関があるということにすぎません。因果関係について議論したい場合には、PDPで発見された相関関係をヒントにして、より厳密な因果推論の手法を用いる必要があります。
5 まとめ
Partial Dependence Plot(PDP)は、特定の特徴量がモデルの予測値とどのように関係しているかを理解するための有効な手法です。一方で、特徴量間の相関を考慮できない、データ点ごとの異質性を捉えることができない、因果関係として解釈できないという限界も存在します。これらの限界を理解したうえでPDPを用いることで、誤解を招くモデルの解釈を防ぐことができるでしょう。
6 参考資料
森下(2021)『機械学習を解釈する技術』技術評論社
Christoph Molnar (2024) Interpretable Machine Learning.