
FPR, TPR, AUC의 의미부터 PR 곡선까지, 이진 분류 평가의 핵심을 파이썬으로 구현합니다
ROC 곡선의 개념 이해
ROC 곡선(Receiver Operating Characteristic)은 분류 모델의 성능을 시각적으로 평가하는 강력한 도구입니다. 원래는 레이더 신호 탐지 분야에서 나온 개념이지만, 현대 머신러닝에서는 가장 널리 사용되는 평가 지표 중 하나입니다.
ROC 곡선은 분류 임계값(threshold)을 변화시키면서 거짓 양성 비율(FPR)과 참 양성 비율(TPR)의 관계를 그린 것입니다. 곡선 아래 면적인 AUC가 클수록 모델의 성능이 좋습니다.
💡 ROC의 특장점
클래스 불균형이 있는 데이터셋에서도 모델의 성능을 공정하게 평가할 수 있습니다. 정확도만으로는 파악하기 어려운 모델의 진정한 능력을 보여줍니다.
FPR과 TPR의 의미
ROC 곡선을 이해하려면 먼저 두 가지 지표를 명확히 알아야 합니다:
- TPR (True Positive Rate) = TP / (TP + FN)
실제 양성 중 올바르게 예측한 비율. 재현율(Recall)과 같습니다. - FPR (False Positive Rate) = FP / (FP + TN)
실제 음성 중 잘못 예측한 비율. 낮을수록 좋습니다.
ROC 곡선은 X축에 FPR(0~1), Y축에 TPR(0~1)을 놓고, 분류 임계값을 변화시키면서 (FPR, TPR) 쌍을 연결한 곡선입니다.
📐 이상적인 ROC 곡선
완벽한 분류기: 좌상단 모서리 (FPR=0, TPR=1)를 지나갑니다.
무작위 분류기: 대각선 y=x를 따릅니다.
폴드별 ROC 곡선 그리기
교차 검증의 각 폴드에서 ROC 곡선을 그리고, 이들의 평균을 시각화하는 것이 실무에서 가장 신뢰할 수 있는 방법입니다:
from sklearn.metrics import roc_curve, auc
from numpy import interp
import numpy as np
cv = StratifiedKFold(n_splits=3)
mean_tpr = 0.0
mean_fpr = np.linspace(0, 1, 100)
for i, (train, test) in enumerate(cv.split(X_train, y_train)):
pipe_lr.fit(X_train[train], y_train[train])
# 확률값 예측
probas = pipe_lr.predict_proba(X_train[test])
# ROC 곡선 계산
fpr, tpr, thresholds = roc_curve(y_train[test],
probas[:, 1],
pos_label=1)
# 평균에 보간
mean_tpr += interp(mean_fpr, fpr, tpr)
# AUC 계산
roc_auc = auc(fpr, tpr)
print(f'Fold {i+1} AUC: {roc_auc:.3f}')
# 평균 계산
mean_tpr /= cv.get_n_splits()
mean_auc = auc(mean_fpr, mean_tpr)
AUC 값 해석하기
AUC(Area Under Curve)는 ROC 곡선 아래의 면적으로, 0~1 사이의 값입니다. AUC는 모델이 임의로 선택한 양성 샘플을 음성 샘플보다 높은 확률로 예측할 확률을 의미합니다.
- AUC = 1.0: 완벽한 분류기
- AUC = 0.9~1.0: 매우 우수 (Excellent)
- AUC = 0.8~0.9: 우수 (Good)
- AUC = 0.7~0.8: 양호 (Fair)
- AUC = 0.5: 무작위 분류와 동일
💡 실무 팁
AUC >= 0.85이면 대부분의 실무 문제에서 충분히 좋은 성능입니다. Wisconsin Breast Cancer 데이터셋으로 학습한 로지스틱 회귀 모델은 보통 0.96 이상의 AUC를 달성합니다.
PR 곡선 구현과 해석
PR 곡선(Precision-Recall Curve)</strong은 X축에 재현율(Recall)을, Y축에 정밀도(Precision)를 놓은 곡선입니다. ROC 곡선과 달리 클래스 불균형이 심한 데이터셋에서 더 적합합니다.
from sklearn.metrics import precision_recall_curve, auc
cv = StratifiedKFold(n_splits=3)
for i, (train, test) in enumerate(cv.split(X_train, y_train)):
pipe_lr.fit(X_train[train], y_train[train])
# 확률값 예측
probas = pipe_lr.predict_proba(X_train[test])
# PR 곡선 계산
precision, recall, thresholds = precision_recall_curve(
y_train[test],
probas[:, 1],
pos_label=1
)
# PR AUC 계산
pr_auc = auc(recall, precision)
print(f'Fold {i+1} PR-AUC: {pr_auc:.3f}')
PR 곡선의 특징:
- 곡선이 우상향에 가까울수록 좋은 모델입니다.
- ROC와 달리 곡선 끝이 (0, 양성 비율)에서 시작합니다.
- 클래스 불균형이 심할 때 ROC보다 더 민감한 평가를 제공합니다.
ROC vs PR: 언제 뭘 쓸까?
두 곡선 모두 훌륭한 평가 도구지만, 상황에 따라 적절한 선택이 필요합니다:
| 구분 | ROC 곡선 | PR 곡선 |
|---|---|---|
| 클래스 균형 | 균형 데이터셋 | 불균형 데이터셋 |
| 포커스 | 전체 성능 | 양성 클래스 성능 |
| 시각화 | 대칭적, 직관적 | 비대칭적, 민감함 |
| 추천 | 대부분의 경우 | 부정 탐지, 스팸 필터 |
💡 선택 기준
Wisconsin Breast Cancer 데이터셋처럼 클래스가 비교적 균형 잡혀 있으면 ROC를 쓰세요. 암 환자 클래스가 1% 미만이라면 PR 곡선이 더 명확한 신호를 줍니다.
📌 이번 포스트의 핵심 요약
- ROC 곡선으로 분류 모델의 임계값별 성능 평가
- AUC >= 0.85가 실무에서 좋은 성능의 기준
- 클래스 불균형이 심하면 PR 곡선 선택
- 교차 검증으로 각 폴드의 곡선을 그려 평균 계산
'정보 > IT 지식 정보' 카테고리의 다른 글
| 앙상블 학습이란? 보팅 분류기로 모델 성능 높이기 [4편] (0) | 2026.04.02 |
|---|---|
| GridSearchCV vs RandomizedSearchCV — 최적의 하이퍼파라미터 찾기 [3편] (0) | 2026.04.01 |
| 교차 검증과 혼동 행렬이란? 모델 성능을 제대로 평가하는 법 [1편] (0) | 2026.03.31 |
| 순차 후진 선택(SBS)으로최적의 특성 조합 찾기 [9편] (0) | 2026.03.30 |
| 정규화 vs 표준화, 그리고 L1 규제데이터 스케일링의 모든 것 [8편] (0) | 2026.03.30 |
댓글