콘텐츠로 이동

ROC 곡선과 AUC (ROC Curve & Area Under the Curve)

난이도: 초급~중급
선수 지식: 혼동 행렬, 정밀도-재현율
관련 문서: 보정 | 불균형 데이터 | 공정성 지표

핵심 요약: ROC 곡선은 “민감도(Sensitivity) vs 거짓 경보율(FPR)“을 그래프로 그린 것이다. AUC(Area Under the Curve)는 무작위로 뽑은 양성 샘플이 음성 샘플보다 높은 점수를 받을 확률이며, 1에 가까울수록 좋은 모델이다. 레이더 운영자가 적기와 새 떼를 구분하는 능력을 평가하는 것에서 유래했다.

  • TPR (True Positive Rate): 재현율과 같은 값. 실제 양성 중 잡아낸 비율.
  • FPR (False Positive Rate): 실제 음성 중 잘못 양성이라고 외친 비율. 거짓 경보율이다.
  • ROC 곡선: 임계값을 움직이며 (FPR, TPR)을 찍은 그래프. 왼쪽 위로 붙을수록 좋다.
  • AUC (Area Under the Curve): ROC 곡선 아래 면적. “무작위로 뽑은 양성 1개가 음성 1개보다 높은 점수를 받을 확률”로 해석할 수 있다. 0.5는 동전 던지기, 1.0은 완벽.
  • 임계값 무관(Threshold-free): AUC는 특정 임계값을 고르지 않고 전체 순위만 본다. 그래서 편리하지만, 실제 운영 임계값에서의 성능은 따로 봐야 한다.

ROC(Receiver Operating Characteristic, 수신자 조작 특성) 곡선은 분류 모델의 임계값 독립적 성능을 시각화하는 도구다. X축에 위양성률(FPR, False Positive Rate), Y축에 진양성률(TPR, True Positive Rate)을 놓고 임계값을 변화시키며 그린다. AUC(Area Under the ROC Curve)는 이 곡선 아래 면적으로, 모델의 전반적인 분류 능력을 하나의 숫자로 요약한다.

ROC/AUC는 가장 널리 쓰이는 분류 성능 지표 중 하나이지만, 불균형 데이터에서는 함정이 있다.

비유: AUC는 심사위원의 안목을 재는 값이다. 합격자 한 명과 불합격자 한 명을 무작위로 뽑아 세웠을 때, 심사위원이 합격자에게 더 높은 점수를 줄 확률이 곧 AUC다. 0.5는 동전 던지기와 같고, 1.0은 한 번도 순서를 틀리지 않는 완벽한 안목이다. 다만 이것은 순서를 매기는 능력일 뿐, “몇 점부터 합격시킬지”는 알려주지 않는다.


ROC 곡선의 기원은 제2차 세계대전(World War II)까지 거슬러 올라간다. 1940년대 영국과 미국의 군사 연구자들은 레이더(Radar) 운영자가 적기(enemy aircraft)와 잡음(noise)을 얼마나 잘 구분하는지 평가해야 했다. 레이더 화면에서 신호가 나타나면 “적기인가, 새 떼인가, 단순 잡음인가”를 판단해야 했는데, 운영자마다 민감도가 달랐다. 신중한 운영자는 확실한 신호만 보고하여 거짓 경보(False Alarm)는 적었지만 적기를 놓치는 일이 잦았고, 예민한 운영자는 적기를 잘 잡았지만 오경보가 많았다. 이 트레이드오프를 체계적으로 시각화하기 위해, 수신자 조작 특성(Receiver Operating Characteristic) 곡선이 탄생했다. 전쟁 이후 이 기법은 신호 탐지 이론(Signal Detection Theory, SDT)으로 발전했고, 1960~70년대 심리학과 의학 진단으로 확산되었다. ML 분야에서는 1990년대 후반부터 모델 평가의 표준 도구로 채택되어, 오늘날 가장 널리 쓰이는 분류 성능 시각화 방법이 되었다.


X축: FPR=FPFP+TN=1Specificity\text{X축: FPR} = \frac{FP}{FP + TN} = 1 - \text{Specificity}

Y축: TPR=TPTP+FN=Recall=Sensitivity\text{Y축: TPR} = \frac{TP}{TP + FN} = \text{Recall} = \text{Sensitivity}

임계값을 ++\infty에서 -\infty로 변화시키면서 (FPR, TPR) 쌍을 그래프에 표시한다. 본질적으로 이것은 레이더 운영자의 딜레마와 동일하다 — “신호(Signal) vs 잡음(Noise)“에서 적기를 놓치지 않으려면(TPR ↑) 잡음에도 반응해야 하고(FPR ↑), 오경보를 줄이려면(FPR ↓) 적기도 놓칠 수밖에 없다(TPR ↓).

ROC 곡선 구성 다이어그램 ROC 곡선 구성 절차:

  1. 모든 샘플에 대해 모델 점수 p^\hat{p}를 계산
  2. 점수를 내림차순 정렬
  3. 각 고유 점수를 임계값으로 사용하여 TP, FP, TN, FN을 계산
  4. (FPR, TPR) 쌍을 플롯
  5. 점들을 연결하여 곡선 완성

