こんにちは!ぼりたそです!
今回は機械学習モデルにおいて各データ(インスタンス)ごとの特徴量と予測値の関係を捉えることのできるICE(Individual Conditional Expectation)についてわかりやすく説明したいと思います。
この記事は以下のポイントでまとめています。
また、機械学習モデルの解釈法としてPFI, PD, SHAPについても過去にまとめているので、興味のある方は以下の記事を参照ください。
以下、順に解説していきます。
特徴量と予測値の解釈
機械学習モデルを解釈する際に特徴量と予測値の関係は非常に重要になってきます。
例えば、下の図のようにブラックボックスな機械学習モデルに対して、特徴量を増加させると予測値は増えていくのか減っていくのか、線形なのか非線形なのか、周期的か断続的かなどを知ることは機械学習モデルを解釈する際に非常に重要になってきますよね。
特徴量重要度の算出も解釈手法として優れていますが、あくまで特徴量がどの程度機械学習モデルに影響するかを示すもので、特徴量の増減に対して予測値がどのように振る舞うかを知ることはできません。
ここまで、特徴量と予測値の関係についての重要性を説明してきましたが、実際にどのような手法でその関係性を視覚化するかを説明していきます。
ICE(Individual Conditional Expectation)
機械学習モデルにおける特徴量と予測値の関係を可視化する手法としてICEという手法をご紹介します。
ICEとは一言で説明すると「興味のある特徴量を動かし、他の特徴量を固定することで予測値との関係を各データ(インスタンス)ごとに可視化する」手法です。
例えば、 $f(X_0, X_1, X_2)$ で表すことのできるモデルを構築した時、 $X_0$ と予測値の関係を可視化したいとします。
その場合、下の図のように $X_1, X_2$ の値は固定し、 $X_0$ の値のみを動かして予測値を算出します。
この時の特徴量と予測値の関係をインスタンスごとに可視化する手法がICEになります。
ICEとPDの違い
ここまでICEについて説明しましたが、似た手法にPD(Partial Dependence)というものがあります。
ICEは興味のある特徴量以外を固定して予測値との関係をインスタンスごとに可視化しますが、PDはインスタンス全体を平均化してから可視化しています。
わかりやすくICEとPDの違いを図に示します。
では、ICEとPDはどのように使い分ければいいのでしょうか?
PDのように平均化した方が全体としての特徴量と予測値の関係が捉えられていいのでは?と思いますが、一つ落とし穴があります。
それは特徴量間で交互作用がある場合です。
特徴量間に交互作用がある場合について、実際にICEとPDを実行することで理解を深めていきます。
ICEとPDの実行
それでは実際にPDとICEを実行していきます。
今回は例として $X = (X_1, X_2)$ とした時、以下の $f(X)$ に従うデータを生成してPDを実行してみます。
$$f(X) = \sin ( X_1 ) \cos( X_2 )$$
この関数は $X_1$ , $X_2$ の間に交互作用があり、 $X_1$ に対する $f(X)$ のグラフは以下のようになっており、 $X_2$ の値によって正負が反転するインスタンスも存在する設定になっています。
また、今回の機械学習モデルはランダムフォレスト回帰を使用しており、 $X$ の範囲は $-2 \pi < X < 2 \pi$ としています。
使用したPythonコードは以下の通りとなります。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.inspection import PartialDependenceDisplay
from sklearn.model_selection import train_test_split
# データ作成
np.random.seed(42)
n_samples = 1000
X1 = np.random.uniform(-2 * np.pi, 2 * np.pi, n_samples) # 変数 x を X1 に変更
X2 = np.random.uniform(-2 * np.pi, 2 * np.pi, n_samples) # 変数 y を X2 に変更
X = np.column_stack([X1, X2]) # X1, X2 を使って特徴量行列 X を作成
# 真の関数 f(X1, X2) = sin(X1) * cos(X2) + ノイズ
f_true = np.sin(X1) * np.cos(X2)
noise = np.random.normal(0, 0.1, n_samples) # ノイズを加える
target = f_true + noise
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, target, test_size=0.2, random_state=42)
# モデルの学習 (Random Forest Regressor)
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 特徴量インデックス (0: X1, 1: X2)
feature_index = 0 # X1 に対する PD と ICE を計算
# 部分依存プロット (PD) と ICE の計算とプロット
fig, ax = plt.subplots(figsize=(10, 6))
# ICE プロット (包括的に計算)
PartialDependenceDisplay.from_estimator(
model, X_test, features=[feature_index], kind='both', ax=ax, grid_resolution=50
)
plt.tight_layout()
plt.show()
実行結果は以下の通りとなっており、 $X_1$ に対して予測値の関係をPDおよびICEで可視化しています。
見辛くて申し訳ないのですが、グラフ中の無数の細い青線がICEの結果、太線がPDの結果を表しています。
これを見ると、ICEは各インスタンスごとに特徴量 $X_1$ と予測値の関係を可視化しているので、 $X_1$ , $X_2$ の交互作用をきちんと表現できています。
一方、PDはインスタンスを全体で平均化してしまうため、ほぼ0で推移しており、特徴量と予測値の関係が表現できていないことがわかります。
因果関係としての解釈
続いて、ICEにより特徴量と予測値の関係が可視化できた際にそれを因果関係として解釈しても良いかという点について説明していきます。
結論、ICEにより算出した特徴量と予測値の関係をそのまま因果関係として捉えるのはリスクが高いです。
理由としては偽相関の恐れがあるためです。
下の図のように目的変数 $Y$ 対して因果関係にある特徴量 $X_0$ があるとします。さらにこの $X_0$ と強く相関を持つ $X_1$ があるとします。なお、 $X_1$ と $Y$ の間には因果関係は全くないとします。
この場合、ICEの性質上 $X_0$ が学習モデルに入っていればいいですが、 $X_1$ のみ学習モデルに入れている場合は最悪のパターンです。全く因果関係がない特徴量と目的変数をあたかも因果関係があるように解釈してしまう恐れがあるからです。
なので、ICEによる特徴量と予測値の関係が可視化できたからといって容易に特徴量を因果関係と結びつけるのではなく、あくまで特徴量と目的変数の因果関係を立証する仮説として考えた方が良いです。
また、ICEの結果を単純に「特徴量に対する予測値の平均的な関係」として捉える分には問題なく、因果関係ではなくモデルの振る舞いとして解釈するのが安全な利用方法と言えます。
参考書籍
本記事を作成するにあたり参考にさせていただいた書籍をご紹介します。
■機械学習を解釈する技術〜予測力と説明力を両立する実践テクニック〜
この書籍は機械学習を解釈する手法としてPFI、PD、ICE、SHAPの大きく4つについて解説している書籍になります。
私が読んだ所感ですが、線形回帰の説明から始まり、機械学習モデルの解釈の必要性や目的に応じた手法が順序立てて説明されており非常に読みやすかったです。
また、簡単なモデルを例としていたため、数学的に躓く箇所もほとんどありませんでした。
さらに、Pythonコードも公開されているので、学んだ内容をすぐに実践できるのもオススメできるポイントです。
もしご興味ある方がいましたら購入を検討されてはいかがでしょうか?
終わりに
以上が機械学習モデルにおいて、データごとの特徴量と予測値の関係を捉える手法であるICEの紹介になります。ICEは特徴量間に交互作用のある場合に非常に有効だと思いますが、実際の問題で交互作用があるかどうかは不明なケースが多いので、PDとICEはどちらも実行してみるのがいいのかなと感じました。