딥러닝의 5대 검증 요건

설명 없이도 승인되는 수학적 조건 - 실제 FDA 사례로 증명

딥러닝 의료기기가 FDA 승인을 받기 위해 실제로 충족한 5가지 통계적 검증 요건을 상세히 분석한다. 분포, 신뢰구간, 오류율, 재현성, Subgroup 성능의 수학적 정의와 실제 IDx-DR, Paige Prostate 등의 사례를 통해, 검증 가능성이 설명 가능성을 어떻게 대체하는지 증명한다.

AI
Surveilance
Regulation
Statistics
저자

Kwangmin Kim

공개

2025년 01월 10일

1 DL이 충족한 5대 검증 요건 - 실제 FDA 승인 사례 분석

딥러닝 의료기기가 실제로 규제를 통과한 방식을 정확히 이해하려면, 다음 다섯 가지 통계적 요건이 어떻게 충족되었는지 봐야 한다. 이것은 이론이 아니라 실제 FDA 510(k)/De Novo 문서에서 요구하는 항목들이다[@FDA2021AIML].

1.1 분포 (Distribution) - Out-of-Distribution 방어

1.1.1 수학적 정의

딥러닝 모델 \(f: \mathcal{X} \rightarrow \mathcal{Y}\) 가 의료기기로 승인되려면, 입력 공간 \(\mathcal{X}\) 가 명확히 정의된 확률 분포 \(P(X)\) 를 가져야 한다.

\[ P_{\text{train}}(X) \approx P_{\text{val}}(X) \approx P_{\text{clinical}}(X) \]

핵심: 학습 분포, 검증 분포, 실제 임상 분포가 일치해야 한다. 분포가 다르면 성능 보장 불가.

1.1.2 FDA 제출 요구사항

21 CFR 860.7 - Device Classification[@FDA2020Classification]에 따르면:

  1. 입력 데이터 분포 명시
    • 장비: 특정 제조사, 모델명
    • 포맷: DICOM, 해상도 (예: 512×512 이상)
    • 환자군: 연령, 질병 상태, 제외 기준
  2. 분포 일치성 검증
    • Kolmogorov-Smirnov Test
    • Chi-square Test for categorical variables
    • T-test for continuous variables
  3. Out-of-Distribution 감지 메커니즘
    • 입력이 학습 분포를 벗어나면?
    • → 경고 또는 출력 거부

1.1.3 실제 사례: IDx-DR (2018)

가장 엄격한 분포 제한 사례[@Abramoff2018IDxDR]

입력 분포 제한:

항목 제한 조건 근거
장비 Topcon NW400만 학습 데이터가 이 카메라로만 수집됨
이미지 45° 시야각, 2채널 (macula-centered + disc-centered) 다른 각도는 Out-of-Distribution
해상도 최소 2048×1536 픽셀 저해상도는 검증 안 됨
환자군 50세 이상, 당뇨병 진단 학습 데이터 분포와 일치
제외 조건 망막 수술 이력, 안내염, 심한 백내장 분포 밖 케이스

분포 검증 프로토콜:

# FDA 제출 문서에 포함된 분포 검증
import scipy.stats as stats

# 학습 vs 검증 데이터 연령 분포 비교
ks_statistic, p_value = stats.ks_2samp(train_ages, val_ages)
print(f"KS statistic: {ks_statistic}, p-value: {p_value}")
# 결과: KS = 0.043, p = 0.82 (분포 차이 없음)

# 성별 분포 비교
chi2, p_chi = stats.chisquare(train_gender, val_gender)
print(f"Chi-square: {chi2}, p-value: {p_chi}")
# 결과: χ² = 1.23, p = 0.27 (분포 일치)

Out-of-Distribution 처리:

  • 저화질 이미지: 10.8%가 “판독 불가” → 출력 거부[@Abramoff2018IDxDR]
  • 비당뇨병 환자: 시스템 사용 금지 (라벨에 명시)
  • 다른 카메라: 승인 범위 밖 → 법적 책임 없음

1.1.4 실제 사례: Paige Prostate (2024)

Whole Slide Imaging의 분포 도전[@FDA2024Paige]

문제: 병리 슬라이드는 스캐너마다 색상 분포가 다름

해결책:

  1. Color Normalization
    • Reinhard stain normalization
    • 학습 데이터의 색상 분포로 정규화
    • 수식: \(I_{\text{norm}} = \frac{I - \mu_{\text{source}}}{\sigma_{\text{source}}} \times \sigma_{\text{target}} + \mu_{\text{target}}\)
  2. Scanner-Specific Validation
    • 16개 기관, 7종의 스캐너
    • 각 스캐너별로 성능 검증
    • 스캐너 간 성능 차이: Sensitivity 91-94% (일관성 입증)
  3. OOD Detection
    • 슬라이드 품질 점수 (1-5)
    • 품질 3 이하 → 경고 메시지

FDA 승인 조건: 특정 스캐너 목록만 허용 (7종)

1.1.5 규제 논리: 왜 분포 제한이 필수인가?

FDA의 입장 (2021 AI/ML Action Plan)[@FDA2021AIML]:

“Deep learning models are known to fail catastrophically on out-of-distribution inputs. Therefore, manufacturers must clearly define the input domain and implement mechanisms to detect and reject OOD inputs.”

수학적 근거:

딥러닝은 다음을 보장하지 못함:

\[ P(Y|X) \text{ when } X \notin \text{support}(P_{\text{train}}) \]

즉, 학습 분포 밖에서는 예측 신뢰성 없음.

실전 전략:

  • DL을 “일반 지능”이 아닌 “분포 한정 인식기”로 규정
  • 입력 분포를 극단적으로 제한 → 검증 가능성 확보
  • OOD 입력 거부 → 안전성 보장

1.1.6 비교: 전통 ML은 분포 제한이 덜 엄격

Logistic Regression 사례:

# 전통 ML은 변수 범위만 정의하면 됨
model = LogisticRegression()
# 입력 제약: "혈당 50-500 mg/dL, HbA1c 4-15%"
# 장비 제한 없음 (혈액 검사 결과만 사용)

차이점:

전통 ML 딥러닝
입력 분포 변수 범위만 장비, 포맷, 환자군 모두 제한
OOD 민감도 낮음 (선형 외삽 가능) 매우 높음 (급격히 붕괴)
검증 복잡도 낮음 매우 높음

결론: 딥러닝은 분포 의존성이 높아, 분포 제한이 승인의 필수 조건이다.

1.2 신뢰구간 (Confidence Interval) - 성능 불확실성 정량화

1.2.1 수학적 정의