AUC=01TPR(t)d(FPR(t))\text{AUC} = \int_0^1 \text{TPR}(t) \, d(\text{FPR}(t))

확률적 해석: 무작위로 선택한 양성 샘플의 점수가 무작위로 선택한 음성 샘플의 점수보다 높을 확률

AUC=P(p^positive>p^negative)\text{AUC} = P(\hat{p}_{\text{positive}} > \hat{p}_{\text{negative}})

이는 Wilcoxon-Mann-Whitney U 통계량(비모수 순위 검정 통계량)을 정규화한 것과 동일하다.

양성 2명과 음성 3명이 있고, 모델이 매긴 점수는 다음과 같다:

  • 양성: [0.9, 0.7]
  • 음성: [0.4, 0.3, 0.1]

AUC는 “양성 점수 > 음성 점수”인 쌍의 비율이다. 모든 (양성, 음성) 쌍을 비교하면:

양성 점수음성 점수양성 > 음성?
0.90.4O
0.90.3O
0.90.1O
0.70.4O
0.70.3O
0.70.1O

6쌍 중 6쌍 모두 양성 > 음성 → AUC = 6/6 = 1.0 (완벽한 분류)

만약 음성 한 명의 점수가 0.8이었다면, 0.7 < 0.8인 쌍 1개가 생겨 AUC = 5/6 = 0.83이 된다.

AUC 해석 가이드라인:

AUC 범위해석
0.5 – 0.6실패 (랜덤에 가까움)
0.6 – 0.7불량 (Poor)
0.7 – 0.8보통 (Fair)
0.8 – 0.9양호 (Good)
0.9 – 1.0우수 (Excellent)

주의: 이 기준은 대략적인 가이드라인이며, 도메인에 따라 달라진다. 의료 진단에서는 AUC 0.8도 부족할 수 있고, 일부 추천 시스템에서는 0.7이면 실용적일 수 있다.


전체 AUC 대신, 관심 있는 FPR 범위(예: FPR<0.1\text{FPR} < 0.1)에서의 곡선 아래 면적만 계산한다.

pAUC[0,α]=0αTPR(t)d(FPR(t))\text{pAUC}_{[0, \alpha]} = \int_0^{\alpha} \text{TPR}(t) \, d(\text{FPR}(t))

  • 표준화된 부분 AUC (McClish correction): 부분 AUC를 [0.5,1][0.5, 1] 범위로 정규화
  • 사용 시기: 낮은 FPR 영역에서의 성능만 중요한 경우 (예: 보안 시스템에서 오경보 비율 제한)

이진 분류 외에 다중 클래스 문제에서도 ROC를 확장할 수 있다.

방법설명
One-vs-Rest각 클래스에 대해 별도의 ROC 곡선을 그림 (K개의 곡선)
Micro-average모든 클래스의 예측을 합산하여 단일 ROC 곡선 생성
Macro-average클래스별 AUC를 계산 후 평균

ROC가 오해를 불러일으키는 경우

섹션 제목: “ROC가 오해를 불러일으키는 경우”

불균형 데이터에서의 함정:

ROC 곡선이 좋아 보이는데 실제 성능은 나쁜 경우가 있다. 핵심 원인은 FPR의 분모다.

FPR=FPFP+TN\text{FPR} = \frac{FP}{FP + TN}

음성 클래스가 매우 많으면 TNTN이 크므로, 상당히 많은 FPFP가 발생해도 FPR은 거의 변하지 않는다.

구체적 예시: 양성 10개, 음성 1000개인 데이터

FP 수FPRPrecision (TP=8 가정)
100.018/18 = 0.44
500.058/58 = 0.14
1000.108/108 = 0.07

FPR이 0.1밖에 안 되는데 Precision은 7%까지 떨어진다. ROC 곡선만 보면 “FPR 10% 정도면 괜찮지”라고 생각하기 쉽지만, 실제로는 양성 예측의 93%가 오탐이다.

권장: 불균형 데이터에서는 PR 곡선을 함께 확인해야 한다. Davis & Goadrich (2006)의 형식적 증명 참고.


  1. 임계값 무관성: AUC는 모든 임계값에 걸친 평균적 성능이므로, 실제 운영할 특정 임계값에서의 성능을 보장하지 않는다. 두 모델이 동일한 AUC를 가져도 실제 사용 임계값에서 성능이 완전히 다를 수 있다.

  2. 보정 무감응성: AUC는 순위(ranking)만 평가한다. 확률이 잘 보정(calibrated)되었는지는 전혀 반영하지 않는다. 보정 참조.

  3. 무관한 임계값의 평균: AUC는 실용적으로 의미 없는 임계값 영역(예: FPR > 0.5)의 성능도 포함한다. 이 영역이 중요하지 않다면 Partial AUC가 대안이다.

  4. 모델 간 교차: AUC가 높은 모델이 모든 임계값에서 우월하지는 않다. ROC 곡선이 교차하면, 특정 영역에서는 AUC가 낮은 모델이 더 좋을 수 있다.


