콘텐츠로 이동

확률 보정 (Calibration)

난이도: 중급
선수 지식: ROC와 AUC, 확률의 기본 개념
관련 문서: ROC와 AUC | 베이지안 ML | 손실 함수

핵심 요약: 모델이 “70% 확률로 양성”이라고 했으면, 실제로 그런 예측을 받은 사람 중 70%가 양성이어야 보정(Calibration)된 모델이다. 일기예보에서 “비 올 확률 70%“라고 한 날들을 모아봤을 때 실제로 70%의 날에 비가 오면 잘 보정된 예보다. AUC가 높아도 보정이 나쁠 수 있으므로, 확률값을 직접 의사결정에 쓸 때는 반드시 보정을 확인해야 한다.

  • 보정(Calibration): 모델이 “80% 확신”이라고 말한 것들 중 실제로 약 80%가 맞아떨어지는가. 확률을 액면가로 믿어도 되는가의 문제다.
  • 판별력(Discrimination): 양성과 음성의 순위를 잘 가르는 능력. AUC로 잰다. 보정과는 별개다 — 순위는 완벽한데 확률값은 엉망일 수 있다.
  • 신뢰도 다이어그램(Reliability Diagram): 예측 확률을 구간으로 묶어, 각 구간의 실제 정답률을 점으로 찍은 그래프. 대각선에 붙을수록 잘 보정된 것이다.
  • Brier Score: 예측 확률과 실제 정답(0/1)의 제곱 오차 평균. 낮을수록 좋다.
  • 온도 스케일링(Temperature Scaling): softmax 직전 값을 상수 TT로 나눠 확신의 세기만 조절하는 방법. 순위를 바꾸지 않아 정확도와 AUC가 그대로다.

분류 모델이 “70% 확률로 양성”이라고 예측했을 때, 실제로 그런 예측을 받은 샘플 중 70%가 양성이어야 한다. 이것이 보정(Calibration)이다.

모델의 판별력(Discrimination, 양성과 음성을 잘 분리하는 능력)은 — AUC로 측정한다. 보정은 예측 확률이 실제 확률과 일치하는 정도다. 이 둘은 독립적인 속성이다: AUC가 높아도 보정이 나쁠 수 있고, 보정이 좋아도 AUC가 낮을 수 있다.

예측 확률을 직접 의사결정에 사용하는 모든 시스템에서 보정은 필수적이다.

비유: 보정은 일기예보의 신뢰도 문제다. “내일 비 올 확률 70%“라고 한 날들을 모아봤더니 실제로 딱 70%쯤 비가 왔다면, 그 예보관은 잘 보정된 것이다. 그런데 어떤 예보관은 비 오는 날과 안 오는 날의 순서는 완벽하게 맞히면서도, 늘 “90%“라고 과장해서 말할 수 있다. 순위를 맞히는 능력(AUC)과 확률값을 믿을 수 있는가(보정)는 별개의 문제다.


보정(Calibration) 문제가 ML에서 본격적으로 주목받기 시작한 것은 1999년 John Platt의 연구에서였다. 당시 SVM(Support Vector Machine)은 최고 성능의 분류기였지만, 출력값이 마진(margin) 기반의 점수일 뿐 확률이 아니었다. Platt은 “이 SVM 점수를 의사결정에 쓰려면 확률로 변환해야 한다”는 실용적 동기에서, SVM 출력에 시그모이드 함수를 적합하여 확률을 추정하는 Platt Scaling을 제안했다. 이것이 사후 보정(post-hoc calibration)의 시초다.

이후 오랫동안 보정은 “있으면 좋지만 필수는 아닌” 부차적 관심사로 여겨졌다. 그러나 2017년, Guo et al.의 논문 “On Calibration of Modern Neural Networks”가 충격적인 발견을 보고했다: 현대 딥러닝 모델은 과거보다 정확도는 높아졌지만, 보정은 오히려 나빠졌다. 모델이 “95% 확신”이라고 예측하는 경우, 실제 정답률은 75%에 불과한 과신(overconfidence) 현상이 체계적으로 발생하고 있었다. 모델 용량 증가, 배치 정규화(Batch Normalization), 과도한 학습 등이 원인으로 지목되었다.

보정의 핵심을 이해하는 가장 좋은 비유는 일기예보다. “비 올 확률 70%“라고 예보한 날들을 모아보면, 그중 실제로 70%의 날에 비가 와야 한다. 만약 “70% 확률”이라고 한 날 중 실제로 비가 온 날이 40%뿐이라면, 그 예보 시스템은 과대확신(overconfident)이다. 좋은 일기예보관은 판별력(맑은 날과 비 오는 날을 구분하는 능력)뿐만 아니라 보정(확률 추정의 정확성)도 갖추어야 한다.


