shap/shap

A game theoretic approach to explain the output of any machine learning model.

SHAPとは?

SHAP (SHapley Additive exPlanations) は、ゲーム理論の概念を用いて機械学習モデルの予測を説明するPythonライブラリです。モデルの出力に対する各入力特徴量の寄与を公平に割り当てる Shapley値 を計算し、モデルの予測値とベースライン(参照データセット上の平均予測値)との差分に対する加法的な寄与として提示します。

なぜ重要なのか

  • モデル非依存 – あらゆる予測器(ツリー、線形モデル、ディープラーニング、NLPパイプラインなど)で動作します。
  • 一貫性と局所的な正確性 – 望ましい理論的特性を複数満たす唯一の加法的な特徴量寄与度手法です。
  • 豊富な可視化 – ウォーターフォール、フォース、ビースウォーム、棒グラフ、散布図、決定プロット、テキストによる説明により、特徴量がどのように予測を押し上げたり押し下げたりしているかを視覚的に確認できます。

インストール方法

pip install shap          # from PyPI
# or
conda install -c conda-forge shap

GPU加速されたツリーモデルの解釈は、オプションの cuda エクストラで利用可能です:

pip install "shap[cuda]"

(ホスト側に CUDA ツールキットが必要です。)

主要機能(クイックツアー)

1. ツリーモデル (XGBoost, LightGBM, CatBoost, scikit‑learn, Spark)

import shap, xgboost
X, y = shap.datasets.california()
model = xgboost.XGBRegressor().fit(X, y)
explainer = shap.Explainer(model)   # auto‑detects TreeExplainer
shap_vals = explainer(X)
shap.plots.waterfall(shap_vals[0])   # single‑instance explanation

可視化: ウォーターフォール、フォース、ビースウォーム、棒グラフ。

2. 自然言語モデル (Hugging Face transformers)

import shap, transformers
model = transformers.pipeline('sentiment-analysis')
explainer = shap.Explainer(model)
shap_vals = explainer(["What a great movie!", "...if you have no taste."])
shap.plots.text(shap_vals[0, :, "POSITIVE"])

どの単語がポジティブまたはネガティブな感情に寄与したかを示します。

3. ディープラーニング (TensorFlow/Keras, PyTorch) – DeepExplainer

import shap, numpy as np
background = x_train[np.random.choice(len(x_train), 100, replace=False)]
explainer = shap.DeepExplainer(model, background)
shap_vals = explainer.shap_values(x_test[:5])
shap.image_plot(shap_vals, -x_test[:5])

画像モデルに対してピクセルレベルの寄与度を生成します。

4. 期待勾配 – GradientExplainer

Integrated GradientsとSHAPのアイデアを組み合わせたもので、あらゆるTF/KerasまたはPyTorchモデルで動作し、中間層の解釈も可能です。

5. モデル非依存 – KernelExplainer

import shap, sklearn
svm = sklearn.svm.SVC(kernel='rbf', probability=True).fit(X_train, y_train)
explainer = shap.KernelExplainer(svm.predict_proba, X_train, link='logit')
shap_vals = explainer.shap_values(X_test, nsamples=100)
shap.force_plot(explainer.expected_value[0], shap_vals[0][0], X_test.iloc[0])

あらゆるブラックボックス関数で動作しますが、計算速度は遅くなります。

6. 相互作用値

ツリーモデルでは、ペアとなる特徴量の相互作用を取得することも可能です:

shap_inter = shap.TreeExplainer(model).shap_interaction_values(X)

対角成分は主効果を保持し、非対角成分は2つの特徴量がどのように共同で予測に影響を与えているかを示します。

ドキュメントと学習リソース

  • 公式ドキュメント: https://shap.readthedocs.io
  • サンプルノートブック: ツリー、ディープ、勾配、線形、カーネルエクスプレイナーを網羅(例:NHANES生存モデル、MNIST数字分類、VGG16中間層分析など)。
  • 引用: READMEには、Tree SHAPおよびより広範なSHAPフレームワークを紹介したNature Machine IntelligenceおよびNature Biomedical Engineeringの論文へのリンクがあります。

SHAPは誰のためのものか?

  • ステークホルダーや規制遵守のためにモデルの予測を解釈する必要があるデータサイエンティスト。
  • 表形式、テキスト、画像データのための説明可能なAIパイプラインを構築する研究者。
  • グローバルな指標を超えて、特徴量の重要性に対する視覚的かつ定量的な洞察を求めるすべての人。

TL;DR: SHAPは、あらゆる機械学習モデルの予測を、数学的根拠に基づいた明確な特徴量寄与度に変換する、成熟した広く利用されているPythonライブラリです。ツリー、ディープラーニング、汎用モデル向けの高速なアルゴリズムと、すぐに使える多くの可視化ツールを備えています。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト
  • Dispatch