분류 지표 — accuracy의 함정부터 PR-AUC까지

Introduction

LLM 평가라고 하면 보통 객관식 정답률이나 사람 선호도 같은 걸 떠올린다. 그런데 실무로 들어가면 이야기가 다르다. “이 응답이 유해한가”, “이 답변이 환각을 포함하는가”, “이 코드가 안전 정책을 위반하는가” — 이런 질문들은 전부 이진 또는 다중 분류 문제로 환원된다. 안전 필터, 유해성 판정기, 환각 탐지기, 정책 위반 분류기까지. LLM 평가 파이프라인의 상당 부분이 결국 “분류기 하나를 평가하는 일”이다.

문제는 이 영역의 클래스가 지독하게 불균형하다는 점이다. 일반적인 대화 트래픽에서 유해 발화 비율은 5% 아래로 떨어지는 경우가 흔하다. 그런데 분류 성능을 보고할 때 가장 널리 쓰이는 지표, accuracy는 바로 이 불균형 앞에서 체계적으로 사람을 속인다. “전부 안전”이라고만 답하는, 아무 일도 안 하는 분류기가 accuracy 95%를 받는다. 이 숫자를 보고서에 올리면 아무도 이상하다고 느끼지 못한다.

이 글의 결론을 먼저 말한다.

  1. accuracy는 불균형 데이터에서 쓰면 안 되는 지표다. TN(진짜 음성)을 분자에 그대로 넣기 때문에, 다수 클래스만 잘 맞혀도 점수가 치솟는다.
  2. F1과 macro/micro 평균은 서로 다른 질문에 답한다. F1은 TN을 아예 무시하고, micro는 표본 수로 가중해 다수 클래스에 지배되고, macro는 클래스 크기와 무관하게 동등 가중한다. 안전 taxonomy처럼 범주별 빈도가 크게 갈릴 때 이 셋은 정반대 결론을 낼 수 있다.
  3. ROC-AUC는 불균형 앞에서 낙관적인 착시를 만든다. FPR의 분모가 실제 음성 수라서, 음성이 압도적으로 많으면 FP가 꽤 늘어도 FPR은 거의 움직이지 않는다. PR-AUC는 분모가 예측 양성 수라 FP에 훨씬 민감하다.
  4. AUC 계열 지표는 임계값 전체를 요약한 값이라, 실제 배포 임계값 하나에서의 성능을 알려주지 않는다. 운영점 지표(recall@FPR, precision@k, partial AUC)를 따로 봐야 한다.
  5. 이 모든 지표는 순위(ranking)만 본다. “유해할 확률 0.7”이 실제로 70%인지는 별개의 질문이다 — 이건 calibration이고, #21에서 다룬다.

이 다섯 개를 순서대로 뜯는다. #3 척도와 허용 연산이 “평균을 내도 되는가”를 물었다면, 이번 글은 “이 숫자가 애초에 무엇을 재고 있는가”를 묻는다.

Background

LLM 평가가 왜 분류로 귀결되는가

연속적인 값(유창성 점수, 선호도 Elo)을 다루는 평가도 있지만, 실무에서 자동화된 판정 대부분은 결국 “이거냐 아니냐”로 떨어진다. 안전 필터는 “유해/안전”을, 환각 탐지기는 “이 문장이 근거 문서에 의해 뒷받침되는가/아닌가”를, 정책 위반 분류기는 “정책 위반 카테고리 중 어디에 해당하는가”를, judge 기반 자동채점 상당수도 최종적으로는 “pass/fail”이라는 이진 판정을 낸다. 이 판정들의 공통점은 “진짜로 문제가 있는 사례”가 항상 소수라는 것이다. 정상적으로 운영되는 서비스라면 유해 발화·환각·정책 위반은 예외 상황이지 일상이 아니기 때문이다. 그래서 이 글에서 다루는 함정들은 특정 도메인 하나가 아니라, “LLM 출력에 이진/다중 라벨을 매기는” 거의 모든 자동 평가 파이프라인에 적용된다.

혼동행렬 — 모든 분류 지표의 출발점

이진 분류기 하나(예: “이 응답은 유해한가?”)를 평가한다고 하자. 실제 라벨과 분류기의 예측을 교차하면 네 칸짜리 표가 나온다.

  예측: 양성(유해) 예측: 음성(안전)
실제: 양성(유해) TP (True Positive) FN (False Negative)
실제: 음성(안전) FP (False Positive) TN (True Negative)
  • \(TP\): 유해한 응답을 유해하다고 맞힌 수.
  • \(FN\): 유해한 응답을 안전하다고 놓친 수 — 안전 분류기 맥락에서 가장 비싼 실수다.
  • \(FP\): 안전한 응답을 유해하다고 오탐한 수 — 과잉 거절(over-refusal)로 이어진다.
  • \(TN\): 안전한 응답을 안전하다고 맞힌 수.

이 네 칸의 조합이 어떤 지표를 만드느냐에 따라 “분류기가 잘한다”는 말의 의미가 완전히 달라진다. 아래 표가 이 글에서 다룰 지표를 한눈에 정리한 것이다.

