2026년 7월 15일 | 개발 공부
Calibration slope와 intercept는 모델이 낸 확률과 실제 발생 빈도의 어긋남을 두 축으로 나누는 진단값이다. intercept는 예측이 전체적으로 높거나 낮은지 보고, slope는 낮은 확률과 높은 확률의 간격이 지나치게 벌어졌거나 눌렸는지 본다. 나는 reliability diagram에서 선이 휘어진 모습을 보고도 무엇부터 고쳐야 할지 애매할 때 이 두 값을 같이 확인한다.
예를 들어 같은 0.8이라는 score라도 새 데이터에서 실제 양성 비율이 0.6에 머물 수 있다. 이 현상이 모든 구간에서 비슷한 방향으로 나타나는지, 0.1과 0.9처럼 극단값에서만 심해지는지에 따라 원인이 다르다. 평균 calibration error 하나로 접으면 둘 다 “보정이 나쁨”으로 보이지만, 재보정 전략과 배포 경고는 달라져야 한다.
임계값을 골라도 확률 의미는 남는다
Youden's J나 F-beta로 threshold를 정하면 분류 행동은 만들 수 있다. 하지만 threshold 0.55가 좋았다는 사실은 score 0.55가 실제 사건 확률 55%라는 뜻이 아니다. 순위가 좋아 ROC-AUC가 높아도 확률값이 과감할 수 있고, threshold 결과가 괜찮아도 새 환경의 기본 발생률이 달라지면 자동 승인 건수가 크게 변할 수 있다.
여기서 calibration model은 예측 확률의 logit을 입력으로 놓고 실제 결과를 다시 설명한다. 형태를 간단히 쓰면 실제 log-odds = intercept + slope × 예측 log-odds다. 이상적인 값은 intercept 0, slope 1이다. 두 값은 모델의 분류 능력을 대신하지 않고, 이미 나온 score를 확률로 읽어도 되는지 진단하는 별도 층이다.
intercept는 전체 위험 수준의 이동을 본다
slope를 1로 고정해 보는 calibration-in-the-large에서 intercept가 음수라면 실제 발생률이 예측보다 전반적으로 낮다는 신호다. 모델이 평균적으로 위험을 높게 말한 셈이다. 반대로 양수라면 실제 발생률이 더 높아 모델이 위험을 낮게 잡았을 가능성이 있다.
그림의 왼쪽처럼 intercept가 -0.6이고 slope가 1이면 예측 0.2, 0.5, 0.8은 실제 빈도 약 0.12, 0.35, 0.69에 대응한다. 순서는 유지되지만 모든 구간이 아래로 이동한다. 학습 데이터와 배포 데이터의 prevalence가 달라졌거나 표본 추출 방식이 바뀐 경우에 이런 모양을 먼저 의심할 수 있다.
다만 intercept와 slope를 동시에 추정한 결과에서 intercept 하나만 떼어 평균 과대예측으로 단정하면 안 된다. 기울기가 1에서 멀어지면 절편의 의미도 함께 움직인다. 나는 평균 예측 확률, 실제 양성률, slope를 같은 줄에 남겨 전체 이동과 폭 변화를 분리한다.
slope는 확률이 너무 과감한지 본다
slope가 1보다 작으면 예측 확률이 대체로 너무 극단적이라는 뜻이다. 0에 가까운 값은 실제보다 지나치게 낮고, 1에 가까운 값은 실제보다 지나치게 높다. 그림 오른쪽의 slope 0.55에서는 예측 0.1과 0.9가 실제 약 0.23과 0.77로 모인다. 모델이 자신 있게 벌려 놓은 간격을 관측 데이터가 지지하지 못한 셈이다.
이 패턴은 작은 학습셋에서 복잡한 모델을 맞췄거나, feature 선택과 hyperparameter 탐색을 같은 validation data에 과하게 의존했을 때 나타날 수 있다. 새 데이터의 case mix가 좁아져도 slope가 내려갈 수 있으므로 “무조건 과적합”이라는 단일 원인으로 닫지는 않는다. 반대로 slope가 1보다 크면 예측이 실제보다 중앙에 몰려, 위험 차이를 충분히 벌리지 못했을 가능성을 본다.
0이나 1 확률은 logit이 무한대로 가기 때문에 구현할 때는 아주 작은 epsilon으로 잘라 계산한다. 이 clipping은 수치 안정화 장치이지 calibration을 개선하는 방법은 아니다. clipping 범위를 바꿔 점수가 좋아 보였다면 진단 입력 자체를 바꾼 것이므로 실험 로그에 반드시 남겨야 한다.
ECE와 reliability diagram 옆에서 역할이 선명해진다
Expected Calibration Error(ECE)는 confidence bin의 평균 예측과 실제 빈도 차이를 가중 평균으로 접는다. 비교표에는 편하지만 bin 수와 경계에 영향을 받고, 오차가 어느 방향으로 생겼는지 한 숫자만으로는 알기 어렵다. reliability diagram은 방향을 펼쳐 보여 주지만 표본이 적은 구간에서는 점이 크게 흔들린다.
intercept와 slope는 그 모양을 두 개의 파라미터로 압축한다. 그래서 세 도구는 대체 관계가 아니다. 나는 ECE로 평균 간격, diagram으로 구간별 모양, intercept와 slope로 전체 이동과 극단성을 본다. Brier score나 log loss는 예측 하나하나가 정답에서 얼마나 멀었는지 별도로 평가한다.
Youden's J 역시 역할이 다르다. J는 sensitivity와 specificity가 균형을 이루는 threshold 후보를 고르지만, score의 확률 의미를 보장하지 않는다. threshold를 다시 고르는 일과 probability recalibration을 같은 작업으로 묶으면, 분류 정책이 바뀐 효과와 확률 품질이 좋아진 효과를 구분하기 어려워진다.
실험 로그에는 값보다 추정 조건을 먼저 붙인다
| 진단 | 이상적 값 | 먼저 확인할 것 |
|---|---|---|
| intercept | 0 | 예측 평균과 실제 발생률의 전체 이동 |
| slope | 1 | 확률의 과도한 극단화 또는 중앙 집중 |
내 로그에는 dataset과 split, sample 수, positive support, 평균 예측 확률, 실제 양성률, intercept, slope, 신뢰구간을 함께 적는다. bootstrap을 썼다면 재표본 단위와 횟수도 남긴다. calibration model을 fit한 data와 최종 평가 data를 분리하지 않으면, 같은 표본을 설명하고 다시 칭찬하는 낙관적 결과가 된다.
재보정 전후 비교에서는 discrimination 지표도 유지한다. 보정이 좋아졌는데 ranking 성능이 그대로인지, 특정 slice의 recall이 나빠지지 않았는지 확인해야 한다. 특히 자동 차단이나 알림 예산처럼 threshold가 실제 행동으로 이어지는 시스템에서는 calibration 개선 뒤에도 예상 경보 건수와 false positive 비용을 다시 계산한다.
두 값의 장점은 확률 모델을 한마디로 “과신한다”라고 부르지 않게 해 주는 데 있다. 전체 위험 수준이 틀어진 것인지, 양끝의 확신 폭이 과장된 것인지가 갈리면 다음 실험도 작아진다. 나는 그래서 calibration 표를 볼 때 평균 점수 하나보다 0과 1에서 얼마나 멀어졌는지를 먼저 확인한다.
'[개발 공부]' 카테고리의 다른 글
| Brier score 분해: 같은 점수 안의 보정과 구분력 (1) | 2026.07.17 |
|---|---|
| Integrated Calibration Index: 보정 곡선의 평균 간격 (0) | 2026.07.16 |
| Youden's J: Sensitivity와 Specificity가 만나는 임계값 (1) | 2026.07.14 |
| F-beta score: Precision과 Recall의 무게를 바꾸는 지표 (0) | 2026.07.13 |
| G-mean: 한쪽 Recall이 무너지면 함께 내려가는 분류 점수 (0) | 2026.07.10 |