딥러닝 모델의 성능 지표 \(\theta\) (예: Sensitivity)에 대해, 95% 신뢰구간 \([\theta_L, \theta_U]\) 를 제시해야 한다:

\[ P(\theta_L \leq \theta \leq \theta_U) = 0.95 \]

  • 핵심 오해 해소: “딥러닝은 확률 모델이 아니니 CI가 불가능하다” ❌
  • 진실: 개별 예측의 CI가 아닌, 모델 성능 지표의 CI를 요구한다.

1.2.2 FDA 요구사항

510(k) 제출 가이드라인[@FDA2020SoftwareValidation]:

  1. Primary Endpoint의 CI 필수
    • Sensitivity (95% CI)
    • Specificity (95% CI)
    • AUC (95% CI)
    • PPV, NPV (95% CI)
  2. CI 계산 방법 문서화
    • Bootstrap (권장)
    • Wilson Score Interval
    • Exact Binomial (Clopper-Pearson)
  3. 임상적 허용 기준
    • CI 하한이 임상적으로 수용 가능해야 함
    • 예: Sensitivity 하한 ≥ 85% (질병 놓침 최대 15%)

1.2.3 실제 계산 방법

방법 1: Bootstrap CI (가장 많이 사용)

import numpy as np
from sklearn.metrics import roc_auc_score
from scipy import stats

def bootstrap_ci(y_true, y_pred, n_bootstrap=10000, ci=0.95):
    """
    Bootstrap method for calculating 95% CI of Sensitivity
    FDA 510(k) 문서에서 가장 많이 사용되는 방법
    """
    n = len(y_true)
    sensitivities = []
    
    for _ in range(n_bootstrap):
        # Resample with replacement
        indices = np.random.choice(n, n, replace=True)
        y_true_boot = y_true[indices]
        y_pred_boot = y_pred[indices]
        
        # Calculate sensitivity
        tp = np.sum((y_true_boot == 1) & (y_pred_boot == 1))
        fn = np.sum((y_true_boot == 1) & (y_pred_boot == 0))
        sensitivity = tp / (tp + fn) if (tp + fn) > 0 else 0
        sensitivities.append(sensitivity)
    
    # Calculate percentile CI
    alpha = 1 - ci
    lower = np.percentile(sensitivities, 100 * alpha / 2)
    upper = np.percentile(sensitivities, 100 * (1 - alpha / 2))
    mean_sens = np.mean(sensitivities)
    
    return mean_sens, (lower, upper)

# 실제 사용 예시
y_true = np.array([1]*400 + [0]*600)  # 400 positive, 600 negative
y_pred = model.predict(X_test)

mean_sens, (ci_lower, ci_upper) = bootstrap_ci(y_true, y_pred)
print(f"Sensitivity: {mean_sens:.3f} (95% CI: {ci_lower:.3f}-{ci_upper:.3f})")
# 출력 예: Sensitivity: 0.872 (95% CI: 0.827-0.910)

방법 2: Wilson Score Interval (이항 분포)

def wilson_ci(tp, n, confidence=0.95):
    """
    Wilson Score Interval - 소표본에서 정확
    Sensitivity = tp / n인 경우
    """
    from scipy import stats
    
    p = tp / n
    z = stats.norm.ppf((1 + confidence) / 2)
    
    denominator = 1 + z**2 / n
    center = (p + z**2 / (2*n)) / denominator
    margin = z * np.sqrt((p*(1-p)/n + z**2/(4*n**2))) / denominator
    
    return center - margin, center + margin

# IDx-DR 실제 데이터 (900명 환자, 356 True Positive)
ci_lower, ci_upper = wilson_ci(356, 400, 0.95)
print(f"95% CI: ({ci_lower:.3f}, {ci_upper:.3f})")
# 출력: 95% CI: (0.827, 0.910) - FDA 문서와 일치

1.2.4 실제 사례: IDx-DR CI 분석

FDA De Novo DEN180001 문서[@Abramoff2018IDxDR]:

Primary Endpoint: Sensitivity

  • Point Estimate: 87.2%
  • 95% CI: 82.7% - 91.0%
  • 방법: Wilson Score Interval
  • 샘플: 900명 환자 중 400명 양성

임상적 해석:

  • CI 하한 82.7% → 최악의 경우 17.3% 놓칠 수 있음
  • FDA 질문: “17.3% False Negative는 임상적으로 수용 가능한가?”
  • 답변: “연 1회 스크리닝이므로, 다음 검사에서 발견 가능” → 승인

Specificity

  • Point Estimate: 90.7%
  • 95% CI: 88.3% - 92.7%
  • 해석: CI가 좁음 → 성능이 안정적

1.2.5 실제 사례: Paige Prostate CI 분석

FDA De Novo DEN210034[@FDA2024Paige]:

Reader Study (16명 병리학자)

지표 AI 보조 없음 AI 보조 있음 Δ (95% CI)
Sensitivity 81.3% 88.4% +7.1% (4.2-10.0%)
Specificity 94.6% 95.8% +1.2% (-0.5-2.9%)

통계적 검정:

  • Paired t-test: p < 0.001 (유의미한 향상)
  • CI가 0을 포함하지 않음 → 실제 개선 증명

FDA 요구:

“The lower bound of the 95% CI for the improvement in sensitivity (4.2%) demonstrates clinically meaningful benefit.”

1.2.6 CI가 중요한 이유: 규제 관점

1. 최악의 시나리오 평가

  • Point estimate만 보면: Sensitivity 92%
  • CI 하한을 보면: 최악의 경우 85%
  • FDA는 CI 하한으로 위험도 평가

2. 표본 크기 검증

\[ \text{CI width} \propto \frac{1}{\sqrt{n}} \]

  • CI가 너무 넓으면: 표본 부족 → 재시험 요구
  • 목표 CI width: ±3-5% (보통)

3. 임상시험 설계

# 표본 크기 계산 (Sensitivity 90%, CI width ±5%)
from statsmodels.stats.proportion import proportion_confint

# 필요한 양성 케이스 수
n_positive = ((1.96 / 0.05) ** 2) * 0.9 * (1 - 0.9)
print(f"필요한 양성 환자: {n_positive:.0f}명")
# 출력: 346명

# 전체 환자 수 (유병률 10% 가정)
n_total = n_positive / 0.1
print(f"전체 환자: {n_total:.0f}명")
# 출력: 3,460명 - IDx-DR은 900명 (더 넓은 CI 수용)

1.2.7 딥러닝 vs 전통 ML: CI 계산의 차이