지표 수식 다른 이름 무엇을 무시하는가
Precision (정밀도) \(\dfrac{TP}{TP+FP}\) PPV \(FN\) — 놓친 양성은 안 봄
Recall (재현율) \(\dfrac{TP}{TP+FN}\) TPR, Sensitivity \(FP\) — 오탐은 안 봄
Specificity (특이도) \(\dfrac{TN}{TN+FP}\) TNR \(FN\), 애초에 양성 클래스를 안 봄
FPR \(\dfrac{FP}{FP+TN} = 1-\text{특이도}\) fall-out 양성 클래스를 안 봄
F1 \(\dfrac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision}+\text{Recall}}\) Dice 계수와 동일 \(TN\)을 완전히 배제
Accuracy \(\dfrac{TP+TN}{TP+TN+FP+FN}\) - 아무것도 안 무시 — 그런데 이게 문제다
Balanced Accuracy \(\dfrac{\text{Recall}+\text{특이도}}{2}\) - 클래스 크기 정보를 의도적으로 버림
MCC 아래 Method 참조 표현형 상관계수 없음 — 네 항을 대칭적으로 사용

여기서 가장 중요한 한 줄: accuracy와 F1은 \(TN\)을 정반대로 다룬다. accuracy의 분자에는 \(TN\)이 그대로 들어가 있고, F1의 분자·분모 어디에도 \(TN\)은 없다. 이 차이 하나가 아래에서 볼 “accuracy의 함정”의 정체다.

Method

Accuracy의 함정

정의. accuracy는 전체 표본 중 맞힌 비율이다.

\[\text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN}\]

함정. 유해 발화 비율이 5%인 데이터셋(전체 10,000건 중 유해 500건, 안전 9,500건)에서, 무슨 입력이 와도 항상 “안전”이라고만 답하는 분류기를 생각하자. 혼동행렬은 다음과 같다.

  예측: 유해 예측: 안전 합계
실제: 유해 \(TP=0\) \(FN=500\) 500
실제: 안전 \(FP=0\) \(TN=9{,}500\) 9,500
\[\text{Accuracy} = \frac{0+9{,}500}{10{,}000} = 0.95\]

이 분류기는 유해 발화를 단 한 건도 잡아내지 못했는데(recall \(=0/500=0\)), accuracy는 95%다. 이유는 명확하다. 분모의 대부분을 차지하는 \(TN=9{,}500\)이 분자에 그대로 얹혀서, “다수 클래스(안전)만 잘 맞혀도 점수가 오른다.” 비유하자면 폭발물 탐지견이 아무 짐 앞에서도 짖지 않고 가만히 있는데, 짐의 99%가 애초에 정상이라는 이유로 “탐지 성공률 99%”라고 우기는 것과 같다.

함정을 피하는 법. 같은 데이터에 balanced accuracy를 적용하면 \((\text{Recall}+\text{특이도})/2 = (0+1)/2 = 0.5\) — 동전 던지기 수준이라는 게 바로 드러난다. F1은 precision이 정의되지 않거나(예측 양성이 0건) 0으로 수렴해 역시 낮게 나온다. accuracy가 높다는 것은 “다수 클래스를 잘 맞힌다”는 뜻이지 “쓸모 있다”는 뜻이 아니다 — 이 구분이 안전 분류기 평가에서 가장 자주 무너지는 지점이다.

Precision, Recall, F1 — 그리고 왜 조화평균인가

precision과 recall은 서로 반대 방향의 실수를 잰다. precision은 “내가 유해하다고 판정한 것 중 진짜 유해한 비율”(FP를 벌준다), recall은 “진짜 유해한 것 중 내가 잡아낸 비율”(FN을 벌준다). 안전 분류기 맥락에서 이 둘은 정확히 과잉 거절(precision 낮음)과 놓친 위험(recall 낮음)에 대응한다.

F1은 이 둘을 산술평균이 아니라 조화평균으로 합친다.

\[F1 = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision}+\text{Recall}}\]

왜 조화평균인가. 산술평균은 둘 중 하나가 극단적으로 낮아도 다른 하나가 높으면 중간값으로 뭉갠다. 조화평균은 작은 값 쪽으로 강하게 끌려간다. precision \(=0.9\), recall \(=0.1\)인 극단적 사례를 보자. 산술평균은 \((0.9+0.1)/2=0.5\)로 그럴듯해 보이지만, F1은

\[F1 = \frac{2 \times 0.9 \times 0.1}{0.9+0.1} = \frac{0.18}{1.0} = 0.18\]

로 뚝 떨어진다. 즉 F1은 “둘 중 하나라도 심각하게 나쁘면 전체 점수를 낮게 깎아야 한다”는 설계 의도를 담고 있다. 그런데 이 F1도 위에서 본 대로 \(TN\)을 아예 쓰지 않는다는 한계가 있다 — 안전 클래스를 얼마나 잘 지켜냈는지는 F1 점수에 전혀 반영되지 않는다.

Macro vs Micro vs Weighted 평균 — 다중 클래스에서

안전 taxonomy는 보통 이진이 아니라 다중 클래스다. “안전 / 경미한 위반 / 심각한 위반”처럼 범주가 나뉘고, 범주별 빈도는 극단적으로 차이 난다(심각한 위반은 늘 소수다). 클래스별 F1을 하나의 숫자로 합치는 방법이 세 가지 있다.

