まとめ- SHAP(SHapley Additive exPlanations)はゲーム理論の Shapley 値を応用し、各特徴量が個々の予測にどれだけ貢献したかを定量化する。
- グローバル(モデル全体)とローカル(個別予測)の両レベルで解釈を提供し、ブラックボックスモデルの透明性を高める。
shap ライブラリで XGBoost / LightGBM / ランダムフォレストなど主要モデルに対応。
直感
#
5人でプロジェクトを完遂したとき、「誰がどれだけ貢献したか」を公平に評価するのが Shapley 値の考え方。SHAP はこれを機械学習に応用し、1つの予測に対して「各特徴量がどれだけ予測値を押し上げ(下げ)たか」を分配する。すべての特徴量の SHAP 値を合計すると、必ずモデルの出力と一致する(加法性)。
詳細な解説
#
ライブラリとデータ
#
1
2
3
4
5
6
7
8
9
10
| import numpy as np
import shap
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
|
モデル学習と SHAP 値の計算
#
1
2
3
4
5
6
7
8
| model = XGBClassifier(
n_estimators=100, max_depth=4, learning_rate=0.1,
random_state=42, eval_metric="logloss"
)
model.fit(X_train, y_train)
explainer = shap.TreeExplainer(model)
shap_values = explainer(X_test)
|
グローバル解釈 — Summary Plot
#
各特徴量の SHAP 値の分布を可視化し、モデル全体の傾向を把握します。
1
| shap.plots.beeswarm(shap_values)
|
- 縦軸: 特徴量(SHAP 値の絶対値が大きい順)
- 横軸: SHAP 値(正なら予測を押し上げ、負なら押し下げ)
- 色: 特徴量の実際の値(赤=高い、青=低い)
ローカル解釈 — Waterfall Plot
#
個別の予測がどのように構成されているかを分解して表示します。
1
| shap.plots.waterfall(shap_values[0])
|
特徴量間の相互作用
#
1
| shap.plots.scatter(shap_values[:, "worst radius"], color=shap_values)
|
使い分けのポイント
#
| 手法 | 解釈レベル | 計算コスト | モデル依存 |
|---|
| TreeExplainer | グローバル/ローカル | 低(木モデル専用) | Yes |
| KernelExplainer | グローバル/ローカル | 高(汎用) | No |
| LinearExplainer | グローバル/ローカル | 低(線形モデル専用) | Yes |