生成AI入門 2026.05.24

XAI(説明可能AI)とは?機械学習の判断根拠をPythonコードで理解する入門ガイド

タグ:XAI / 機械学習 / AI入門 / 解釈可能性 / 生成AI

XAIが必要な理由(3つのシナリオ)

シナリオ1:銀行の融資審査
  AI「この申請者は融資不可」
  申請者「なぜですか?」← 理由の説明義務あり(EU AI Act)

シナリオ2:医療診断
  AI「この画像は悪性腫瘍の疑いあり」
  医師「どの部位が根拠ですか?」← 臨床判断に必要

シナリオ3:採用スクリーニング
  AI「この応募者は不合格」
  HR「差別的なバイアスがないか?」← 法的リスク管理

SHAPで特徴量の重要度を計算する

# shap_example.py
# pip install shap scikit-learn pandas

import shap
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
import numpy as np

# サンプルデータ作成(信用スコアリングの例)
X, y = make_classification(n_samples=1000, n_features=5, random_state=42)
feature_names = ["年収", "借入残高", "返済履歴スコア", "雇用年数", "負債比率"]
X_df = pd.DataFrame(X, columns=feature_names)

# モデルの学習
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_df, y)

# SHAPで説明を生成
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_df)

# 1人の申請者の判断根拠を表示
applicant_idx = 0
print("申請者0番の融資判断の根拠:")
for feature, shap_val in zip(feature_names, shap_values[1][applicant_idx]):
    direction = "融資承認方向 ↑" if shap_val > 0 else "融資否決方向 ↓"
    print(f"  {feature}: {shap_val:+.3f} ({direction})")

LIMEで画像・テキストを説明する

# lime_example.py
# pip install lime scikit-learn

from lime.lime_tabular import LimeTabularExplainer
import numpy as np

# LIMEエクスプレイナーの作成
explainer = LimeTabularExplainer(
    training_data=X_df.values,
    feature_names=feature_names,
    class_names=["融資否決", "融資承認"],
    mode="classification",
)

# 1件の説明を生成
explanation = explainer.explain_instance(
    X_df.iloc[0].values,
    model.predict_proba,
    num_features=5
)

print("LIME説明(融資承認への影響度):")
for feature, impact in explanation.as_list():
    direction = "✅ プラス" if impact > 0 else "❌ マイナス"
    print(f"  {feature}: {impact:+.3f} {direction}")

ClaudeでAIの判断を日本語で説明する

# explain_with_claude.py
# SHAPの数値結果をClaudeが自然言語で説明する

import anthropic
import os

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

def explain_with_claude(shap_dict: dict, decision: str, audience: str = "一般") -> str:
    """SHAPの結果をClaude Haikuで自然言語の説明に変換する"""
    
    factors = "\n".join(
        f"- {k}: {v:+.3f} ({'プラス要因' if v > 0 else 'マイナス要因'})"
        for k, v in sorted(shap_dict.items(), key=lambda x: abs(x[1]), reverse=True)
    )
    
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 大量処理でもコスト$0.001以下/件
        max_tokens=512,
        messages=[{"role": "user", "content": f"""
AIが「{decision}」と判断しました。以下の要因分析を元に、
{audience}向けに分かりやすく3文以内で説明してください。

要因分析:
{factors}

回答は「この判断は〜」で始めてください。
"""}]
    )
    return response.content[0].text

# 使用例
shap_dict = dict(zip(feature_names, shap_values[1][0]))
explanation = explain_with_claude(shap_dict, "融資否決", audience="申請者")
print(explanation)

EU AI Act対応チェックリスト

高リスクAI(融資・採用・医療)を運用する企業向け:

□ 判断根拠の説明機能を実装している(SHAP/LIME等)
□ 説明を一般の人が理解できる言語で提供できる
□ バイアス検出を定期的に実施している
□ 人間によるオーバーライド(承認・却下)の仕組みがある
□ システムの精度・リスクを文書化している
□ 影響を受けた人が異議申し立てできる手順がある

あわせて読みたい

参考ソース