\[\text{Micro-F1} = \frac{2 \sum_i TP_i}{2\sum_i TP_i + \sum_i FP_i + \sum_i FN_i}\] \[\text{Macro-F1} = \frac{1}{K}\sum_{i=1}^{K} F1_i\] \[\text{Weighted-F1} = \sum_{i=1}^{K} \frac{n_i}{N} \cdot F1_i\]
  • \(K\): 클래스 수, \(n_i\): 클래스 \(i\)의 실제 표본 수, \(N=\sum_i n_i\).
  • micro는 클래스 구분을 지우고 전역 \(TP, FP, FN\)을 먼저 합산한 뒤 F1을 한 번만 계산한다. 단일 라벨 다중 클래스 문제에서는 micro-precision = micro-recall = accuracy = micro-F1이 항상 성립한다 — 예측이 틀릴 때마다 어떤 클래스에는 FN이 하나, 다른 클래스에는 FP가 하나 생기므로 전역 \(\sum FP = \sum FN\)이기 때문이다.
  • macro는 클래스별 F1을 먼저 계산한 뒤 표본 수와 무관하게 단순 평균한다. 클래스 하나가 10,000건이든 200건이든 macro 평균에서 가중치는 똑같이 \(1/K\)다.
  • weighted는 macro처럼 클래스별로 먼저 계산하지만 \(n_i/N\)으로 가중한다 — 다수 클래스 쪽으로 다시 끌려간다는 점에서 micro와 성격이 비슷하다.

왜 이게 중요한가. micro-F1(=accuracy)은 “전체 트래픽에서 내가 맞힌 비율”을 답한다. 다수 클래스가 압도적이면 그 클래스만 잘 맞혀도 micro-F1은 높다. macro-F1은 “각 범주를 똑같이 중요하게 쳤을 때 성능”을 답한다. 안전 taxonomy에서 희귀하지만 심각한 범주(예: 무기 제조, 아동 안전 위반)의 실패가 흔한 범주(예: 욕설)의 성공에 묻히면 안 되기 때문에, 범주별 빈도가 크게 갈리는 안전 평가에서는 macro 또는 클래스별 리포트를 반드시 함께 봐야 한다. 다만 macro는 표본이 적은 클래스에서 F1 자체가 불안정해질 수 있다는 대가가 있다 — 이 표본 크기 문제는 #15 신뢰구간에서 다시 다룬다.

ROC-AUC vs PR-AUC — 이 글의 핵심

분류기는 점수(score)를 뱉고, 그 점수에 임계값을 그어 양성/음성을 가른다. 임계값을 바꾸면 \((TPR, FPR)\) 또는 \((\text{Recall}, \text{Precision})\) 쌍이 곡선을 그린다.

  • ROC 곡선: \(x\)축 \(FPR\), \(y\)축 \(TPR\).
  • PR 곡선: \(x\)축 \(\text{Recall}\)(\(=TPR\)), \(y\)축 \(\text{Precision}\).

두 곡선의 \(x\)축이 같은 값(\(TPR\))을 재는데도, 곡선 아래 면적(AUC)이 완전히 다른 이야기를 한다. 이유는 두 축의 분모에 있다.

\[FPR = \frac{FP}{FP+TN} = \frac{FP}{N}, \qquad \text{Precision} = \frac{TP}{TP+FP}\]

\(FPR\)의 분모는 실제 음성 수 \(N\)이다. 불균형 데이터에서는 \(N\)이 압도적으로 크므로, 절대적인 \(FP\)가 꽤 늘어도 \(FPR\)은 거의 움직이지 않는다. 반면 precision의 분모는 예측 양성 수 \(TP+FP\)이고, 여기엔 애초에 음성이 압도적으로 많다는 사실이 반영되지 않는다 — \(FP\)가 조금만 늘어도 분모가 요동치므로 precision은 훨씬 민감하게 반응한다. 낚시 그물에 비유하면, 바다(음성)가 워낙 넓으면 그물에 물고기 아닌 게 좀 섞여도 “바다 전체 대비 비율(FPR)”로는 거의 표가 안 난다. 하지만 “건져 올린 것 중 진짜 물고기 비율(precision)”은 확 나빠진다.

이 관계를 수식으로 못박자. 양성 비율(유병률) \(\pi = P/(P+N)\)을 도입하면, precision을 \(TPR, FPR, \pi\)만으로 다시 쓸 수 있다.

\[\text{Precision} = \frac{TP}{TP+FP} = \frac{TP/(P+N)}{TP/(P+N)+FP/(P+N)} = \frac{TPR \cdot \pi}{TPR \cdot \pi + FPR \cdot (1-\pi)}\]

이건 사실 베이즈 정리다 — \(\pi\)가 사전확률, \(TPR\)이 양성일 때의 우도, \(FPR\)이 음성일 때의 우도라면 precision은 “예측이 양성일 때 실제로 양성일 사후확률”이다. 방향을 극단값 대입으로 확인하자. \(\pi \to 1\)이면 분모의 두 번째 항이 사라져 \(\text{Precision} \to 1\). \(\pi \to 0\)이면 분자가 사라져 \(\text{Precision} \to 0\). 즉 \(TPR, FPR\)을 고정해도 \(\pi\)가 작아질수록(더 희귀할수록) precision은 단조적으로 무너진다. 반면 \(TPR\)과 \(FPR\) 자체는 정의상 각각 양성 클래스와 음성 클래스 “내부”의 비율이라 \(\pi\)가 얼마든 값이 변하지 않는다 — ROC 곡선은 클래스 비율에 대해 불변이라는 뜻이다.