ROC 곡선 vs PR 곡선 비교 다이어그램

비교 항목ROC 곡선PR 곡선
불균형 데이터낙관적으로 보일 수 있음현실적
기준선대각선 (항상 동일)유병률에 따라 변함
TN 반영O (Specificity 통해)X
요약 지표AUC-ROCAP (Average Precision)
곡선 비교비교 용이 (기준선 고정)기준선이 다르면 비교 어려움

  • 클래스가 비교적 균형잡힌 이진 분류 → ROC-AUC가 적절
  • 여러 모델의 전반적 분류 능력 비교 → AUC로 요약 비교
  • Specificity(특이도)가 중요한 의학적 맥락 → ROC 곡선에서 Sensitivity-Specificity 트레이드오프 확인
  • 특정 FPR 범위에서의 성능만 중요 → Partial AUC 사용
  • 불균형 데이터 → ROC보다 PR 곡선 우선

한 전자상거래(E-commerce) 플랫폼에서 계정 탈취 탐지(Account Takeover Detection) 모델을 개발했다. 정상 로그인 200만 건, 탈취 시도 2,000건(0.1%)의 데이터로 학습한 결과 AUC는 0.95로 우수했다. 그러나 운영 임계값(FPR = 0.05)에서 실제 성능을 확인하자, FP가 약 100,000건(200×0.05200\text{만} \times 0.05), TP가 약 1,800건이었다. 즉, 양성 예측 101,800건 중 실제 탈취는 1,800건뿐으로 Precision이 1.8%에 불과했다. AUC만 보면 “훌륭한 모델”이지만, 거짓 양성(False Positive)이 10만 건을 넘어 고객 서비스팀이 감당할 수 없었다. 이 팀은 PR 곡선(PR Curve)을 함께 분석한 후에야 불균형 데이터에서 AUC가 얼마나 낙관적인 그림을 보여주는지 깨달았고, Partial AUC(FPR < 0.01)와 AP를 주 지표로 전환했다.


import numpy as np
from sklearn.metrics import roc_auc_score, average_precision_score
rng = np.random.default_rng(0)
# 똑같은 성능의 모델을 균형/불균형 데이터에서 평가해 본다
for n_pos, label in [(1000, "균형 (50%)"), (10, "불균형 (1%)")]:
y = np.r_[np.ones(n_pos), np.zeros(1000)]
s = np.r_[rng.normal(1.0, 1, n_pos), rng.normal(0.0, 1, 1000)]
print(f"{label:12} AUC={roc_auc_score(y, s):.3f} AP={average_precision_score(y, s):.3f}")
# 실행 결과:
# 균형 (50%) AUC=0.751 AP=0.740
# 불균형 (1%) AUC=0.604 AP=0.014 <- AP만 폭락

AUC는 0.60으로 “그럭저럭”인데 AP는 0.014다. 불균형에서 AUC만 보면 모델이 쓸 만해 보이는 착시가 생긴다.


  1. “AUC가 0.95이면 훌륭한 모델이다” — 불균형 데이터에서는 높은 AUC가 높은 실용 성능을 의미하지 않을 수 있다. 반드시 PR 곡선도 확인하라.

  2. “AUC가 같으면 모델 성능이 같다” — ROC 곡선이 교차할 수 있다. 운영 임계값에서의 구체적 성능을 비교해야 한다.

  3. “AUC가 높으면 확률 예측이 정확하다” — AUC는 순위(ranking)만 반영한다. 확률의 정확성은 보정(Calibration)으로 별도 평가해야 한다.

  4. “ROC 곡선 아래의 대각선 아래에 모델이 있으면 항상 나쁘다” — AUC < 0.5는 예측을 반전(flip)하면 AUC > 0.5가 된다. 이는 모델이 나쁜 것이 아니라 레이블 해석이 뒤바뀐 것일 수 있다.

  5. “ROC-AUC로 모든 분류 문제를 평가할 수 있다” — 랭킹 문제에서는 NDCG, MAP가, 확률적 예측에서는 Brier Score, Log Loss가 더 적절하다.


1. AUC = 0.5는 무엇을 의미하는가?

정답 보기

무작위 추측과 같은 수준이다. 양성 하나와 음성 하나를 뽑았을 때 양성에 더 높은 점수를 줄 확률이 50%, 즉 판별력이 전혀 없다는 뜻이다.

2. AUC가 0.95인데 실제 서비스에서 오탐이 폭주했다. 어떻게 된 일인가?

정답 보기

AUC는 모든 임계값에 걸친 순위 능력만 본다. 실제 운영 임계값에서의 정밀도는 별개이며, 음성이 압도적으로 많으면 FPR이 조금만 있어도 FP의 절대 수가 폭증한다. PR 곡선과 운영 임계값의 정밀도를 함께 봐야 한다.

3. ROC 곡선의 x축과 y축은 각각 무엇인가?

정답 보기

x축은 FPR(= 1 - 특이도), y축은 TPR(= 재현율)이다. 왼쪽 위 모서리에 가까울수록 좋다.