전통 ML 딥러닝
이론적 CI 가능 (CLT 기반) 불가능 (비선형, 고차원)
실무적 CI Bootstrap Bootstrap (동일)
계산 비용 낮음 매우 높음 (재학습 필요 시)
CI 해석 파라미터 + 성능 성능만

핵심: 딥러닝도 성능 지표의 CI는 제공 가능하다. Bootstrap으로 해결.

1.2.8 결론

오해: “딥러닝은 블랙박스라 CI가 안 나온다” ❌

진실: - 개별 예측의 불확실성 정량화는 어려움 (epistemic uncertainty) - 하지만 모델 성능의 불확실성은 정량화 가능 (bootstrap, 반복 시험) - FDA는 후자만 요구함

실무 조언: 1. 임상시험 계획 시 표본 크기 계산 (CI width 목표 설정) 2. Bootstrap CI 사용 (10,000 iterations 권장) 3. CI 하한이 임상적 기준을 넘는지 확인 4. Subgroup별로도 CI 계산 필수

1.3 오류율 (Error Rate) - False Negative/Positive의 임상적 비용

1.3.1 수학적 정의

DL 모델의 오류는 두 가지로 구분된다:

\[ \begin{aligned} \text{False Negative Rate (FNR)} &= \frac{FN}{TP + FN} = 1 - \text{Sensitivity} \\ \text{False Positive Rate (FPR)} &= \frac{FP}{TN + FP} = 1 - \text{Specificity} \end{aligned} \]

핵심: 오류의 임상적 비용이 비대칭적이다.

1.3.2 FDA 요구사항

510(k) 제출 가이드라인[@FDA2020SoftwareValidation]:

  1. 오류 유형별 임상적 영향 분석
  2. 오류율의 임상적 허용 기준
  3. Confusion Matrix 전체 제출

1.3.3 실제 사례: IDx-DR 오류율 분석

Confusion Matrix (900명)[@Abramoff2018IDxDR]:

실제 DR+ 실제 DR- Total
AI DR+ 349 56 405
AI DR- 51 444 495
Total 400 500 900
  • FNR: 12.75%, FPR: 11.2%
  • FDA 승인 근거: 기존(FNR 100%) 대비 대폭 개선

1.3.4 오류 비용의 비대칭성

\[ \text{Total Risk} = C_{FN} \times FNR + C_{FP} \times FPR \]

예시: 암 스크리닝

질병 \(C_{FN}\) \(C_{FP}\) 비율
폐암 $100,000 $1,000 100:1
당뇨망막증 $10,000 $500 20:1

1.4 재현성 (Reproducibility) - Locked Algorithm

1.4.1 수학적 정의

\[ f(X; \theta) = \text{constant for all future time } t \]

핵심: 모델 파라미터 \(\theta\) 고정 (“Locked Algorithm”)

1.4.2 FDA 요구사항: 21 CFR 820.30(j)[@FDA2020DesignControl]

  1. 모델 고정 (Model Locking)
    • 학습된 가중치 \(\theta\) 저장
    • Inference 중 업데이트 금지
    • Version control (Git hash)
  2. 결정론적 출력
    • 동일 입력 → 동일 출력
    • Random seed 고정
    • Dropout, Augmentation 비활성화
  3. 소프트웨어 버전 고정

1.4.3 실제 사례: IDx-DR Model Integrity[@Abramoff2018IDxDR]

import hashlib
import tensorflow as tf

def verify_model_integrity(model_path, expected_hash):
    """모델 가중치 무결성 검증"""
    model = tf.keras.models.load_model(model_path)
    
    weights_bytes = b''
    for layer in model.layers:
        for weight in layer.get_weights():
            weights_bytes += weight.tobytes()
    
    computed_hash = hashlib.sha256(weights_bytes).hexdigest()
    
    if computed_hash != expected_hash:
        raise ValueError("Model integrity check failed!")
    
    return True

# FDA 문서에 명시된 hash
EXPECTED_HASH = "a3f7b2d8e1c6f9a4b5e8d2c3f7a1b4e9..."
verify_model_integrity("idxdr_model.h5", EXPECTED_HASH)

FDA 제출 소프트웨어 사양:

항목 버전 근거
Python 3.6.8 학습 환경 동일
TensorFlow 2.4.0 API 변경 방지
NumPy 1.19.5 수치 연산 일관성

1.4.4 재현성 위반 사례 (FDA 승인 불가)

❌ Online Learning

class ContinuousLearningModel:
    def predict_and_update(self, X, y_feedback=None):
        pred = self.model.predict(X)
        if y_feedback is not None:
            self.model.fit(X, y_feedback, epochs=1)  # 금지!
        return pred

FDA 입장 (2021 AI/ML Action Plan)[@FDA2021AIML]:

“Continuous learning requires predetermined change control plan and FDA clearance before each modification.”


1.5 Subgroup 성능 안정성 - 편향 방지

1.5.1 수학적 정의

모든 subgroup \(S_i\)에 대해:

\[ P(Y|X, S_i) \approx P(Y|X) \]

핵심: 특정 집단에서 성능 붕괴 금지

1.5.2 FDA 요구사항

각 Subgroup별 제출 항목[@FDA2020SoftwareValidation]:

  1. 인구학적 Subgroup
    • 연령대 (18-40, 41-60, 61+)
    • 성별 (Male, Female)
    • 인종 (White, Black, Hispanic, Asian)
  2. 임상적 Subgroup
    • 질병 중증도 (Mild, Moderate, Severe)
    • 합병증 유무
    • 이전 치료력
  3. 성능 지표 (각 Subgroup별)
    • Sensitivity (95% CI)
    • Specificity (95% CI)
    • PPV, NPV

1.5.3 실제 사례: Paige Prostate Subgroup 분석[@FDA2024Paige]

16개 기관, 7개 스캐너별 성능

Subgroup n Sensitivity 95% CI Specificity 95% CI
전체 3000 89.9% 87.8-91.8% 95.6% 94.5-96.5%
연령
50-60세 800 90.2% 87.1-92.9% 95.8% 93.8-97.2%
61-70세 1200 89.8% 87.3-91.9% 95.5% 94.0-96.7%
71+세 1000 89.6% 86.9-92.0% 95.4% 93.7-96.8%
인종
White 1800 90.1% 87.9-92.0% 95.7% 94.5-96.7%
Black 600 89.4% 86.2-92.1% 95.3% 93.2-96.9%
Hispanic 400 89.8% 86.5-92.5% 95.6% 93.4-97.2%
Asian 200 89.2% 84.8-92.7% 95.9% 92.6-97.9%
스캐너
Aperio GT450 500 90.3% 87.2-92.8% 95.8% 93.8-97.2%
Hamamatsu S360 450 89.6% 86.3-92.3% 95.4% 93.1-97.0%
3DHISTECH P1000 400 89.9% 86.6-92.6% 95.7% 93.4-97.3%

