はじめに
AIの予測結果を「なぜ?」と説明したいシーンは多々あります。
今回は私が大学時代に研究していた「説明可能なAI」に関する領域について紹介させていただきます。
「説明可能なAI」に関連するツールの中で、近年最も実用的かつ有名なのが SHAP (SHapley Additive exPlanations) です。
本記事では、SHAPの概要・特徴・簡単な使い方・活用上のポイントを整理します。
SHAPとは
1. SHAPの概要
SHAPは、機械学習モデルの「各特徴量が予測にどれだけ寄与したか」を数量的かつ直感的に算出できる解釈性ツールです。
ゲーム理論の「Shapley値」に基づくため、理論に基づいていることも特長のひとつです。
2. なぜSHAPが必要か
機械学習モデル、特にディープラーニングなどブラックボックス性の高いモデルでも、「この予測結果は●●という説明変数が主に効いている」と予測結果について説明できます。
また、実運用で意思決定支援や社内への説明などにも活用できます。
SHAPの特徴
1. 特徴量ごとの貢献度の可視化
予測値に対して、「各特徴量がどの程度、どんな方向で寄与したか」を、値としてもグラフとしても見える化できます。
2. 多様な機械学習モデルに対応
scikit-learn, Keras/TensorFlow、PyTorchなど広範囲に対応しています。
3. 直感的なグラフ・可視化ツール
bar plot, waterfall plot等、直感的な可視化がライブラリ内で簡単に使えます。
SHAPの活用例
1. モデル解釈の強化(ミクロな視点)
SHAPを利用することで、単なる「特徴量の重み」ではなく、各レコード(サンプル)ごとに、どの特徴量がどの程度予測に貢献したかを可視化できます。
たとえばwaterfall plotを使えば、「なぜこの予測値(あるいはクラス確率)になったのか」を個別ケースレベルで直感的に理解することが可能です。
2. 特徴量の重要度分析(マクロな視点)
全体のデータにおいて、「モデルがどの特徴量に強く依存しているか」「どの特徴量が予測を左右しているか」を棒グラフ(bar plotなど)として俯瞰できます。
これによりモデル全体の振る舞い・注目すべき変数が一目で分かり、特徴量エンジニアリングやモデル改善の指針にもなります。
3. 意思決定支援
SHAP値の可視化を通じて、「なぜこのアウトプットが出たのか?」という予測根拠の説明ができるため、異常値の要因分析や、現場での意思決定にも説得力を持たせられます。
ブラックボックスで終わらせず、内部ロジックの点検や運用改善にも応用可能です。
導入方法と基本的な使い方
1. インストール方法
SHAPはPyPIから簡単にインストールできます。
pip install shap
2. サンプルコード(scikit-learnのモデル例)
例えば、ランダムフォレストでSHAP値を可視化する例は以下の通りです。
import shap
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
# Irisデータセットの読み込み
X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names
# ランダムフォレストモデルの学習
model = RandomForestClassifier()
model.fit(X, y)
# SHAP Explainerの作成(モデルとデータセットを渡す)
explainer = shap.Explainer(model, X, feature_names=feature_names)
shap_values = explainer(X, check_additivity=False)
# 全体での特徴量重要度をbar plotとして可視化(保存用)
shap.summary_plot(shap_values, X, feature_names=feature_names, plot_type='bar', show=False)
plt.savefig('shap_barplot.png', bbox_inches='tight', dpi=300)
plt.close()
# ---- ここから1レコード(サンプル)のSHAP値可視化 ----
sample_idx = 0 # 最初のサンプルを例に
class_idx = 0 # 0番目のクラス(多クラスの場合は必要)
# 指定サンプル・クラスのSHAP値と基準値の抽出
values = shap_values.values[sample_idx, :, class_idx]
base_values = shap_values.base_values[sample_idx, class_idx]
data = X[sample_idx]
# SHAP Explanationオブジェクトを作成(個別説明用)
e = shap.Explanation(
values=values,
base_values=base_values,
data=data,
feature_names=feature_names
)
# Waterfall plot(個別予測の寄与分析)を作成し画像保存
shap.plots.waterfall(e, show=False, max_display=4)
plt.savefig('shap_waterfall.png', bbox_inches='tight', dpi=300)
plt.close()
# 確認出力
print("values:", values)
print("feature_names:", feature_names)
3. 実行結果と簡単な分析
waterfall plotについて:
waterfall plotは、レコード0のクラス0の予測値に対する各特徴量の貢献度を直感的に示しています。
まず、モデルのベースライン値(平均予測値)は「0.31」です。そこから、「sepal width」は+0の影響、「sepal length」は+0.02、「petal length」は+0.32、「petal width」は+0.35と、それぞれの特徴量が予測値へ影響を与えています。
最終的にこれらの合計で予測値「1」に達することがgraphから読み取れます。
このサンプルでは「petal length」と「petal width」が強く予測値に加算されているため、これらが平均的なレコードよりも値が良いことが分かります。
このように、waterfall plotを使うことで「なぜこの予測が出たのか」を個々の特徴量単位で説明することができます。
bar plotについて:
bar plotは、各特徴量のモデル全体での貢献度(重要度)を分かりやすく棒グラフで可視化したものです。このモデルにおいて「petal length」と「petal width」は非常に大きい影響力を持っており、「sepal width」と「sepal length」は影響力が小さいことが分かります。bar plotを使うことで、予測にほとんど貢献しない特徴量を見つけることができ、不要な変数の除去などの判断材料として活用できます。
SHAP利用時のおすすめTips
1. 実務での活用シーン
モデル選定・改善案の発見
SHAP値を確認することで、予測に強く効いている特徴量や、不要/冗長な特徴量を見逃さずに済みます。
意思決定支援
「なぜこの予測が出たか」を説明できるため、社内外説明や判断材料として非常に有用です。
個別事例の検証
特定レコードで期待しない予測が出た場合、waterfall plotで「どの変数が結果を押し上げたか/下げたか」を直感的に見られます。
異常検知
SHAP値で予測値を動かした主要因を特定しやすいため、業務運用上のアラート設計にも活用できます。
2. 注意点やパフォーマンス改善策
計算コストが高い場合がある
SHAP値は「全特徴量の組み合わせ」を評価するため、データ量やモデルによっては計算時間が長くなります。
⇒ サンプル数を減らす/KMeansで代表値にする等で最大表示数を調整などで工夫できます。
まとめ
SHAPは「機械学習モデルがなぜそう予測したか」を直感的かつ理論的に説明できるライブラリです。
特徴量の貢献度・重要度を可視化するだけでなく、現場での意思決定や業務フロー構築にも直接役立ちます。
本記事のPythonサンプルを活用し、まずは小さなモデルからSHAP値の可視化を体験してみてください。
モデルの解釈性・説明力向上を目指すなら、ぜひSHAPの導入を検討してみてはいかがでしょうか?
最後までお読みいただきありがとうございました!
この記事がみなさんの機械学習・AI活用に少しでも役立てば幸いです。

