1. なぜ医療AIに「説明」が要るのか
どれだけ精度が高くても、「理由は分からないが悪性です」と言うAIを、医師はそのまま信じられません。 医療AIには、精度とは別に「なぜその判断に至ったか」を示す力—— 説明可能性(XAI: eXplainable AI)——が求められます。理由は主に3つです。
- 医師が納得して使うため……根拠が見えれば、AIの出力を自分の所見と照らし合わせられる
- 患者へ説明するため……「なぜこの検査・治療を勧めるのか」の説明責任に応える
- 監査・規制のため……レッスン10で扱う医療機器の審査でも、判断根拠の説明が問われる
💡 ブラックボックス問題: 深層学習のような複雑なモデルは、内部で何百万もの計算をしていて、 人間が「なぜこの答えか」を直接たどれません。これをブラックボックス問題と呼びます。 XAIは、この箱に外から光を当てて、判断の手がかりを推し量る技術です。 「完全に開ける」のではなく「手がかりを得る」——この距離感が大切です。
2. permutation importance — 「どの特徴量が効いたか」を測る
テーブルデータのモデルで「どの特徴量が効いたか」を調べる、モデル非依存の方法が permutation importance(並べ替え重要度)です。 アイデアはシンプル——ある特徴量の値をシャッフルして、性能がどれだけ落ちるかを見る。 大きく落ちるほど、その特徴量は予測に効いていた、と分かります。 レッスン4で作った乳がんモデルで実際に出してみましょう。
上位に worst area(最も大きい核の面積)、worst concave points(核のくぼみの数)
が並びます。「大きく・いびつな核」が悪性判定の決め手になっている——
レッスン3のEDAで見た医学的傾向と一致し、
モデルが妥当な手がかりを見ていると確認できます。これが医師にとっての安心材料になります。
💡 組み込みの重要度との違い:
ランダムフォレストには feature_importances_ という組み込みの重要度もありますが、
これは訓練データ上の分岐の使われ方にもとづきます。
permutation importance はテストデータで実際に性能が落ちるかを見るので、
「本番で効くか」に近く、どんなモデルにも使えるのが利点です。両方見て一致すれば信頼度が上がります。
3. 画像モデルの説明 — Grad-CAM
画像モデル(CNN)では、「画像のどこを見て判断したか」を知りたくなります。 それをヒートマップで示す代表的な手法がGrad-CAMです。 仕組みは、CNNの最後の畳み込み層の特徴マップを、 「その判断への効き具合(勾配)」で重みづけして足し合わせるというものです。 「効き具合」は、そのマップが変わると判断のスコアがどれだけ動くか(勾配)から求めます。 数式の導出と元論文は E資格対策「深層学習の説明性(XAI)」にまとめています。
PyTorchでの実装の骨格は次のようになります(読み解き)。
import torch
import torch.nn.functional as F
def grad_cam(features, grads):
# features: (1, K, h, w) … 最後の畳み込み層の出力(K枚の特徴マップ)
# grads: (1, K, h, w) … そのクラスのスコアを features で微分した勾配
weights = grads.mean(dim=(2, 3), keepdim=True) # 各マップの重み=勾配の空間平均 (1, K, 1, 1)
cam = F.relu((weights * features).sum(dim=1)) # 重みづけして足し合わせ、正の寄与だけ残す (1, h, w)
cam = (cam - cam.min()) / (cam.max() - cam.min() + 1e-8) # 0〜1に正規化
return cam # あとは元画像サイズに拡大して重ねる
# 実際の features は forward hook、grads は backward(.register_hook)で取り出す。
# ここでは形を確かめるため、ダミーの値を入れて動かす(K=32枚・8×8)
features = torch.rand(1, 32, 8, 8)
grads = torch.rand(1, 32, 8, 8)
cam = grad_cam(features, grads)
print("ヒートマップ shape:", cam.shape)
ヒートマップ shape: torch.Size([1, 8, 8])
得られたヒートマップを元画像に重ねると、「モデルが注目した領域」が赤く光ります。 肺結節の分類なら、結節のあたりが光っていれば「妥当な根拠で見ている」と読めます。 逆に、病変と関係ない場所(画像の隅の文字や体位マーカーなど)が光っていたら、 モデルが変な手がかりを使っている警告サインです。
4. 説明を「過信」しない
XAIは強力ですが、万能でも完全でもありません。医療で使ううえで、必ず心に留めるべき限界があります。
⚠ ヒートマップは「根拠らしき場所」であって「因果」ではない: Grad-CAMが光らせるのは「判断と相関した領域」であり、 「そこが医学的な理由だ」と保証するものではありません。 レッスン6の相関と因果の話と同じ構図です。 もっともらしいヒートマップが出ても、それが正しい理由とは限らないのです。
- 説明手法によって結果が違う……Grad-CAMと別の手法(SHAP等)で注目領域がずれることもある。「1つの説明=真実」ではない
- もっともらしさに騙される……人はきれいなヒートマップを見ると根拠を信じやすい。説明が説得力を持つほど、検証が甘くなる危険がある
- 説明は仮説であって証明ではない……XAIの出力は「なぜかもしれない」の手がかり。最終判断はやはり医師が下す
💡 開発者の姿勢: XAIは「AIを信じさせる道具」ではなく、「AIを疑い、検証するための道具」として使うのが健全です。 変な領域を見ていないか、効いている特徴量は妥当か——説明を使ってモデルの弱点を探す。 それが、医療という失敗の許されない現場での、XAIの正しい使い方です。
5. 練習問題
permutation importance の考え方
permutation importance は、ある特徴量の重要度をどうやって測りますか。
- A. その特徴量の値をシャッフルし、性能がどれだけ落ちるかを見る
- B. その特徴量だけでモデルを学習し直して精度を見る
- C. その特徴量の平均値を計算する
答えと解説を見る
正解:A
ある特徴量の値だけをランダムにシャッフルして無意味化し、 それで性能がどれだけ落ちるかを測ります。大きく落ちれば「その特徴量に頼っていた=重要」。 モデルを学習し直す必要がなく、どんなモデルにも後付けで使えるのが利点です。
重要度の下位も見てみる
sample_1 を改造して、重要度の下位5つ(あまり効いていない特徴量)も表示してみましょう。
ヒントを見る(答え+解説)
print("== 下位5 ==")
print(imp.sort_values(ascending=True).head(5).round(4))
下位には、重要度がほぼ0やわずかにマイナスの特徴量が並びます。 マイナスは「シャッフルしても性能が落ちない(むしろ偶然わずかに上がった)」=予測にほとんど使われていないということ。 こうした特徴量は削っても大きく影響しないことが多く、モデルの単純化のヒントにもなります。
ヒートマップが病変と別の場所を光らせたら?
肺結節を分類するCNNのGrad-CAMが、結節ではなく画像の隅にある撮影日時の文字を光らせていました。 これは何を意味しますか。
答えと解説を見る
モデルが病変ではなく「無関係な手がかり」で判断している危険信号です。
たとえば「病変ありの画像が特定の病院・特定の機種で撮られていた」場合、 モデルは病変そのものではなくその病院特有の文字や写り込みを見て当てているかもしれません。 これでは他院ではまったく通用しません(レッスン11の分布シフトに直結)。 XAIは、こうした「正しい理由で当てているか」を検証するために使うのが本来の役割です。
6. まとめ
このレッスンのポイント
- 医療AIには精度と別に説明可能性(XAI)が要る(医師の納得・患者への説明・規制/監査)
- permutation importance:特徴量をシャッフルして性能低下を測る。乳がんモデルは「大きく・いびつな核」に注目していた
- Grad-CAM:CNNの特徴マップを勾配で重みづけし、注目領域をヒートマップで示す
- ヒートマップは「根拠らしき場所」であって因果ではない。手法で結果も変わる
- XAIはAIを信じさせる道具ではなく、疑い・検証する道具として使う
モデルを作り、正しく評価し、説明する——技術的な柱がそろいました。 残るUnit 4では、医療AIを実社会で使うためのルールと責任へ。 次のレッスンは、避けて通れない規制(SaMD・薬機法)です。
完了するとコース一覧に進捗が記録されます