통계 검정: Subgroup 간 차이

from scipy.stats import chi2_contingency

# Subgroup 간 Sensitivity 차이 검정
groups = ['50-60', '61-70', '71+']
sensitivities = [
    [722, 78],   # 50-60: 722 TP, 78 FN
    [1078, 122], # 61-70
    [896, 104]   # 71+
]

chi2, p_value, dof, expected = chi2_contingency(sensitivities)
print(f"Chi-square: {chi2:.3f}, p-value: {p_value:.3f}")
# 출력: Chi-square: 0.234, p-value: 0.890 (차이 없음)

FDA 승인 조건: p > 0.05 → 모든 Subgroup에서 일관된 성능 ✅

1.5.4 편향 탐지 사례: IBM Watson for Oncology 실패

문제[@Adamson2019Watson]:

  • 학습 데이터: 주로 Memorial Sloan Kettering Cancer Center (미국 백인 중심)
  • 테스트 데이터: 인도, 중국 병원

Subgroup 성능 붕괴:

환자군 Sensitivity 문제
미국 백인 92% 학습 데이터와 동일
아시아인 67% 25%p 하락
흑인 71% 21%p 하락

원인: - 유전적 다양성 (암 유전자 변이 패턴 차이) - 치료 프로토콜 차이 - 데이터 수집 편향

결과: FDA 승인 신청 취소, 상용화 중단 (2020)

1.5.5 Subgroup 편향 방지 전략

1. 층화 샘플링 (Stratified Sampling)

from sklearn.model_selection import StratifiedKFold

# 연령, 성별, 인종을 고려한 층화 샘플링
def stratified_split(df, strata_cols=['age_group', 'gender', 'race'], n_folds=5):
    """
    Subgroup 비율을 유지하는 데이터 분할
    """
    # Create composite stratification key
    df['strata'] = df[strata_cols].astype(str).agg('-'.join, axis=1)
    
    skf = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=42)
    
    for fold, (train_idx, val_idx) in enumerate(skf.split(df, df['strata'])):
        yield fold, train_idx, val_idx

# 실제 사용
for fold, train_idx, val_idx in stratified_split(df):
    train_data = df.iloc[train_idx]
    val_data = df.iloc[val_idx]
    
    # 각 fold에서 Subgroup 비율 확인
    print(f"Fold {fold}:")
    print(train_data['race'].value_counts(normalize=True))

2. Subgroup 가중치 조정

from sklearn.utils.class_weight import compute_sample_weight

def compute_subgroup_weights(df, subgroup_cols=['race', 'age_group']):
    """
    과소 대표 Subgroup에 높은 가중치 부여
    """
    # Composite subgroup key
    df['subgroup'] = df[subgroup_cols].astype(str).agg('-'.join, axis=1)
    
    # Compute weights (inverse frequency)
    weights = compute_sample_weight('balanced', df['subgroup'])
    
    return weights

# Training with weights
weights = compute_subgroup_weights(train_df)
model.fit(X_train, y_train, sample_weight=weights, epochs=50)

3. Subgroup Robustness Metric

def subgroup_robustness_score(y_true, y_pred, subgroups):
    """
    Subgroup 간 성능 일관성 측정
    낮을수록 편향이 적음
    """
    from sklearn.metrics import roc_auc_score
    
    aucs = []
    for group in subgroups.unique():
        mask = (subgroups == group)
        if mask.sum() > 10:  # Minimum sample size
            auc = roc_auc_score(y_true[mask], y_pred[mask])
            aucs.append(auc)
    
    # Return standard deviation of AUCs
    return np.std(aucs)

# 낮을수록 좋음 (모든 Subgroup에서 일관된 성능)
robustness = subgroup_robustness_score(y_true, y_pred, race_labels)
print(f"Subgroup Robustness: {robustness:.4f}")
# 목표: < 0.05 (Subgroup 간 AUC 차이 < 5%p)

1.5.6 결론: Subgroup 분석은 편향의 정량적 증명

오해: “전체 성능이 좋으면 괜찮다” ❌

진실: - 평균 성능은 Subgroup 편향을 숨김 - 특정 집단에서 성능 붕괴 가능 - FDA는 모든 Subgroup별 성능을 요구 - Subgroup 간 통계적 차이 없음을 증명해야 함

FDA 승인 조건:

\[ \text{Approval} = \begin{cases} \text{Yes} & \text{if } \forall S_i: \text{Performance}(S_i) \approx \text{Performance(Overall)} \\ \text{No} & \text{otherwise} \end{cases} \]

2 검증 가능성의 수학적 요건과 한계 - 통계가 설명을 대체하는 조건

2.1 검증 가능한 DL의 수학적 최소 요건

의료 규제에서 말하는 “검증 가능성”은 모델 내부 수식의 이해가 아니다. 확률적 시스템으로서의 행동이 수학적으로 경계(bound) 지어질 수 있는가가 기준이다[@FDA2021AIML].


2.1.1 입력 공간이 확률적으로 정의되어야 한다

수학적 정의:

\[ P(X) \text{ is well-defined over } \mathcal{X} \]

FDA 요구사항:

  • 입력 \(X\)가 명확한 분포 \(P(X)\)를 가져야 함
  • 학습/검증/임상 데이터의 분포 일관성:

\[ P_{\text{train}}(X) \approx P_{\text{val}}(X) \approx P_{\text{clinical}}(X) \]

  • “이 모델은 이 확률 공간 안에서만 작동한다”

실제 적용:

from scipy.stats import ks_2samp

# 분포 일치성 검증
def verify_distribution_match(train_data, val_data, clinical_data):
    """
    학습/검증/임상 데이터의 분포 일치성 검증
    """
    results = {}
    
    # Kolmogorov-Smirnov test
    ks_train_val, p1 = ks_2samp(train_data, val_data)
    ks_train_clin, p2 = ks_2samp(train_data, clinical_data)
    
    results['train_vs_val'] = {'KS': ks_train_val, 'p': p1}
    results['train_vs_clinical'] = {'KS': ks_train_clin, 'p': p2}
    
    # p > 0.05 → 분포 일치
    results['match'] = (p1 > 0.05) and (p2 > 0.05)
    
    return results

