Sensitivity/Specificity評価
「医療画像AIでは、AccuracyやF1だけでは不十分だ。」
田中VPoEが評価指標を説明する。
「Sensitivity(感度)は病気を正しく検知する能力、Specificity(特異度)は正常を正しく判定する能力。この2つのバランスが、画像診断AIの品質を決める。」
指標の定義
| 指標 | 定義 | 意味 |
|---|---|---|
| Sensitivity (Recall) | TP / (TP + FN) | 病気の人を正しく検知する割合 |
| Specificity | TN / (TN + FP) | 正常の人を正しく判定する割合 |
| PPV (Precision) | TP / (TP + FP) | 陽性と判定した中で本当に病気の割合 |
| NPV | TN / (TN + FN) | 陰性と判定した中で本当に正常の割合 |
| AUC-ROC | ROC曲線下面積 | 総合的な判別能力 |
計算の実装
from sklearn.metrics import confusion_matrix, roc_auc_score, roc_curve
import numpy as np
def compute_diagnostic_metrics(y_true, y_pred, y_prob):
"""診断系の評価指標を計算"""
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
sensitivity = tp / (tp + fn) if (tp + fn) > 0 else 0
specificity = tn / (tn + fp) if (tn + fp) > 0 else 0
ppv = tp / (tp + fp) if (tp + fp) > 0 else 0
npv = tn / (tn + fn) if (tn + fn) > 0 else 0
auc = roc_auc_score(y_true, y_prob)
return {
'sensitivity': round(sensitivity, 4),
'specificity': round(specificity, 4),
'ppv': round(ppv, 4),
'npv': round(npv, 4),
'auc_roc': round(auc, 4),
'confusion_matrix': {'tn': int(tn), 'fp': int(fp), 'fn': int(fn), 'tp': int(tp)},
}
閾値とSensitivity/Specificityのトレードオフ
def find_optimal_threshold(y_true, y_prob, min_sensitivity=0.95):
"""最低Sensitivityを保証しつつSpecificityを最大化する閾値を探索"""
thresholds = np.arange(0.01, 1.0, 0.01)
best = {'threshold': 0.5, 'specificity': 0}
for thresh in thresholds:
y_pred = (y_prob >= thresh).astype(int)
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
sensitivity = tp / (tp + fn) if (tp + fn) > 0 else 0
specificity = tn / (tn + fp) if (tn + fp) > 0 else 0
if sensitivity >= min_sensitivity and specificity > best['specificity']:
best = {
'threshold': round(thresh, 2),
'sensitivity': round(sensitivity, 4),
'specificity': round(specificity, 4),
}
return best
# 使用例
# スクリーニング: Sensitivity >= 0.95 を保証
optimal = find_optimal_threshold(y_true, y_prob, min_sensitivity=0.95)
print(f"最適閾値: {optimal['threshold']}")
print(f"Sensitivity: {optimal['sensitivity']}, Specificity: {optimal['specificity']}")
用途別の指標重視度
| 用途 | 重視指標 | 理由 |
|---|---|---|
| スクリーニング | Sensitivity重視 | 病気の見逃しを最小化 |
| 確定診断支援 | Specificity重視 | 不要な追加検査を削減 |
| バランス型 | AUC-ROC | 総合的な判別能力を評価 |
まとめ
| 項目 | ポイント |
|---|---|
| Sensitivity | 病気の検知率(見逃しの少なさ) |
| Specificity | 正常の正答率(偽陽性の少なさ) |
| 閾値最適化 | 用途に応じてSensitivity下限を設定 |
| AUC-ROC | 閾値に依存しない総合評価 |
チェックリスト
- SensitivityとSpecificityの違いを説明できる
- 混同行列から各指標を計算できる
- 用途に応じた閾値最適化ができる
- スクリーニングと確定診断の指標選択を判断できる
次のステップへ
Sensitivity/Specificity評価を学んだ。次はHuman-in-the-Loop設計を学ぼう。
推定読了時間: 30分