이 불변성이 왜 문제인가. 불변이라는 건 “일관성 있다”는 뜻이 아니라 “불균형이 심해질 때 실제로 벌어지는 일(정밀도 붕괴)을 ROC-AUC가 전혀 반영하지 못한다”는 뜻이다. ROC-AUC는 늘 비슷하게 좋아 보이는데, 배포 현장에서는 오탐이 걷잡을 수 없이 쌓인다.

Saito & Rehmsmeier (2015) 는 이 현상을 정면으로 다뤘다. 저자들(University of Bergen)은 PLOS ONE에 발표한 논문에서, ROC 곡선이 “specificity”라는 직관적으로 오해하기 쉬운 축을 쓰기 때문에 불균형 데이터에서 분류기 신뢰도를 과대평가하게 만들며, PR 곡선이 양성 예측 중 진짜 양성 비율을 직접 보여줘 미래 분류 성능을 더 정확히 예측한다고 논증한다. 핵심 메시지는 “불균형 데이터에서 분류기를 평가할 때는 PR 플롯이 ROC 플롯보다 더 많은 정보를 준다”는 것이다.

두 곡선의 기저선(baseline)도 다르다. 무작위 분류기(점수가 라벨과 무관)를 생각하면, 모든 임계값 \(t\)에서 \(TPR=FPR=t\)이므로

\[\text{Precision}(t) = \frac{t \cdot \pi}{t \cdot \pi + t \cdot (1-\pi)} = \pi\]

로 재현율과 무관하게 항상 \(\pi\)다. 즉 무작위 분류기의 PR 곡선은 높이 \(\pi\)의 수평선이고, \(\text{PR-AUC}_{\text{random}} = \pi\)다. 반면 ROC 곡선은 \((FPR,TPR)=(t,t)\)인 대각선이라 \(\text{ROC-AUC}_{\text{random}}=0.5\)로 클래스 비율과 무관하다. 그래서 PR-AUC는 절대값으로 읽으면 안 된다. \(\pi=0.05\)인 데이터에서 PR-AUC \(=0.3\)은 무작위 기저선(\(0.05\)) 대비 6배 좋다는 뜻이지, “낮은 점수”가 아니다. 반드시 자기 문제의 \(\pi\)와 대조해서 읽어야 한다.

Davis & Goadrich (2006) 는 ROC 공간과 PR 공간의 관계를 이론적으로 정리했다. 이들의 핵심 정리는 “한 곡선이 ROC 공간에서 다른 곡선을 지배하면, 그 순서 그대로 PR 공간에서도 지배한다(그리고 그 역도 성립한다)”는 동치 관계다. 다만 여기엔 중요한 단서가 붙는다 — ROC-AUC를 최적화하도록 학습된 알고리즘이 PR-AUC까지 최적화한다는 보장은 없다. 두 지표가 순서를 보존하는 관계에 있다는 것과, 하나를 최적화 목표로 삼았을 때 다른 하나도 저절로 좋아진다는 것은 다른 이야기다. 불균형이 심한 안전 분류기를 ROC-AUC 기준으로 모델을 골랐다면, PR-AUC 기준으로 다시 확인해야 하는 이유다.

같은 논문은 실무에 자주 걸리는 함정 하나를 더 짚는다. ROC 공간에서는 서로 다른 임계값의 두 지점을 직선으로 보간할 수 있다(두 임계값을 확률적으로 섞어 쓰면 그 직선 위 어떤 점도 실제로 도달 가능하다). 그런데 이 성질이 PR 공간에는 그대로 넘어가지 않는다 — ROC 공간의 직선 보간에 대응하는 PR 공간의 곡선은 직선이 아니다. Davis & Goadrich는 이걸 “도달 가능한 PR 곡선(achievable PR curve)”이라 부르고, ROC 공간의 convex hull에 대응하는 성질을 갖는다는 것을 보였다. 즉 PR 공간에서 두 점 사이를 단순히 직선으로 이어 곡선 아래 면적을 어림하면, 실제로 도달 가능한 성능보다 값을 과대평가하게 된다.

임계값 문제 — AUC는 배포 성능을 말해주지 않는다

ROC-AUC와 PR-AUC는 모든 임계값에 대해 적분한 요약값이다. 그런데 실제 배포는 임계값을 하나 고정해서 쓴다. 문제는 AUC가 좋다고 해서 그 특정 임계값에서의 성능이 좋다는 보장이 전혀 없다는 것이다. AUC 0.99짜리 곡선도 낮은 recall 구간(운영에 안 쓰는 영역)에서만 완벽하고, 실제로 쓰는 구간에서는 형편없을 수 있다.

그래서 안전 분류기는 다음과 같은 운영점 지표로 봐야 한다.

  • recall@FPR: “FPR을 1%로 묶어뒀을 때 recall이 얼마인가.” 오탐 예산(review 인력, 과잉 거절 허용치)을 먼저 정하고 그 안에서 얼마나 잡아내는지를 묻는다.
  • precision@k: 상위 \(k\)개(예: 하루 리뷰 큐에 올릴 수 있는 건수)로 잘랐을 때 그중 진짜 양성 비율. 랭킹 기반 검토 워크플로에 직접 대응한다.
  • Partial AUC (McClish, 1989): ROC 또는 PR 곡선 전체가 아니라 관심 있는 구간(예: \(FPR \in [0, 0.1]\))만 적분한 값. 원래 값은 구간 폭만큼 작아지므로, McClish는 이를 \([0.5, 1.0]\) 구간으로 재표준화해 전체 AUC와 같은 척도로 비교할 수 있게 했다. 운전면허 시험 전체 합격률이 아니라 “평행주차 코스에서만” 얼마나 잘하는지를 따로 떼어보는 것과 같다.

핵심은 하나다. “ROC-AUC 0.9”라는 한 문장은 배포 결정을 내리기에 정보가 부족하다. “FPR 1%에서 recall이 몇 퍼센트인가”가 실제로 안전팀이 필요로 하는 숫자다.

MCC와 Balanced Accuracy — 불균형에 강한 대안

Balanced Accuracy는 이미 앞에서 등장했다.

\[\text{Balanced Accuracy} = \frac{\text{Recall} + \text{특이도}}{2} = \frac{1}{2}\left(\frac{TP}{TP+FN}+\frac{TN}{TN+FP}\right)\]

recall과 특이도는 각각 양성 클래스와 음성 클래스 내부의 비율이므로, 클래스 크기와 무관하다. “전부 안전” 분류기가 정확히 0.5(=동전 던지기)로 나오는 이유다. Brodersen et al. (2010) 은 accuracy의 점추정이 불균형 데이터에서 낙관적으로 편향되고 신뢰구간을 만들기도 어렵다는 문제를, balanced accuracy의 사후분포를 추정하는 방식으로 정리했다(ICPR 2010, ETH Zurich).

MCC(Matthews Correlation Coefficient)는 원래 1975년 생화학자 Brian Matthews가 단백질 이차구조 예측을 평가하기 위해 제안한 지표다.

\[MCC = \frac{TP \cdot TN - FP \cdot FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}}\]
  • 분자: \(TP \cdot TN\)(맞힌 조합)에서 \(FP \cdot FN\)(틀린 조합)을 뺀다.
  • 분모: 네 개의 주변합(marginal sum)의 기하평균 성격이다.
  • 값의 범위는 \(-1\)(완전히 반대로 예측)에서 \(+1\)(완벽한 예측)까지고, \(0\)이 무작위 예측 수준이다. “전부 안전” 분류기는 \(TP=FP=0\)이라 분자·분모가 모두 0이 되어(관례상 MCC \(=0\)으로 정의) 정확히 무작위 수준으로 평가된다.
  • 사실 MCC는 예측 벡터와 실제 라벨 벡터 사이의 피어슨 상관계수와 수학적으로 동일하다 — “혼동행렬 네 칸이 서로 얼마나 같이 움직이는가”를 재는 지표라고 이해하면 된다.

같은 분류기를 네 지표로 동시에 재보면 왜 MCC를 따로 챙겨야 하는지 드러난다. 전체 10,000건(양성 500, 음성 9,500) 중 \(TP=400, FN=100, FP=100, TN=9{,}400\)인 “꽤 괜찮은” 분류기를 생각하자(recall \(=0.8\), precision \(=0.8\)).

\[MCC = \frac{400\times9{,}400-100\times100}{\sqrt{500\times500\times9{,}500\times9{,}500}} = \frac{3{,}750{,}000}{4{,}750{,}000} \approx 0.79\]
지표
Accuracy 0.98
F1 0.80
Balanced Accuracy 0.89
MCC 0.79

accuracy는 0.98로 거의 완벽해 보이지만, 이 중 상당 부분은 다수 클래스(\(TN=9{,}400\))를 맞힌 몫이다. F1(0.80)과 balanced accuracy(0.89)는 그보다 보수적이고, MCC(0.79)는 네 칸을 대칭적으로 반영해 가장 냉정한 값을 낸다. 지표를 하나만 보고받는다면 accuracy가 가장 위험한 선택이라는 게 이 표에서 바로 드러난다.

Chicco & Jurman (2020)은 BMC Genomics에 발표한 논문에서, accuracy와 F1이 불균형 이진 분류에서 과도하게 낙관적인 점수를 낼 수 있는 반면 MCC는 \(TP, TN, FP, FN\) 네 항목 모두에서 고르게 좋은 성능을 내야만 높은 값이 나온다는 것을 보였다. 네 칸을 대칭적으로 쓴다는 점에서, MCC는 accuracy처럼 다수 클래스에 휘둘리지도, F1처럼 \(TN\)을 무시하지도 않는다.

Calibration으로의 다리

여기까지 다룬 모든 지표 — precision, recall, F1, ROC-AUC, PR-AUC, MCC — 는 공통점이 하나 있다. 전부 순위(ranking)만 본다. 분류기가 유해한 응답에 안전한 응답보다 높은 점수를 매기기만 하면, 그 점수의 절대적인 크기가 무엇을 뜻하는지는 이 지표들의 관심사가 아니다.

