본문 바로가기
정보/IT 지식 정보

ROC 곡선과 PR 곡선 완전 이해 — 분류 모델의 진짜 성능 읽기 [2편]

by 안다니. 2026. 3. 31.
반응형
ROC곡선

 

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 곡선 선택
  • 교차 검증으로 각 폴드의 곡선을 그려 평균 계산

📚 시리즈 네비게이션

← 1편 - 교차 검증과 혼동 행렬

현재 글: 2편 - ROC 곡선과 PR 곡선

3편 - GridSearchCV와 하이퍼파라미터 튜닝 →

시리즈명: 머신러닝 실전 완전 정복

반응형

댓글