모델이 보정되었다(calibrated)는 것은:

P(Y=1p^=q)=qfor all q[0,1]P(Y = 1 \mid \hat{p} = q) = q \quad \text{for all } q \in [0, 1]

즉, 예측 확률 qq를 받은 모든 샘플에서 실제 양성 비율이 qq여야 한다.

핵심 구분:

  • 판별(Discrimination): 양성과 음성을 잘 구분하는가? → 순위(ranking)의 품질
  • 보정(Calibration): 예측 확률이 실제 확률과 일치하는가? → 확률의 품질

신뢰도 다이어그램 (Reliability Diagram)

섹션 제목: “신뢰도 다이어그램 (Reliability Diagram)”

보정 상태를 시각적으로 확인하는 도구다.

구성 방법:

  1. 예측 확률을 구간(bin)으로 나눈다 (예: [0, 0.1], [0.1, 0.2], …)
  2. 각 구간에서 평균 예측 확률과 실제 양성 비율을 계산
  3. (평균 예측 확률, 실제 양성 비율)을 플롯
  4. 완벽한 보정 = 대각선
실제 양성 비율
1.0 │ ╱ ← 완벽한 보정 (대각선)
│ ╱
│ ● ╱ ← 과소확신 (Underconfident)
│ ╱ ● 모델이 실제보다 낮게 예측
0.5 │ ╱
│ ╱
│ ╱
│ ╱ ● ← 과대확신 (Overconfident)
│ ╱ ● 모델이 실제보다 높게 예측
0.0 │╱───────────────────────
0.0 0.5 1.0
평균 예측 확률
  • 대각선 위: 과소확신(underconfident) — 모델이 실제보다 낮은 확률을 예측
  • 대각선 아래: 과대확신(overconfident) — 모델이 실제보다 높은 확률을 예측

BS=1ni=1n(p^iyi)2\text{BS} = \frac{1}{n}\sum_{i=1}^{n}(\hat{p}_i - y_i)^2

  • 범위: [0,1][0, 1], 낮을수록 좋음
  • 예측 확률과 실제 결과(0 또는 1) 사이의 MSE

4명의 환자에 대해 모델이 예측한 양성 확률과 실제 결과:

환자예측 확률 (p^\hat{p})실제 결과 (yy)오차2^2
A0.91 (양성)(0.91)2=0.01(0.9 - 1)^2 = 0.01
B0.70 (음성)(0.70)2=0.49(0.7 - 0)^2 = 0.49
C0.30 (음성)(0.30)2=0.09(0.3 - 0)^2 = 0.09
D0.81 (양성)(0.81)2=0.04(0.8 - 1)^2 = 0.04

Brier Score = (0.01 + 0.49 + 0.09 + 0.04) / 4 = 0.158

환자 B가 Brier Score를 크게 끌어올렸다. 모델이 70% 확률로 양성이라고 했지만 실제로는 음성이었기 때문이다 — 이것이 과대확신(overconfidence)의 구체적 예다.

Murphy 분해:

BS=Reliability보정 품질Resolution분리 능력+Uncertainty내재적 불확실성\text{BS} = \underbrace{\text{Reliability}}_{\text{보정 품질}} - \underbrace{\text{Resolution}}_{\text{분리 능력}} + \underbrace{\text{Uncertainty}}_{\text{내재적 불확실성}}

  • Reliability: 보정이 얼마나 좋은가 (작을수록 좋음)
  • Resolution: 예측이 클래스를 얼마나 잘 분리하는가 (클수록 좋음)
  • Uncertainty: 결과의 내재적 불확실성 (데이터 고유, 모델과 무관)

ECE=b=1Bnbnacc(b)conf(b)\text{ECE} = \sum_{b=1}^{B}\frac{n_b}{n}\left|\text{acc}(b) - \text{conf}(b)\right|

  • BB: bin 개수
  • nbn_b: bin bb의 샘플 수
  • acc(b)\text{acc}(b): bin bb의 실제 양성 비율
  • conf(b)\text{conf}(b): bin bb의 평균 예측 확률
  • bin별 보정 오차의 가중 평균

주의: ECE는 bin 개수와 binning 전략에 민감하다. 보고할 때는 bin 설정을 명시해야 한다.


MCE=maxbacc(b)conf(b)\text{MCE} = \max_b \left|\text{acc}(b) - \text{conf}(b)\right|

최악의 보정 오차. 안전이 중요한 응용(의료, 자율주행)에서 유용하다.


