SHAP

2.10.1

SHAP

最終更新 2026-03-03 読了時間 1 分
まとめ
  • 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