그런데 실무에서는 “이 응답이 유해할 확률이 0.7이다”라는 숫자 자체를 쓴다. 리뷰 우선순위를 매기거나, 여러 분류기의 점수를 합치거나, 사람에게 “이 정도 확신도”라고 보여줄 때다. 이때 필요한 질문은 “0.7이라고 말한 것들이 실제로 70% 확률로 유해한가”이고, 이건 이 글에서 다룬 어떤 지표로도 답할 수 없다. 순위가 완벽해도(AUC=1) 확률값 자체는 완전히 틀릴 수 있다 — 예컨대 모든 유해 응답에 0.51, 모든 안전 응답에 0.49를 매겨도 AUC는 1이지만 “0.51”이라는 숫자는 확률로서 무의미하다. 이 calibration 문제, 그리고 그걸 재는 ECE(Expected Calibration Error) 같은 지표는 #21 안전 평가의 통계에서 다룬다.

지표 선택 가이드

지금까지 다룬 지표를 상황별로 정리하면 실무에서 바로 쓸 수 있다.

상황 추천 지표 피해야 할 지표
불균형 데이터에서 단일 요약 점수가 필요할 때 MCC, Balanced Accuracy Accuracy 단독
여러 분류기·여러 임계값을 비교할 때 불균형이면 PR-AUC, 균형이면 ROC-AUC 균형 여부 확인 없이 AUC만 비교
특정 운영 임계값에서 배포를 결정할 때 recall@FPR, precision@k, partial AUC 전체 AUC만 보고 결정
범주가 여러 개고 빈도가 크게 다를 때(안전 taxonomy) Macro-F1 또는 클래스별 리포트 Micro-F1(=accuracy) 단독
확률값 자체를 다른 시스템·사람에게 넘길 때 Calibration(ECE 등, #21) 순위 지표만으로 확률을 신뢰

Experiments

세 가지 토이 예제로 위 내용을 직접 확인한다. 모두 같은 분류기(같은 점수 분포)에서 출발해, 조건만 바꿔가며 지표가 어떻게 달라지는지 본다.

실험 1 — 양성 비율을 5%에서 1%로 낮추면

가상의 분류기가 세 개의 임계값에서 다음과 같은 \((FPR, TPR)\)를 낸다고 하자(임계값이 낮을수록 recall이 높아지고 FPR도 커진다).

임계값 FPR TPR(=Recall)
높음 0.005 0.50
중간 0.020 0.70
낮음 0.142 0.90

\(TPR, FPR\)은 각 클래스 내부 비율이므로 양성 비율 \(\pi\)와 무관하다. \((0,0)\)과 \((1,1)\)을 더해 사다리꼴 공식으로 ROC-AUC를 근사하면

\[\text{ROC-AUC} \approx 0.00125+0.009+0.0976+0.8151 = 0.923\]

이고, 이 값은 \(\pi=5\%\)든 \(1\%\)든 완전히 동일하다(위에서 유도했듯 ROC 곡선 자체가 \(\pi\)와 무관하기 때문이다).

이제 같은 세 임계값에서 precision을 \(\pi=5\%\)(전체 10,000건 중 양성 500건)와 \(\pi=1\%\)(양성 100건)로 각각 계산한다.

임계값 Recall Precision (\(\pi=5\%\)) Precision (\(\pi=1\%\))
높음 0.50 0.840 0.503
중간 0.70 0.648 0.261
낮음 0.90 0.250 0.060
(전부 양성 예측) 1.00 0.050 (=π) 0.010 (=π)

recall \(0.5\sim1.0\) 구간만 사다리꼴로 적분한 부분 PR-AUC(뒤에서 다룰 partial AUC와 같은 방식의 근사)는

\[\text{PR-AUC}_{[0.5,1.0]}(\pi=5\%) \approx 0.254, \qquad \text{PR-AUC}_{[0.5,1.0]}(\pi=1\%) \approx 0.112\]

ROC-AUC는 0.923에서 요지부동인데, PR-AUC는 0.254에서 0.112로 절반 넘게 급락했다. 양성 비율이 5분의 1로 줄었을 뿐인데(5%→1%), 같은 분류기·같은 임계값 셋에서 벌어진 일이다. ROC-AUC만 보고받은 사람은 “분류기 성능이 그대로다”라고 결론 내리지만, 현장에서 체감하는 오탐률은 그렇지 않다.

실험 2 — ROC-AUC 0.92, 그런데 배포 임계값에서 precision이 무너진다

같은 분류기를 실제로 배포한다고 하자. 안전팀이 recall 90%를 확보하려고 “낮음” 임계값(\(FPR=0.142, TPR=0.9\))을 골랐다. ROC-AUC는 위에서 계산한 대로 0.92로, 보고서에 올리기에 나쁘지 않은 숫자다.

이제 하루 100만 건의 대화를 처리하고, 유해 비율이 \(\pi=5\%\)라고 하자.

구분
하루 처리량 1,000,000건
실제 유해(양성) 50,000건
실제 안전(음성) 950,000건
잡아낸 유해(\(TP=0.9\times50{,}000\)) 45,000건
오탐(\(FP=0.142\times950{,}000\)) 134,900건
예측 양성 합계(\(TP+FP\)) 179,900건
Precision \(45{,}000/179{,}900 \approx 0.25\)

ROC-AUC 0.92짜리 분류기가 실제 배포 임계값에서는 정밀도 25%를 낸다. 다시 말해 “유해”로 플래깅된 179,900건 중 134,900건(75%)이 사실은 안전한 대화다. 리뷰 인력이 매일 13만 건 넘는 헛수고를 하거나, 자동 조치라면 13만 건 넘는 정상 사용자가 과잉 거절을 겪는다는 뜻이다. \(\pi\)가 1%로 더 떨어지면 같은 임계값에서 precision은 0.06까지 내려간다(실험 1의 표 참고) — ROC-AUC 0.92라는 숫자는 이 붕괴를 전혀 경고해주지 않았다.

실험 3 — 안전 taxonomy에서 macro-F1과 micro-F1이 반대 결론을 낸다

세 범주(“안전”, “경미한 위반”, “심각한 위반”)로 나뉜 다중 클래스 안전 분류기를 생각하자. 실제 분포는 압도적으로 “안전”에 쏠려 있다(전체 10,000건 중 안전 9,000 / 경미 800 / 심각 200). 다음은 분류기의 3×3 혼동행렬이다.

실제 \ 예측 안전 경미 심각 실제 합계
안전 8,820 150 30 9,000
경미 180 560 60 800
심각 100 60 40 200
예측 합계 9,100 770 130 10,000

클래스별 precision·recall·F1을 계산하면 다음과 같다.

클래스 Recall Precision F1
안전 \(8{,}820/9{,}000=0.980\) \(8{,}820/9{,}100=0.969\) 0.975
경미 \(560/800=0.700\) \(560/770=0.727\) 0.713
심각 \(40/200=0.200\) \(40/130=0.308\) 0.242

분류기는 “심각한 위반”을 5건 중 1건만 잡아낸다(recall 20%). 그런데 세 가지 평균 방식으로 요약하면 그림이 확 달라진다.

평균 방식 계산
Macro-F1 \((0.975+0.713+0.242)/3\) 0.644
Micro-F1 (=accuracy) \(\sum TP/N = (8{,}820+560+40)/10{,}000\) 0.942
Weighted-F1 \(0.9\times0.975+0.08\times0.713+0.02\times0.242\) 0.939

micro-F1과 weighted-F1은 94% 안팎으로 “잘한다”고 말한다. 둘 다 표본 수(9,000건짜리 “안전” 클래스)에 지배되기 때문이다. 반면 macro-F1은 64%로 뚝 떨어진다 — 심각한 위반을 놓치는 성능(F1 0.242)이 다른 두 클래스와 동등한 가중치로 반영되기 때문이다. “이 분류기를 배포해도 되는가”라는 질문에 micro-F1은 “그렇다”, macro-F1은 “아니다, 가장 위험한 범주를 5건 중 4건 놓친다”고 답한다. 안전 taxonomy를 평가할 때 micro/weighted만 보고하면 바로 이 결론이 뒤집힌다.

통계 요약

지표 정의 분모에 들어가는 것 불균형에 강한가 임계값 의존
Accuracy \((TP+TN)/N\) 전체 표본 수 아니오 — 다수 클래스가 지배
Precision \(TP/(TP+FP)\) 예측 양성 수 아니오 — \(\pi\)에 비례해 낮아짐
Recall (=TPR=Sensitivity) \(TP/(TP+FN)\) 실제 양성 수 예 — \(\pi\)와 무관
Specificity (=TNR) \(TN/(TN+FP)\) 실제 음성 수 예 — \(\pi\)와 무관
FPR \(FP/(FP+TN)\) 실제 음성 수 비율 자체는 그렇지만, 절대 오탐 체감을 왜곡
F1 Precision·Recall의 조화평균 \(TN\) 배제 아니오 — Precision 경유해 \(\pi\)에 민감
Macro-F1 클래스별 F1의 산술평균 클래스 수 예 — 소수 클래스를 동등 가중
Micro-F1 전역 \(TP,FP,FN\) 합산 후 F1(=accuracy) 전체 표본 수 아니오 — 다수 클래스가 지배
Weighted-F1 클래스별 F1을 \(n_i/N\)으로 가중 전체 표본 수 아니오 — 여전히 다수 클래스 쪽
Balanced Accuracy \((\text{Recall}+\text{특이도})/2\) 두 클래스 각각 내부
MCC \((TP\cdot TN-FP\cdot FN)/\sqrt{\cdots}\) 네 항의 기하평균 형태
ROC-AUC ROC 곡선 아래 면적 \(TPR, FPR\)(클래스 내부 비율) 아니오 — 불변 자체가 낙관적 착시를 만듦 아니오(전 구간 요약)
PR-AUC PR 곡선 아래 면적 Precision 경유(예측 양성 수) 예 — 불균형을 그대로 반영, 기저선도 \(\pi\) 아니오(전 구간 요약)
Partial AUC / recall@FPR 관심 구간만 적분하거나 단일점 위와 동일, 구간·지점 한정 예(구간·지점을 직접 지정)

Conclusion

이 글의 메시지를 한 줄로 요약하면: 분류 지표는 저마다 혼동행렬의 어느 칸을 무시하느냐로 정의되고, 그 선택이 불균형 데이터에서 완전히 다른 결론을 만든다. accuracy는 \(TN\)을 분자에 그대로 넣어 다수 클래스에 휘둘리고, F1은 \(TN\)을 아예 빼서 accuracy의 함정을 피하지만 여전히 precision을 경유해 \(\pi\)에 민감하다. micro-F1은 accuracy와 사실상 같은 값이라 다수 클래스에 지배되고, macro-F1만이 소수 클래스를 동등하게 대접한다. ROC-AUC는 클래스 비율에 불변이라는 바로 그 성질 때문에 불균형 데이터에서 낙관적인 착시를 만들고, PR-AUC는 그 착시를 걷어내는 대신 절대값이 아니라 기저선(\(\pi\)) 대비로 읽어야 한다. 그리고 AUC 계열은 전 임계값 요약이라, 실제 배포 임계값에서의 성능은 recall@FPR 같은 운영점 지표로 따로 확인해야 한다.

실무 체크리스트로 정리하면 다음과 같다.

  1. 클래스(범주별) 비율을 먼저 확인한다 — 특히 안전·유해 비율.
  2. accuracy 단독 보고는 신뢰하지 않는다. balanced accuracy나 MCC를 함께 본다.
  3. 다중 클래스라면 micro/weighted와 macro를 함께 보고, 왜 다른지 설명한다.
  4. ROC-AUC와 PR-AUC를 나란히 본다. 둘의 차이가 클수록 불균형이 심하다는 신호다.
  5. AUC가 아니라 배포 임계값에서의 precision·recall(또는 recall@FPR)을 직접 계산한다.
  6. 확률값 자체를 쓴다면 calibration을 별도로 확인한다 — #21.

한계도 분명하다. 이 글에서 다룬 모든 지표는 정답 라벨이 옳다는 전제 위에 서 있다. 라벨러 간 일치가 낮은 안전 데이터에서는 지표 자체보다 라벨의 신뢰도가 먼저 무너질 수 있고, 이 문제는 #13 κ 계열, #14 κ의 역설에서 다룬다. 또한 여기서 계산한 모든 숫자는 유한한 평가셋에서 나온 추정치다 — “PR-AUC 0.31”이 표본이 달라져도 재현될지는 #15 신뢰구간의 질문이다. 분류 지표를 넘어, 다음 편 #5 생성 지표에서는 정답이 하나로 정해지지 않는 생성 평가로 넘어간다.

참고 문헌


LLM 평가 체계 시리즈

이 글은 LLM 평가 체계 시리즈의 네 번째 글이다.

1부. 평가란 무엇인가

  1. 측정으로서의 평가 — 구성개념·조작화·타당도·신뢰도
  2. 벤치마크는 무엇을 재고 있나 — 벤치 445편 구성타당도 리뷰

2부. 무엇을 숫자로 만드나 — 평가 metric

  1. 척도와 허용 연산 — Likert 평균을 내도 되는가
  2. (현재 글) 분류 지표 — accuracy의 함정부터 PR-AUC까지
  3. 생성 지표와 그 타당도 — BLEU에서 COMET까지
  4. 객관식 평가는 왜 흔들리나 — 위치 편향과 포맷 민감도

3부. LLM 벤치마크 지형도

  1. 지식과 추론 — MMLU 계열의 흥망 — MMLU·GPQA·BBH·HELM
  2. 검증 가능한 도메인 — 수학과 코드 — GSM8K·MATH·HumanEval·SWE-bench
  3. 개방형 대화 — MT-Bench에서 Arena까지 — judge 기반 벤치의 등장
  4. 능력의 다른 축 — 지시따르기·긴 문맥·사실성
  5. 한국어 벤치마크 — 번역이 아니라 원산, 그리고 문화 타당도

4부. 사람이 읽는다 — 정성평가와 일치도

  1. 사람 평가 설계 — 루브릭·Likert·pairwise·BWS
  2. 우연을 빼다 — κ 계열 — Cohen·Fleiss·weighted·Krippendorff
  3. κ의 역설 — 일치율 90%인데 κ가 0.21

5부. 차이는 진짜인가 — 정량평가의 통계

  1. 점수는 추정치다 — 이항비율 신뢰구간과 Wald의 실패
  2. 차이는 유의한가 — paired bootstrap·순열검정·McNemar
  3. 몇 개를 재야 하나 — 검정력·표본크기·다중비교
  4. LLM eval의 통계 실무 — 클러스터 SE·IQM·분산 분해

6부. 신뢰할 수 있는 평가 체계

  1. judge를 통계로 다루기 — 편향·Bradley-Terry·PPI
  2. 오염·재현성·효율 — 오염 검정·harness·IRT
  3. 안전 평가의 통계와 체계 설계 — 희귀사건·calibration·체크리스트

본 시리즈는 21편으로 구성된다.




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 안전 평가의 통계와 체계 설계 — 희귀사건과 calibration, 스물한 편의 마지막 체크리스트
  • 오염·재현성·효율 — 이 점수는 무엇을 재고 있나
  • judge를 통계로 다루기 — 편향, Bradley-Terry, PPI
  • LLM eval의 통계 실무 — 클러스터 SE, 분산 분해, IQM
  • 몇 개를 재야 하나 — 검정력, 표본크기, 다중비교