LESSON

Sensitivity/Specificity評価

「医療画像AIでは、AccuracyやF1だけでは不十分だ。」

田中VPoEが評価指標を説明する。

「Sensitivity(感度)は病気を正しく検知する能力、Specificity(特異度)は正常を正しく判定する能力。この2つのバランスが、画像診断AIの品質を決める。」

指標の定義

指標定義意味
Sensitivity (Recall)TP / (TP + FN)病気の人を正しく検知する割合
SpecificityTN / (TN + FP)正常の人を正しく判定する割合
PPV (Precision)TP / (TP + FP)陽性と判定した中で本当に病気の割合
NPVTN / (TN + FN)陰性と判定した中で本当に正常の割合
AUC-ROCROC曲線下面積総合的な判別能力

計算の実装

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分