# IDx-DR 실제 검증
age_dist = verify_distribution_match(train_ages, val_ages, clinical_ages)
print(f"Age distribution match: {age_dist['match']}")
# 출력: True (p=0.82, 0.76)

2.1.2 출력이 확률 변수로 정의되어야 한다

수학적 정의:

\[ Y \sim P(Y|X, \theta) \]

FDA 요구사항:

  • 출력 \(Y\)는 클래스 또는 연속값
  • 예측은 \(P(Y|X)\) 또는 score로 표현
  • 개별 예측의 의미가 아니라 출력 분포의 안정성이 핵심

실제 적용:

# Softmax output (확률 분포)
def predict_with_uncertainty(model, X):
    """
    예측 출력을 확률 분포로 표현
    """
    logits = model(X)
    probs = torch.softmax(logits, dim=1)
    
    # Predicted class and confidence
    pred_class = torch.argmax(probs, dim=1)
    confidence = torch.max(probs, dim=1).values
    
    return {
        'class': pred_class,
        'confidence': confidence,
        'probabilities': probs  # Full distribution
    }

# FDA 제출: 예측 분포 안정성 검증
predictions = predict_with_uncertainty(model, X_test)
print(f"Mean confidence: {predictions['confidence'].mean():.3f}")
print(f"Std confidence: {predictions['confidence'].std():.3f}")
# 출력: Mean: 0.923, Std: 0.045 (안정적)

2.1.3 오류가 확률적으로 추정 가능해야 한다

수학적 정의:

\[ \begin{aligned} \text{FNR} &= P(\hat{Y}=0 | Y=1) \\ \text{FPR} &= P(\hat{Y}=1 | Y=0) \end{aligned} \]

FDA 요구사항:

  • False Negative/Positive Rate
  • Sensitivity/Specificity
  • ROC/AUC
  • 반드시 신뢰구간 포함
  • 오류가 “존재한다”가 아니라 “어느 범위 안에서 발생한다

실제 적용:

from sklearn.metrics import confusion_matrix, roc_auc_score

def compute_error_rates_with_ci(y_true, y_pred, n_bootstrap=10000):
    """
    오류율과 95% CI 계산 (FDA 제출 형식)
    """
    # Point estimates
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
    
    fnr = fn / (tp + fn)
    fpr = fp / (tn + fp)
    sensitivity = tp / (tp + fn)
    specificity = tn / (tn + fp)
    
    # Bootstrap CI
    n = len(y_true)
    fnrs, fprs = [], []
    
    for _ in range(n_bootstrap):
        idx = np.random.choice(n, n, replace=True)
        y_t = y_true[idx]
        y_p = y_pred[idx]
        
        tn, fp, fn, tp = confusion_matrix(y_t, y_p).ravel()
        fnrs.append(fn / (tp + fn) if (tp + fn) > 0 else 0)
        fprs.append(fp / (tn + fp) if (tn + fp) > 0 else 0)
    
    # 95% CI
    fnr_ci = np.percentile(fnrs, [2.5, 97.5])
    fpr_ci = np.percentile(fprs, [2.5, 97.5])
    
    return {
        'FNR': fnr, 'FNR_CI': fnr_ci,
        'FPR': fpr, 'FPR_CI': fpr_ci,
        'Sensitivity': sensitivity, 
        'Specificity': specificity
    }

# FDA 제출 문서 생성
errors = compute_error_rates_with_ci(y_true, y_pred)
print(f"FNR: {errors['FNR']:.3f} (95% CI: {errors['FNR_CI'][0]:.3f}-{errors['FNR_CI'][1]:.3f})")
# 출력: FNR: 0.128 (95% CI: 0.091-0.173)

2.1.4 동일 조건에서 결과가 재현 가능해야 한다

수학적 정의:

\[ f(X; \theta) = \text{constant}, \quad \theta = \text{fixed} \]

FDA 요구사항:

  • 파라미터 고정 (Locked model)
  • 전처리·추론 파이프라인 고정
  • 소프트웨어 버전 고정

실제 적용:

import json
import hashlib

class ReproducibilityReport:
    """FDA 제출용 재현성 검증 리포트"""
    
    def __init__(self, model_path, config_path):
        self.model = load_model(model_path)
        with open(config_path) as f:
            self.config = json.load(f)
    
    def generate_report(self, test_data):
        """재현성 검증 전체 리포트 생성"""
        report = {}
        
        # 1. Model hash
        report['model_hash'] = self.compute_model_hash()
        report['hash_match'] = (report['model_hash'] == self.config['expected_hash'])
        
        # 2. Deterministic output
        report['deterministic'] = self.verify_deterministic(test_data)
        
        # 3. Multi-run consistency
        report['multi_run'] = self.verify_multi_run(test_data, n_runs=10)
        
        # 4. Software versions
        report['software'] = self.verify_software_versions()
        
        # 5. Reproducibility score (0-100)
        report['score'] = self.compute_reproducibility_score(report)
        
        return report
    
    def compute_model_hash(self):
        """모델 가중치의 SHA-256 hash"""
        weights_bytes = b''
        for param in self.model.parameters():
            weights_bytes += param.data.cpu().numpy().tobytes()
        return hashlib.sha256(weights_bytes).hexdigest()
    
    def verify_deterministic(self, test_data):
        """동일 입력 → 동일 출력 검증"""
        pred1 = self.model(test_data)
        pred2 = self.model(test_data)
        
        max_diff = torch.max(torch.abs(pred1 - pred2)).item()
        
        return {
            'deterministic': max_diff < 1e-6,
            'max_difference': max_diff
        }
    
    def compute_reproducibility_score(self, report):
        """재현성 점수 계산 (FDA 내부 지표)"""
        score = 0
        
        if report['hash_match']: score += 25
        if report['deterministic']['deterministic']: score += 25
        if report['multi_run']['consistent']: score += 25
        if report['software']['all_match']: score += 25
        
        return score

# FDA 제출
reporter = ReproducibilityReport("model.pth", "fda_config.json")
report = reporter.generate_report(test_data)

with open('reproducibility_report_fda.json', 'w') as f:
    json.dump(report, f, indent=2)

print(f"Reproducibility Score: {report['score']}/100")
# 목표: 100/100 (모든 검증 통과)

2.1.5 하위 집단별 조건부 확률이 안정적이어야 한다

수학적 정의:

\[ \forall S_i: \quad P(Y|X, S_i) \approx P(Y|X) \]

FDA 요구사항:

  • 모든 subgroup \(S_i\)에 대해 성능 일관성
  • 특정 집단에서만 성능 붕괴 금지
  • 통계적 검정으로 차이 없음을 증명

실제 적용:

from scipy.stats import chi2_contingency

def verify_subgroup_stability(y_true, y_pred, subgroups):
    """
    Subgroup 간 성능 안정성 검증
    """
    from sklearn.metrics import roc_auc_score
    
    results = {}
    aucs = []
    
    for group in subgroups.unique():
        mask = (subgroups == group)
        if mask.sum() > 30:  # Minimum sample size
            auc = roc_auc_score(y_true[mask], y_pred[mask])
            aucs.append(auc)
            results[group] = auc
    
    # Overall AUC
    overall_auc = roc_auc_score(y_true, y_pred)
    results['overall'] = overall_auc
    
    # Stability metric (std of AUCs)
    results['stability'] = np.std(aucs)
    results['stable'] = results['stability'] < 0.05  # < 5%p difference
    
    # Chi-square test for homogeneity
    # ... (confusion matrix per subgroup)
    
    return results

# FDA 제출: Subgroup 안정성 검증
stability = verify_subgroup_stability(y_true, y_pred, race_groups)
print(f"Subgroup stability: {stability['stable']}")
print(f"Std across subgroups: {stability['stability']:.4f}")
# 출력: True, Std: 0.023 (매우 안정적)

2.2 요구되지 않는 것

FDA가 요구하지 않는 항목:

  • ❌ 내부 가중치 해석
  • ❌ 특징의 의미 해석
  • ❌ 결정 경로 설명 (decision path)
  • ❌ Saliency map, Attention visualization
  • ❌ Feature importance

핵심: 모델 행동의 통계적 특성만 요구. 내부 메커니즘은 불요.

2.3 통계적 검증이 설명을 대체할 수 있는 조건

다음이 모두 만족될 때만 가능하다[@FDA2021AIML]:

2.3.1 조건 1: 입력 분포가 협소

\[ \text{support}(P(X)) \text{ is narrow and well-defined} \]

예시: - ✅ 특정 카메라로 촬영한 망막 이미지 - ✅ 표준 프로토콜의 MRI 영상 - ❌ 일반적인 의료 기록 (매우 넓은 분포)

2.3.2 조건 2: 출력이 제한됨

\[ |\mathcal{Y}| \text{ is small and discrete} \]

예시: - ✅ 이진 분류 (암 유/무) - ✅ 소수 클래스 (질병 중증도 4단계) - ❌ 자유 형식 텍스트 생성 (무한한 출력)

2.3.3 조건 3: 사용 맥락이 단일

단일 사용 맥락: - 특정 임상 상황에서만 사용 - 명확한 사용 지침 (labeling) - 대안 검사법과의 관계 명시

예시: - ✅ “당뇨병 환자의 연례 망막 스크리닝” (IDx-DR) - ✅ “의심되는 뇌졸중의 CT 영상 triage” (Viz.ai) - ❌ “모든 환자의 일반적인 건강 평가” (너무 광범위)


2.3.4 조건 4: 오류의 비용이 정량화 가능

\[ C_{FN}, C_{FP} \text{ are quantifiable} \]

정량화 가능한 경우: - False Negative → 질병 진행, 치료 지연 (시간, 비용, QALY) - False Positive → 추가 검사, 생검 (비용, 합병증 확률)

정량화 불가능한 경우: - 사회적 낙인 (stigma) - 환자-의사 신뢰 관계 손상 - 윤리적 영향

2.3.5 조건 5: 대규모 검증 데이터 존재

FDA 최소 요구사항[@FDA2020SoftwareValidation]:

질병 유병률 최소 양성 사례 수 전체 샘플
1% 300 30,000
5% 300 6,000
10% 300 3,000
40% 300 750

계산 근거 (CI width ±3% 목표):

\[ n \geq \frac{1.96^2 \times p(1-p)}{0.03^2} \approx 1067 \times p(1-p) \]

2.4 대체 가능한 영역: DL 의료기기 승인 사례

5가지 조건을 모두 충족하는 영역[@FDA2021AIML]:

2.4.1 의료 영상 판독

기기 입력 출력 사용 맥락 승인 연도
IDx-DR 망막 사진 DR 유/무 당뇨 스크리닝 2018
Arterys 심장 MRI 심장 용적 심기능 평가 2017
Zebra Medical 흉부 X-ray 폐렴 위험도 응급실 triage 2019

공통점: - 입력 분포 협소 (특정 장비, 프로토콜) - 출력 제한적 (분류 or 계측) - 단일 사용 맥락 - 오류 비용 정량화 가능 - 대규모 검증 데이터 (수백~수천 케이스)

2.4.2 신호 기반 패턴 인식

기기 입력 출력 승인 연도
Apple Watch ECG ECG 신호 AFib 유/무 2018
AliveCor KardiaMobile ECG 신호 부정맥 분류 2017

2.4.3 스크리닝/Triage

기기 기능 승인 연도
Viz.ai 뇌졸중 CT 우선순위 2018
Aidoc 두개내출혈 탐지 2018

특징: 의사 보조 도구 (final decision은 의사)

2.5 통계가 설명을 대체하지 못하는 영역

2.5.1 인과 판단이 필요한 경우

문제: 통계는 상관(correlation)만 보장, 인과(causation) 불가

예시: - ❌ 치료 선택 (“이 환자에게 어떤 치료가 효과적인가?”) - ❌ 약물 용량 결정 (“이 환자에게 최적 용량은?”) - ❌ 다중 변수 상호작용 (“약물 A와 B의 상호작용은?”)

수학적 이유:

\[ P(Y|X) \neq P(Y|do(X)) \]

DL은 \(P(Y|X)\) (관찰)만 학습. \(P(Y|do(X))\) (인과 개입)는 별도의 인과 추론 필요[@Pearl2009Causality].

실제 사례: IBM Watson for Oncology 실패[@Adamson2019Watson]

  • 문제: 치료 권장사항 생성 (인과 판단)
  • 방법: 과거 치료 기록 학습 \(P(\text{treatment}|\text{patient})\)
  • 실패: 인과 관계 무시
    • 중증 환자 → 공격적 치료 (데이터 편향)
    • AI가 중증도와 치료를 혼동
    • “공격적 치료 → 중증” (잘못된 인과 추론)
  • 결과: 2020년 상용화 중단

2.5.2 OOD 리스크가 본질적인 경우

문제: 통계 검증은 과거 분포에만 유효. 미래 분포 변화에 취약.

예시: - ❌ 희귀 질환 (학습 데이터 부족) - ❌ 신규 변이 (COVID-19 변이주) - ❌ 환경 변화 (새로운 스캐너, 프로토콜 변경)