Log Loss=1ni=1n[yilog(p^i)+(1yi)log(1p^i)]\text{Log Loss} = -\frac{1}{n}\sum_{i=1}^{n}\left[y_i \log(\hat{p}_i) + (1 - y_i)\log(1 - \hat{p}_i)\right]

  • 엄밀히 적절한 점수 규칙(Strictly Proper Scoring Rule): 참 확률을 예측할 때만 최적화됨. 비유하자면, 이는 “거짓말 탐지기”와 같다 — 모델이 자신의 불확실성을 정직하게 보고할 때만 최적 점수를 받으며, 허세를 부리면(과신하면) 가혹한 벌점을 받는다.
  • 자신 있게 틀린 예측에 매우 큰 페널티p^0\hat{p} \to 0인데 y=1y = 1이면 Log Loss → \infty
  • 보정과 판별 모두를 반영

모델 출력 점수 ss에 로지스틱 회귀(Logistic Regression, S자 곡선 함수를 사용한 확률 변환)를 적합:

P(Y=1s)=11+exp(As+B)P(Y = 1 | s) = \frac{1}{1 + \exp(As + B)}

  • 파라미터 AA, BB별도의 보정 세트(held-out calibration set)에서 학습
  • 적합한 경우: 시그모이드 형태의 보정이 적절할 때 (SVM, 신경망 출력)
  • 보정 세트 크기: 비교적 적은 데이터에서도 잘 작동

비모수적 방법: 단조 증가(non-decreasing) 계단 함수를 보정 데이터에 적합.

  • Platt Scaling보다 유연함 — 비시그모이드형 보정 패턴도 처리
  • 과적합 위험: 보정 세트가 작으면 불안정
  • 경험 법칙: 보정 샘플 < 1000개 → Platt Scaling, > 1000개 → Isotonic Regression

신경망에 특화된 단일 파라미터 방법:

p^i=softmax(zi/T)\hat{p}_i = \text{softmax}(z_i / T)

  • T>1T > 1: 예측을 부드럽게(soften) → 과대확신 완화
  • T<1T < 1: 예측을 날카롭게(sharpen)
  • TT를 검증 세트의 NLL(Negative Log-Likelihood)을 최소화하여 결정
  • 장점: 매우 단순하고 효과적; 순위(ranking)를 변경하지 않으므로 AUC 불변

Histogram Binning (히스토그램 비닝)

섹션 제목: “Histogram Binning (히스토그램 비닝)”

비모수적: 각 bin에 보정된 확률을 직접 할당.

  • 매우 단순하지만 해상도가 낮다 (coarse)
  • bin 수가 적으면 정보 손실, 많으면 과적합

보정 방법 선택 가이드 다이어그램

모델 유형보정 경향설명
로지스틱 회귀좋음설계상 보정됨 (MLE가 Log Loss 최적화)
잘 튜닝된 베이지안 모델좋음사후 확률이 직접 보정된 확률
SVM나쁨출력이 확률이 아님 (마진 값) — Platt Scaling 필수
Random Forest보통~나쁨확률이 0.5 근처로 편향되는 경향
신경망나쁨 (과대확신)Guo et al. (2017): 현대 신경망은 과대확신 경향; Temperature Scaling 권장
Gradient Boosting보통적절히 보정되지만 완벽하지 않음

보정이 중요한 경우:

응용이유
의료 진단예측 확률이 직접 치료 결정에 영향
날씨 예보”비 올 확률 70%“가 실제 70%를 의미해야 사용자가 신뢰
자율주행불확실성 정량화가 안전 결정에 필수
보험/금융 리스크확률 기반 가격 책정
후속 의사결정에 확률이 입력될 때순위만 중요한 경우가 아닌 모든 파이프라인

보정이 덜 중요한 경우:

  • 순위만 중요할 때 (상위 k개 추천)
  • 이진 결정만 필요할 때 (양성/음성 분류)

대출 플랫폼의 과신(Overconfidence) 재앙

섹션 제목: “대출 플랫폼의 과신(Overconfidence) 재앙”

한 온라인 대출 플랫폼(P2P Lending)이 머신러닝 기반 신용 평가 모델을 도입했다. 모델은 대출 신청자의 상환 확률을 예측하고, 이 확률에 기반하여 금리를 책정하는 구조였다.

문제는 모델이 “상환 확률 85%“라고 예측한 대출 그룹에서 발생했다. 플랫폼은 이 85%라는 숫자를 신뢰하고, 해당 그룹에 낮은 금리를 적용했다. 그러나 6개월 후 실제 데이터를 집계하니, 이 그룹의 실제 상환율은 65%에 불과했다. 20%포인트의 보정 오차가 직접적인 재무 손실로 이어진 것이다.

원인을 분석한 결과, 모델은 Gradient Boosting 기반이었고, AUC는 0.82로 판별력은 양호했다. 즉, 상환할 사람과 부도낼 사람의 순위는 잘 구분했다. 그러나 출력 확률 자체가 과대확신되어 있었다. 신뢰도 다이어그램(Reliability Diagram)을 그려보니, 모든 확률 구간에서 예측 확률이 실제 비율보다 10-20%포인트 높게 편향되어 있었다.

수정 조치로 Isotonic Regression을 적용하여 보정한 후, 예측 확률과 실제 상환율의 격차가 2-3%포인트 이내로 줄었고, 금리 책정의 정확성이 회복되었다.

교훈: 예측 확률을 직접 비즈니스 의사결정(금리, 보험료, 치료 결정 등)에 사용하는 시스템에서는, AUC 같은 판별 지표만으로는 불충분하다. 반드시 신뢰도 다이어그램과 ECE를 확인하고, 필요시 보정을 수행해야 한다.


from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import brier_score_loss, roc_auc_score
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=4000, n_informative=6, random_state=0)
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=.5, random_state=0)
raw = RandomForestClassifier(n_estimators=50, random_state=0).fit(Xtr, ytr)
cal = CalibratedClassifierCV(RandomForestClassifier(n_estimators=50, random_state=0),
method="sigmoid", cv=5).fit(Xtr, ytr)
for name, m in [("보정 전", raw), ("보정 후(Platt)", cal)]:
p = m.predict_proba(Xte)[:, 1]
print(f"{name:14} Brier={brier_score_loss(yte, p):.4f} AUC={roc_auc_score(yte, p):.4f}")
# 실행 결과:
# 보정 전 Brier=0.0832 AUC=0.9582
# 보정 후(Platt) Brier=0.0782 AUC=0.9575

Brier(확률의 정확성)는 좋아졌는데 AUC(순위 능력)는 사실상 그대로다. Platt Scaling이 단조 변환이라 순위를 바꾸지 않는다는 것을 숫자로 확인할 수 있다.


  1. “AUC가 높으면 확률 예측도 좋다” — 아니다. AUC는 순위(ranking)만 평가한다. ROC-AUC가 높아도 보정이 매우 나쁠 수 있다.

  2. “보정을 하면 AUC도 함께 변한다” — Platt Scaling은 P=1/(1+exp(As+B))P = 1/(1+\exp(As+B)) 형태의 엄격 단조(strictly monotonic) 변환이라 점수의 순위가 그대로 보존되어 AUC가 변하지 않는다. Temperature Scaling도 마찬가지다. 순위를 바꿀 수 있는 것은 단조 비감소 계단함수인 Isotonic Regression뿐이며, 그것도 동점(tie)이 생기면서 AUC가 미세하게 달라지는 정도다.

  3. “모든 모델에 보정이 필요하다” — 순위만 필요한 작업(예: 검색 결과 정렬)에서는 보정 없이도 충분하다.

  4. “보정은 한 번 하면 영구적이다” — 데이터 분포가 변하면(concept drift) 보정도 다시 해야 한다.

  5. “ECE가 낮으면 보정이 완벽하다” — ECE는 bin 설정에 민감하다. 다른 binning으로 ECE가 달라질 수 있다. 신뢰도 다이어그램과 함께 확인하라.

  6. “로지스틱 회귀는 항상 잘 보정되어 있다” — 정규화가 강하거나, 특성이 누락되거나, 데이터 분포가 변하면 보정이 나빠질 수 있다.


1. AUC가 0.95인 모델의 확률 예측을 그대로 믿어도 되는가?

정답 보기

아니다. AUC는 순위만 평가한다. 모델이 모든 샘플에 0.9를 주면서도 순서만 맞히면 AUC는 높지만 확률값은 전혀 신뢰할 수 없다. 보정은 별도로 확인해야 한다.

2. Platt Scaling을 적용하면 AUC가 변하는가?

정답 보기

변하지 않는다. Platt Scaling은 엄격 단조 변환이라 점수의 순위를 그대로 보존한다. 순위를 바꿀 수 있는 것은 단조 비감소 계단함수인 Isotonic Regression뿐이다.

3. 보정이 특히 중요한 상황은?

정답 보기

확률값 자체가 의사결정에 직접 쓰일 때다. 기대 손실 계산, 임계값 기반 자동 승인, 의료 위험도 고지 등. 단순 순위 매기기(검색 결과 정렬)라면 보정 없이도 충분하다.