ROC 곡선: 임계값을 움직이며 분류기의 실력을 그리다
분류 임계값을 바꿔가며 TPR과 FPR의 관계를 그리는 ROC 곡선의 해석법, AUC 지표, Python 구현, 불균형 데이터·다중 클래스에서의 한계를 정리한다.
2026-08-13 · 최초 발행 2025-05-23
ROC 곡선은 이진 분류 모델의 성능을 평가하는 시각화 도구다. 분류 임계값(threshold)을 다양하게 바꿔가며 거짓 양성률(False Positive Rate, FPR)에 따른 참 양성률(True Positive Rate, TPR)의 변화를 그래프로 그린다.
레이더에서 시작해 분류기 평가로 온 곡선
ROC 곡선은 모든 가능한 분류 임계값에서 FPR(x축)에 대한 TPR(y축)을 플로팅한 곡선이다. 제2차 세계대전 중 레이더 신호 감지를 위해 개발됐고, 이후 의학 진단과 기계 학습 분야로 확장됐다. 이진 분류기의 식별 능력(discriminative power)을 시각적으로 평가하는 것이 목적이다.
혼동행렬에서 TPR과 FPR을 뽑아낸다
TPR(True Positive Rate) = TP / (TP + FN)은 민감도(Sensitivity) 또는 재현율(Recall)이라고도 하며, 실제 양성 중 양성으로 올바르게 분류된 비율이다.
FPR(False Positive Rate) = FP / (FP + TN)은 1 - 특이도(Specificity)이며, 실제 음성 중 양성으로 잘못 분류된 비율이다.
곡선의 모양이 말해주는 것
이상적인 곡선은 좌상단 모서리(0,1)에 가까울수록 좋은 성능을 뜻한다. 대각선은 무작위 추측과 동등한 성능(AUC = 0.5)을 뜻하고, 대각선 아래는 무작위 추측보다 못한 성능이며 이 경우 예측 결과를 반대로 해석하면 개선할 수 있다.
AUC 한 숫자로 요약하는 성능
AUC(Area Under the Curve)는 ROC 곡선 아래 영역의 면적이다. 임의의 양성 샘플이 임의의 음성 샘플보다 더 높은 양성 예측 확률을 가질 확률을 뜻하며, 값에 따라 대략 다음처럼 해석한다: 1.0은 완벽한 분류, 0.90.99는 탁월함, 0.80.89는 우수함, 0.70.79는 양호함, 0.60.69는 보통, 0.5~0.59는 불량함, 0.5는 무작위 추측과 동등하다.
임계값을 훑어 곡선을 그리기까지
Python에서는 scikit-learn의 roc_curve와 auc 함수로 이 과정을 구현한다.
import numpy as np
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 예시 데이터: 실제 레이블과 예측 확률
y_true = np.array([0, 0, 1, 1, 1, 0, 1, 0, 1, 0])
y_scores = np.array([0.1, 0.3, 0.7, 0.8, 0.9, 0.2, 0.6, 0.4, 0.7, 0.3])
# ROC 곡선 계산
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
# AUC 계산
roc_auc = auc(fpr, tpr)
# ROC 곡선 시각화
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
의료 진단부터 정보 검색까지, ROC가 쓰이는 자리
질병 진단 모델에서는 높은 TPR과 낮은 FPR의 균형이 중요하다. 심각한 질병 진단에서는 높은 TPR을 우선시하고, 불필요한 치료를 줄이기 위해 FPR을 낮게 유지한다. COVID-19 진단 테스트, 암 검출 알고리즘, 심장병 예측 모델 등에 적용된다.
신용카드 사기 탐지 시스템에서는 ROC 곡선으로 모델을 최적화한다. 사기 감지(TPR) 최대화와 정상 거래의 오탐지(FPR) 최소화 사이의 균형이 필요하며, 업무 프로세스와 비용 구조에 따라 최적 임계값을 정한다.
검색 엔진의 관련성 판단 알고리즘 평가에도 쓰인다. 사용자 쿼리에 대한 문서 관련성 예측의 정확도를 평가하며, 검색 결과 랭킹 알고리즘·추천 시스템·콘텐츠 필터링에 적용된다.
불균형 데이터와 다중 클래스에서 곡선이 흔들릴 때
클래스 불균형이 심한 경우 ROC 곡선이 모델 성능을 과대평가할 수 있다. 소수 클래스의 오분류가 FPR에 미치는 영향이 작기 때문이다. 이런 경우 Precision-Recall 곡선 사용이 권장된다.
ROC 곡선은 성능을 시각화하지만 최적 임계값을 직접 제공하지는 않는다. 비용 함수를 정의해 최소화하거나, Youden's J 통계량(J = TPR + TNR - 1)을 최대화하거나, F1 점수를 최대화하는 방법으로 임계값을 정한다.
ROC 곡선은 기본적으로 이진 분류용으로 설계됐다. 다중 클래스로 확장할 때는 각 클래스별로 ROC 곡선을 그리는 One-vs-Rest 접근법이나, 모든 클래스 쌍에 대한 AUC의 평균을 계산하는 방법을 쓴다.
곡선 너머로 성능을 더 끌어올리는 법
모델 튜닝 단계에서는 그리드 탐색이나 무작위 탐색으로 하이퍼파라미터를 최적화해 AUC를 높이고, 중요 특성을 선택·변환하는 특성 엔지니어링과 여러 모델을 결합하는 앙상블 기법으로 안정적인 성능을 확보한다. 임계값 최적화 단계에서는 비즈니스 맥락에 맞는 TPR과 FPR의 균형점을 찾고, 오분류 비용을 고려한 비용 함수로 최적 임계값을 정하며, 여러 데이터셋에서 교차 검증으로 안정적인 임계값을 고른다.