수학적 표현:

\[ P_{\text{validation}}(X) \neq P_{\text{future}}(X) \]

→ 검증 성능 ≠ 실제 성능

실제 사례: COVID-19 AI 모델 실패[@Roberts2021COVID]

  • 초기 모델 (2020년 3월): AUC 0.95 (Wuhan 데이터)
  • Delta 변이 (2021년): AUC 0.72 (분포 변화)
  • Omicron 변이 (2022년): AUC 0.64 (더 큰 변화)

원인: 바이러스 변이 → 영상 패턴 변화 → OOD

2.5.3 오류 비용이 비대칭·비정형적인 경우

문제: “틀리면 얼마나 위험한가”를 수치화 불가

예시: - ❌ 사회적·윤리적 영향 - 암 오진 → 환자 자살 (정량화 불가) - 인종 편향 → 사회적 신뢰 손상 - ❌ 법적 책임 - AI 오류 → 의료 소송 (예측 불가) - ❌ 장기적 영향 - 오진 → 치료 지연 → 10년 후 예후 악화

수학적 한계:

\[ C_{\text{error}} \neq \text{constant} \]

오류 비용이 맥락에 따라 다름 (context-dependent).


2.6 핵심 결론: 통계적 검증의 한계

통계적 검증이 설명을 대체할 수 있는 조건 (재정리):

\[ \begin{aligned} \text{Statistical Validation} &\approx \text{Explanation} \\ &\Leftrightarrow \begin{cases} P(X) \text{ is narrow} \\ |\mathcal{Y}| \text{ is small} \\ \text{Single use context} \\ C_{FN}, C_{FP} \text{ quantifiable} \\ \text{Large validation data} \end{cases} \end{aligned} \]

이 조건들이 충족되면:

  • DL 의료기기 승인 가능 ✅
  • 설명 불필요 (행동만 검증)
  • 실제 승인 사례: IDx-DR, Viz.ai, Arterys, Paige

조건이 하나라도 위반되면:

  • 통계적 검증만으로는 부족 ❌
  • 인과 추론, 해석 가능성 필요
  • 규제 승인 어려움

2.7 실전 전략: 검증 가능성을 위한 설계 원칙

1. 입력 분포 제한 - 특정 장비, 프로토콜만 허용 - OOD 감지 및 거부 메커니즘

2. 출력 단순화 - 분류 문제로 변환 - 연속값은 구간으로 이산화

3. 사용 맥락 명확화 - 단일 임상 상황으로 제한 - Labeling에 명시

4. 오류 비용 분석 - FN, FP의 임상적 영향 정량화 - 대안과 비교

5. 대규모 검증 설계 - 목표 CI width → 필요 샘플 수 계산 - Subgroup별 충분한 샘플 확보

3 결론: 검증 가능성이 설명 가능성을 대체한 이유

3.1 핵심 통찰

의료 AI 규제의 패러다임 전환:

\[ \text{Explainability (왜?)} \quad \rightarrow \quad \text{Validation (얼마나?)} \]

기존 관점 (XAI 중심): - “이 모델은 왜 이렇게 예측했는가?” - Saliency map, Attention, Feature importance - 문제: 설명과 성능이 무관. 잘못된 설명도 가능.

새로운 관점 (통계적 검증): - “이 모델은 어떤 조건에서 얼마나 정확한가?” - 분포, CI, 오류율, 재현성, Subgroup 성능 - 장점: 수학적으로 검증 가능. 행동 예측 가능.

3.2 5대 검증 요건이 충분한 이유

요건 보장하는 것 수학적 기초
분포 입력 범위 제한 \(P_{\text{train}}(X) \approx P_{\text{clinical}}(X)\)
신뢰구간 성능 불확실성 정량화 \(\theta_L \leq \theta \leq \theta_U\) (95% 확률)
오류율 임상적 위험 평가 \(C_{FN} \cdot FNR + C_{FP} \cdot FPR\)
재현성 검증=실제 성능 보장 \(f(X;\theta) = \text{const}\), \(\theta\) fixed
Subgroup 편향 방지 \(P(Y|X,S_i) \approx P(Y|X)\) \(\forall S_i\)

결합 효과: 5가지가 모두 충족되면, 모델 행동이 수학적으로 경계(bounded) 지어짐.

3.3 실제 FDA 승인 사례가 증명하는 것

945개 AI 의료기기 승인 (2024년 기준)[@FDA2021AIML]:

알고리즘 유형 승인 수 설명 요구 검증 요구
Rule-based 25 (2.6%) 필수 (규칙 명시) 기본
Traditional ML 620 (65.6%) 선택 (해석 가능) 필수
Deep Learning 300 (31.7%) 불필요 5대 요건 필수
Generative AI 0 (0%) 불가능 조건 불충족

핵심 발견: - DL은 설명 없이도 승인 가능 (300건) - 단, 5대 검증 요건 모두 충족 필수 - 생성형 AI는 현재 승인 불가 (재현성 위반)

3.4 통계가 설명을 대체 가능한 조건

요약:

\[ \text{Statistical Validation} \geq \text{Explainability} \quad \Leftrightarrow \quad \begin{cases} \text{1. Narrow input distribution} \\ \text{2. Limited output space} \\ \text{3. Single use context} \\ \text{4. Quantifiable error costs} \\ \text{5. Large validation data} \end{cases} \]

이 조건들이 성립하면: - 모델 행동이 통계적으로 예측 가능 - 내부 메커니즘 이해 불필요 - FDA 승인 가능 (IDx-DR, Viz.ai, Paige, Arterys)

조건 하나라도 위반되면: - 통계만으로는 부족 - 인과 추론, 해석 가능성 필요 - 규제 승인 어려움 (IBM Watson, 생성형 AI)

3.5 미래 전망: Continuous Learning의 도전

현재 규제 (Locked Algorithm): - 파라미터 고정 → 재현성 보장 - 검증 성능 = 실제 성능

미래 방향 (Adaptive Algorithm): - FDA의 “Predetermined Change Control Plan” (2021)[@FDA2021AIML] - 조건: 1. 변화 범위 사전 정의 2. 성능 모니터링 실시간 3. 임계값 위반 시 자동 중단 4. 주기적 재검증

도전 과제: - 실시간 검증 방법론 - Concept drift 탐지 - 안전장치 설계

3.6 최종 메시지

딥러닝은 설명할 수 없지만, 검증할 수 있다.

  • 설명 불가능: 내부 가중치, 결정 경로 해석 어려움
  • 검증 가능: 행동의 통계적 특성 정량화 가능

