Conformal Prediction: 하나의 Calibration Quantile을 사용하여 어떤 모델이든 커버리지 보장 구간으로 변환하기
요약
Conformal Prediction을 사용하여 어떤 모델이든 수학적 커버리지를 보장하는 구간 예측으로 변환하는 방법을 설명합니다. 데이터 분포나 가우시안 가정 없이도 유한한 데이터만으로 목표 확률(1-α) 내에 실제 값이 포함됨을 보장할 수 있습니다.
핵심 포인트
- 모델의 예측값에 수학적 신뢰 구간을 부여하여 불확실성을 정량화함
- 데이터 분포나 모델의 정확도에 의존하지 않는 유효한 보장 제공
- Calibration 세트를 활용한 비적합도 점수(nonconformity score) 계산 방식
- 분위수(quantile) 계산을 통한 유한 표본 보장 메커니즘 설명
항상 "값은 3.2입니다"라고만 답하는 모델은 자신이 얼마나 확신하는지를 숨기고 있습니다. Conformal prediction은 어떠한 학습된 모델이라도 "값은 [2.4, 4.0] 사이에 있습니다"와 같은 구간(interval)으로 감싸줍니다. 이 구간은 진정한 수학적 약속을 동반합니다: 실제 값이 최소 90%의 확률(또는 95%, 혹은 당신이 요구하는 어떤 1−α 값이라도)로 구간 안에 들어온다는 약속입니다. 그리고 이 약속은 어떠한 데이터 분포에 대해서도, 유한한 데이터만으로, 가우시안 가정(Gaussian assumption) 없이, 모델이 맞을 것이라는 믿음 없이도 유효합니다. 그 방법은 당황스러울 정도로 간단하며, 저는 라이브러리 없이 처음부터 직접 분위수(quantile)를 계산하고 결과적인 커버리지(coverage)를 측정하는 데모를 구축했습니다. 그 전체 내용을 소개합니다.
분할(Split), 그 다음 각 포인트가 얼마나 이상한지 점수 매기기
분할(split, 유도적(inductive)) Conformal prediction에서의 "분할"이란, 모델이 학습에 전혀 사용하지 않은 calibration 세트를 데이터에서 떼어내는 것을 의미합니다. 훈련 부분으로 모델을 적합(fit)시키고, calibration 부분은 실제 오차가 얼마나 큰지 측정하는 데에만 사용되는 깨끗하고 교환 가능한(exchangeable) 샘플로 활용합니다. 그 다음 모든 calibration 포인트에 대해 **비적합도 점수 (nonconformity score)**를 계산합니다. 회귀(regression)의 경우, 자연스러운 선택은 절대 잔차(absolute residual)입니다:
yhat_cal = model.predict(X[cal])
scores = np.abs(y[cal] - yhat_cal) # 비적합도 = |y - yhat|
이러한 "전형적인 이상함(typical strangeness)"의 분포가 Conformal prediction에 필요한 전부입니다. (어떤 점수든 작동합니다 — |y−ŷ|, |y−ŷ|/σ(x), 분류(classification)를 위한 1 − softmax prob 등 — 메커니즘은 상관하지 않습니다.)
보장을 담보하는 단 하나의 분위수 (quantile)
여기에 모든 트릭이 있습니다. Calibration 점수들을 정렬하고 ⌈(n+1)(1−α)⌉번째로 작은 값을 취합니다:
def conformal_quantile(scores, alpha):
n = len(scores)
k = int(np.ceil((n + 1) * (1 - alpha))) # 마법의 순위(rank)
...
+1은 관찰되지 않은 테스트 포인트(unseen test point)를 위한 "유령(phantom)"이며, 일반적인 경험적 분위수(empirical quantile)를 유한 표본 보장(finite-sample guarantee)으로 업그레이드해 주는 요소입니다. 만약 순위(rank)가 n을 초과한다면, 솔직히 말해 해당 α에 대해 충분한 교정 데이터(calibration data)를 확보하지 못한 것이며, q는 +∞가 됩니다. 이는 무한하고 쓸모없지만 정직한 구간입니다. 이 경우 모든 예측에 패딩(pad)을 적용합니다. 즉, 구간은 [ŷ − q, ŷ + q]가 되며, 정리는 실제 y가 적어도 1 − α의 확률로 이 안에 들어온다고 명시합니다.
보장은 실재하며, 우연이 아닙니다
이 주장은 불신하기 쉬우므로, 데모를 통해 경험적으로 확인합니다. 홀드아웃 테스트 세트(held-out test set)에서 커버리지 비율(covered fraction)은 데이터의 형태와 상관없이 목표치와 일치하거나 그보다 약간 높아야 합니다:
covered = np.mean((y[te] >= lo) & (y[te] <= hi))
print(f
베이즈 신뢰 구간(Bayesian credible intervals)이나 단순한 가우시안 $\pm 1.96\sigma$와 비교했을 때, Conformal Prediction은 유한 표본(finite-sample)에서 커버리지 보장이 가능하고 분포에 의존하지 않는(distribution-free) 유일한 옵션입니다. 이 방법의 _유일한_ 가정은 교환성(exchangeability)이며, 정확한 사전 확률분포(prior)나 진정한 가우시안 오차를 요구하지 않습니다. 이는 어떤 모델에도 적용할 수 있는 순수한 래퍼(wrapper)이며, 하나의 보정 분할(calibration split)과 하나의 분위수(quantile) 비용만 발생합니다. 주요 주의점은 커버리지가 _주변적_ (population에 걸쳐 평균화된 것)이라는 점이며, 이는 개별 $x$ 값에 대한 것이 아닙니다. 이 점을 정확히 개선한 것이 정규화된/CQR 변형(normalized/CQR variants)입니다. 실제 환경에서는 `MAPIE`나 `crepes`를 사용하세요. 이들은 분할, 분위수, 교차 Conformal(cross-conformal) 처리를 처리하며, 분류의 경우 모호한 입력에 따라 자연스럽게 크기가 조정되는 커버리지 보장 _집합_의 레이블을 생성합니다. 예측이 실제 결정(예: 복용량, 가격, 위험 임계값)으로 이어지는 경우, Conformal은 '제 최선의 추측은 3.2입니다'라는 말을 '범위는 [2.4, 4.0]이며, 저는 90% 확신합니다'로 바꾸고 그 주장을 뒷받침하는 수학적 근거를 제공합니다.
슬라이더를 움직여 실제 데이터로부터 분위수, 구간(band), 그리고 커버리지가 다시 계산되는 것을 확인해 보세요:
[https://dev48v.infy.uk/ml/day45-conformal-prediction.html](https://dev48v.infy.uk/ml/day45-conformal-prediction.html)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기