モデル解釈 & 説明可能性 (XAI) 入門
『その予測、どうして?』に答えられる AI だけがビジネスで生き残る。グローバル/ローカル解釈、モデル固有/モデル非依存手法、SHAP・LIME から Counterfactual まで、基礎と実装フローを初学者向けに整理
📅 2025-04-28
📌
🔍 なぜ説明可能性が必要か?
視点 | 具体シナリオ | リスク |
---|---|---|
法規制 | EU AI Act 米国金融モデルリスク管理 (SR 11-7) |
"ブラックボックス"は使用禁止/罰金 |
ビジネス | 融資審査・医療診断 | 理由を説明できないと意思決定者が採用しない |
技術 | データバイアス・リーク | 本番で精度暴落・差別的判断 |
格言:「精度が信頼を保証しない。説明が信頼を保証する。」
📝
🧩 解釈の2×2マトリクス
グローバル (モデル全体) |
ローカル (個々の予測) |
|
モデル固有 | 決定木のルール可視化 線形回帰の係数 |
KNN の近傍例 |
モデル非依存 | Permutation Importance Partial Dependence Plot |
SHAP / LIME / Counterfactual |
モデル固有構造自体が理解しやすい (線形・ツリー)。
モデル非依存どんなブラックボックスでも 入力 ↔ 出力 の振る舞いを観察。
📊
📚 主要手法カタログ
Feature Importance
何を示す?変数の寄与度
適用モデル任意
Pros / Cons直感的 / 相互作用は捉えにくい
Partial Dependence (PDP)
何を示す?特徴量と予測平均の関係
適用モデル任意
Pros / Consグローバル傾向○ / 高次元×
SHAP・LIME
何を示す?各特徴の貢献・近傍説明
適用モデル任意
Pros / Cons理論保証 / 計算コスト大
💻
🐍 Python 実装フロー (SHAP例)
import shap, xgboost, pandas as pd
X, y = load_boston(return_X_y=True, as_frame=True)
model = xgboost.XGBRegressor().fit(X, y)
explainer = shap.Explainer(model, X)
shap_values = explainer(X.iloc[:100])
# ① グローバル:重要度バー
shap.plots.bar(shap_values)
# ② ローカル:水泳図(force plot)
shap.plots.waterfall(shap_values[0])
* Tip:大規模データは shap.sample(X, 5000) で速度改善
* 解釈:正方向(赤)・負方向(青)寄与、合計が予測値
🎯
🧪 ユースケース別おすすめ手法
ドメイン | 問題 | 推奨 |
---|---|---|
融資スコアリング | 公平性検証 | SHAP + Counterfactual (性別入替) |
医用画像 | 病変部位の可視化 | Grad-CAM / Score-CAM |
マーケ施策 | 変数の感度分析 | PDP + ICE |
IoT 異常検知 | アラート根因分析 | LIME (高速) |
LLM 出力 | 出典確認 | RAG + Citation + SHAP-text |
📏
📈 評価指標とテスト
指標 | 目的 | 例 |
---|---|---|
Faithfulness | 重要度≒性能低下度? | シャッフル前後の MSE 差 |
Stability | サンプルor初期値に頑健? | 再計算して順位一致率 |
Complexity | 説明の長さ適切? | ルール数、平均深さ |
🔄 検証を繰り返す
説明性と精度のバランスを最適化
🧪 実務家評価を含める
技術指標だけでなく理解度も確認
✅
📋 実務導入チェックリスト
- ビジネス&規制要件で必要説明粒度を定義
- グローバル vs ローカル の両輪を用意
- UI/レポート:ビジネス部門向けに自然言語+可視化
- モデル更新時は 再解釈 → drift 監視
- セキュリティ/プライバシー:説明に個人情報が漏れないか
運用プロセス化が重要! 説明可能性は一度きりの分析ではなく継続的な活動
🏁
💡 まとめ
- バケツリスト:Feature Importance → PDP → SHAP が王道
- グローバル・ローカル をセットで把握すると意思決定が楽
- 理論だけでなく 評価指標・運用ガバナンス まで含めて XAI
- "説明のためのモデル"ではなく"目的達成のための説明"を忘れずに
🔮
🧠 補足:Counterfactual事例
Counterfactualとは?
"もし〜だったら?"の反事実で予測を変える最小変化を探索
例:ローン拒否→承認に変わる最小の収入増加額は?
# DiCE ライブラリ使用例
from dice_ml import DiCE
# モデルとデータを準備
d = dice_ml.Data(...)
m = dice_ml.Model(model, backend="tf2")
exp = dice_ml.Dice(d, m)
# 反事実例を生成
counterfactuals = exp.generate_counterfactuals(
query_instance,
total_CFs=3,
desired_class="approved"
)
* ActionableなCounterfactualは介入検討に直結 → 本質的XAI