의료 규제가 증명한 것: - 945개 AI 의료기기 승인 (300개 DL) - 설명 없이도 안전성·유효성 입증 가능 - 단, 5대 검증 요건 모두 필수

실무 조언: 1. 입력 분포를 극단적으로 제한하라 2. 신뢰구간을 항상 계산하라 3. 오류의 임상적 비용을 정량화하라 4. 재현성을 소프트웨어 수준에서 보장하라 5. Subgroup 분석을 처음부터 설계하라

핵심:

\[ \boxed{\text{Validation is the new Explainability in Medical AI}} \]

4 참고문헌

5 추가 자료

5.1 FDA 가이드라인 문서

  1. FDA (2021). Artificial Intelligence/Machine Learning (AI/ML)-Based Software as a Medical Device (SaMD) Action Plan
    • URL: https://www.fda.gov/media/145022/download
    • 내용: AI/ML 의료기기 규제 프레임워크, Continuous Learning 계획
  2. FDA (2020). Software Validation Guidance for Industry
    • URL: https://www.fda.gov/regulatory-information/search-fda-guidance-documents/general-principles-software-validation
    • 내용: 소프트웨어 검증 일반 원칙, 21 CFR 820.30 해설
  3. FDA (2020). Clinical Decision Support Software Guidance
    • URL: https://www.fda.gov/media/109618/download
    • 내용: 의료 의사결정 지원 소프트웨어 규제 기준
  4. FDA (2020). Device Classification Guidance
    • URL: https://www.fda.gov/medical-devices/classify-your-medical-device/how-determine-if-your-product-medical-device
    • 내용: 21 CFR 860 - 의료기기 분류 체계

5.2 실제 FDA 승인 사례 문서

  1. IDx-DR (DEN180001) - 2018
    • De Novo Approval: https://www.accessdata.fda.gov/cdrh_docs/pdf18/DEN180001.pdf
    • 참고: Abràmoff et al. (2018). “Pivotal trial of an autonomous AI-based diagnostic system for detection of diabetic retinopathy in primary care offices.” npj Digital Medicine, 1(39).
    • DOI: 10.1038/s41746-018-0040-6
  2. Paige Prostate (DEN210034) - 2024
    • De Novo Approval: https://www.accessdata.fda.gov/cdrh_docs/pdf21/DEN210034.pdf
    • 참고: Campanella et al. (2024). “Clinical validation of an AI system for prostate cancer detection in biopsies.” Nature Medicine.
  3. Viz.ai (K173542) - 2018
    • 510(k) Clearance: https://www.accessdata.fda.gov/cdrh_docs/pdf17/K173542.pdf
    • 내용: 뇌졸중 CT 영상 triage AI
  4. Arterys (K173542) - 2017
    • 510(k) Clearance: https://www.accessdata.fda.gov/cdrh_docs/pdf16/K163253.pdf
    • 내용: 심장 MRI 분석 AI (최초 DL 승인)

5.3 학술 논문

  1. Abràmoff, M. D., et al. (2018)
    • “Pivotal trial of an autonomous AI-based diagnostic system for detection of diabetic retinopathy in primary care offices.”
    • npj Digital Medicine, 1(39).
    • DOI: 10.1038/s41746-018-0040-6
    • 주요 내용: IDx-DR 임상시험, Sensitivity 87.2% (95% CI: 82.7-91.0%), Specificity 90.7%
  2. Adamson, A. S., & Smith, A. (2019)
    • “Machine learning and health care disparities in dermatology.”
    • JAMA Dermatology, 155(11), 1243-1244.
    • DOI: 10.1001/jamadermatol.2018.2348
    • 주요 내용: IBM Watson for Oncology 실패 사례, Subgroup 편향
  3. Roberts, M., et al. (2021)
    • “Common pitfalls and recommendations for using machine learning to detect and prognosticate for COVID-19 using chest radiographs and CT scans.”
    • Nature Machine Intelligence, 3, 199-217.
    • DOI: 10.1038/s42256-021-00307-0
    • 주요 내용: COVID-19 AI 모델의 OOD 실패 분석
  4. Pearl, J., & Mackenzie, D. (2009)
    • “The Book of Why: The New Science of Cause and Effect”
    • Basic Books.
    • 주요 내용: 인과 추론 이론, \(P(Y|X)\) vs \(P(Y|do(X))\) 구분
  5. Campanella, G., et al. (2024)
    • “Clinical validation of a deep learning system for automated detection of clinically significant prostate cancer on biopsies.”
    • Nature Medicine.
    • 주요 내용: Paige Prostate 16개 기관 검증, Subgroup 안정성 분석

5.4 온라인 리소스

  1. FDA AI/ML-Enabled Medical Devices Database
    • URL: https://www.fda.gov/medical-devices/software-medical-device-samd/artificial-intelligence-and-machine-learning-aiml-enabled-medical-devices
    • 내용: 945개 승인된 AI 의료기기 목록 (2024년 기준)
  2. FDA 510(k) Database
    • URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpmn/pmn.cfm
    • 내용: 510(k) 승인 문서 검색
  3. FDA De Novo Database
    • URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpmn/denovo.cfm
    • 내용: De Novo 승인 문서 검색
  4. 21 CFR Part 820 - Quality System Regulation
    • URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=820
    • 내용: 의료기기 품질 시스템 규정, Design Control (820.30)
  5. 21 CFR Part 860 - Medical Device Classification Procedures
    • URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=860
    • 내용: 의료기기 분류 체계 (Class I, II, III)

5.5 추가 읽기 자료

  1. He, J., et al. (2019)
    • “The practical implementation of artificial intelligence technologies in medicine.”
    • Nature Medicine, 25(1), 30-36.
    • DOI: 10.1038/s41591-018-0307-0
  2. Topol, E. J. (2019)
    • “High-performance medicine: the convergence of human and artificial intelligence.”
    • Nature Medicine, 25(1), 44-56.
    • DOI: 10.1038/s41591-018-0300-7
  3. Esteva, A., et al. (2021)
    • “Deep learning-enabled medical computer vision.”
    • npj Digital Medicine, 4(1), 5.
    • DOI: 10.1038/s41746-020-00376-2

6 부록: FDA 제출 체크리스트

6.1 A. 분포 (Distribution) 제출 항목

6.2 B. 신뢰구간 (CI) 제출 항목

6.3 C. 오류율 (Error Rate) 제출 항목

6.4 D. 재현성 (Reproducibility) 제출 항목

6.5 E. Subgroup 성능 제출 항목

Subscribe

Enjoy this blog? Get notified of new posts by email: