2026년 7월 22일 | 개발 공부
Tjur's D는 이진 분류 모델이 실제 양성 사례와 실제 음성 사례에 부여한 평균 예측 확률의 차이다. 정식 이름은 coefficient of discrimination이고, 식은 놀랄 만큼 짧다. 실제 양성 그룹의 평균 양성 확률에서 실제 음성 그룹의 평균 양성 확률을 빼면 된다. 나는 처음 봤을 때 로지스틱 회귀의 또 다른 복잡한 pseudo R-squared라고 생각했는데, 계산을 펼쳐 보니 오히려 평가표에서 가장 바로 읽히는 숫자에 가까웠다.
1. 계산은 두 평균의 차이
평가 데이터에 실제 양성 다섯 건과 음성 다섯 건이 있다고 해보자. 모델이 양성 사례에 낸 확률이 0.78, 0.66, 0.61, 0.72, 0.59라면 평균은 0.672다. 음성 사례에 0.18, 0.32, 0.27, 0.14, 0.21을 냈다면 평균은 0.224다. 둘을 빼면 D는 0.448이 된다.
D = mean(predicted_probability | y = 1)
- mean(predicted_probability | y = 0)
= 0.672 - 0.224
= 0.448
값은 0에서 1 사이에 놓인다. 모든 사례에 같은 확률을 주면 두 그룹 평균이 같아져 0이 되고, 양성에는 1, 음성에는 0을 정확히 주면 1이 된다. 이 숫자가 답하는 질문은 “모델이 두 실제 결과 그룹에 얼마나 다른 확률대를 배정했는가”다. 선형 회귀의 R-squared처럼 분산의 몇 퍼센트를 설명했다고 옮겨 읽는 숫자는 아니다.
2. AUC와 비슷해 보여도 질문이 다르다
ROC AUC도 양성과 음성을 얼마나 잘 가르는지 본다. 다만 AUC는 양성 하나와 음성 하나를 뽑았을 때 양성의 점수가 더 높을 확률에 가깝다. 순서가 유지되는 단조 변환을 적용하면 확률 숫자가 달라져도 AUC는 그대로일 수 있다. 반면 Tjur's D는 실제 확률 눈금의 평균 간격을 쓰므로 같은 순위라도 0.51과 0.49에 몰린 모델과 0.85와 0.15로 벌어진 모델을 다르게 읽는다.
그렇다고 D가 AUC보다 항상 낫다는 뜻은 아니다. 순위가 중요한 후보 검색이나 triage에서는 AUC가 더 직접적일 수 있고, 위험 확률을 그대로 사용자에게 보여 주는 시스템에서는 D의 확률 간격이 더 해석하기 쉽다. 나는 둘 중 하나를 지우기보다 AUC는 순서의 분리, Tjur's D는 확률 눈금에서의 평균 분리라고 열을 따로 둔다.
3. 임계값 성능과는 따로 읽는다
Tjur's D는 0.5 같은 분류 임계값을 정하지 않고 계산한다. 같은 확률 출력이라도 임계값을 0.3으로 내리면 sensitivity는 올라가고 specificity는 내려가지만, 두 실제 결과 그룹의 평균 예측 확률은 바뀌지 않으므로 D는 그대로다. 이 특성 덕분에 운영 임계값을 아직 정하지 않은 모델도 비교할 수 있고, 부서마다 임계값 정책이 다른 상황에서도 확률 출력 자체의 평균 분리 정도를 공통 기준으로 볼 수 있다.
반대로 D가 높다는 이유만으로 배포 임계값이 정해지지는 않는다. 오탐 비용, 미탐 비용, 처리 가능한 양, 하위 집단별 민감도처럼 실제 의사결정에 필요한 정보가 식에 들어 있지 않기 때문이다. 예를 들어 양성과 음성 평균이 잘 벌어져 있어도 두 분포가 결정 경계 근처에서 많이 겹치면 특정 임계값의 오류는 여전히 클 수 있다. 그래서 나는 D로 확률 출력의 평균 간격을 확인한 뒤, 선택한 임계값의 confusion matrix를 별도 표로 고정한다.
4. 높은 D가 보정까지 보장하지는 않는다
양성 평균이 0.90이고 음성 평균이 0.20이면 D는 크다. 하지만 실제 사건률이 20%인 구간에 모델이 60%를 반복해서 내고 있다면 확률의 의미는 여전히 어긋나 있다. Tjur's D는 실제 결과로 그룹을 나눠 평균 간격을 보지만, 0.6이라는 예측이 장기적으로 60% 사건률과 맞는지는 직접 검사하지 않는다.
그래서 보정 문제에는 calibration intercept와 slope, reliability diagram, ICI 같은 진단이 별도로 남는다. Brier score의 Murphy decomposition에서 resolution도 위험 집단을 벌리는 힘을 다루지만, 구간별 실제 사건률이 전체 사건률에서 얼마나 떨어졌는지를 제곱해 합친다. Tjur's D의 두 조건부 평균 차이와 계산 구조가 같지는 않다. 구분력과 보정은 서로 보완하지만 대체되지 않는다.
5. 클래스 수보다 case mix를 먼저 본다
D는 양성 그룹 평균과 음성 그룹 평균을 따로 계산하므로, 정확도처럼 다수 클래스의 개수가 결과를 기계적으로 덮는 형태는 아니다. 그래도 평가셋이 쉬운 양성과 쉬운 음성으로만 구성되면 간격이 크게 나오고, 경계 사례가 많아지면 작아질 수 있다. 병원·고객군·기간이 달라져 각 그룹 내부의 case mix가 바뀌면 같은 모델의 D도 달라진다.
작은 양성 그룹에서는 평균 하나가 몇 건의 극단 확률에 끌릴 수도 있다. 이때는 양성과 음성을 각각 재표본하는 stratified bootstrap으로 신뢰구간을 붙이고, 두 그룹의 support와 확률 분포를 같이 남기는 편이 낫다. 평균만 보고 분포가 갈라졌다고 단정하면, 대부분이 겹치는데 일부 극단 사례가 간격을 만든 상황을 놓칠 수 있다.
6. 평가 로그에 남기는 최소 항목
내가 실험 로그에 넣는 최소 필드는 evaluation split, positive support, negative support, 양성 그룹 평균 예측 확률, 음성 그룹 평균 예측 확률, Tjur's D, bootstrap 신뢰구간이다. 모델 버전과 확률 보정 적용 여부도 같이 적는다. D만 한 칸 남기면 다음 실험에서 간격이 커진 이유가 양성 쪽 상승인지 음성 쪽 하락인지 다시 계산해야 한다. 기간이나 기관이 바뀌는 검증에서는 전체 D와 주요 하위 집단의 D를 함께 기록한다. 그래야 모델 변경으로 간격이 달라진 것인지, 평가 대상의 case mix가 달라진 것인지 추적할 실마리가 남는다.
비교할 때는 같은 split에서 AUC, Brier score, calibration slope와 함께 본다. AUC만 좋아지고 D가 그대로라면 순위는 나아졌지만 확률 간격은 거의 변하지 않았을 수 있다. D가 커졌는데 calibration slope가 무너지면 더 극단적인 확률을 내면서 분리만 키웠을 가능성을 확인한다. 이 조합을 보고 나니 Tjur's D는 만능 점수라기보다, 양성과 음성 사이에 모델이 실제로 벌려 놓은 확률 간격을 한 줄로 확인하는 보조 계기판에 가깝다.
'[개발 공부]' 카테고리의 다른 글
| Hosmer-Lemeshow 검정: 위험도 그룹별 관측·기대 빈도 비교 (0) | 2026.07.28 |
|---|---|
| Spiegelhalter's Z: Brier score로 보는 확률 보정 검정 (0) | 2026.07.27 |
| Brier score 분해: 같은 점수 안의 보정과 구분력 (1) | 2026.07.17 |
| Integrated Calibration Index: 보정 곡선의 평균 간격 (0) | 2026.07.16 |
| Calibration slope와 intercept: 확률 오차의 방향을 나누는 두 값 (0) | 2026.07.15 |