生成AI入門 2026.05.24
XAI(説明可能AI)とは?機械学習の判断根拠をPythonコードで理解する入門ガイド
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等)
□ 説明を一般の人が理解できる言語で提供できる
□ バイアス検出を定期的に実施している
□ 人間によるオーバーライド(承認・却下)の仕組みがある
□ システムの精度・リスクを文書化している
□ 影響を受けた人が異議申し立てできる手順がある