AUC-ROC
Area Under ROC Curve
이진 분류 모델의 성능 지표. TPR과 FPR의 trade-off 시각화.
Area Under ROC Curve
이진 분류 모델의 성능 지표. TPR과 FPR의 trade-off 시각화.
AUC-ROC(Area Under the ROC Curve)는 이진 분류 모델의 성능을 평가하는 핵심 지표입니다. ROC 곡선은 분류 임계값(threshold)을 0부터 1까지 변화시키면서 True Positive Rate(TPR, 민감도)와 False Positive Rate(FPR, 1-특이도)의 관계를 시각화한 그래프이며, AUC는 이 곡선 아래의 면적을 계산한 값입니다.
ROC 곡선은 1940년대 2차 세계대전 당시 레이더 신호 탐지를 위해 개발되었습니다. 이후 의료 진단, 신용 평가, 사기 탐지 등 다양한 분야로 확산되었으며, 현재는 머신러닝 모델 평가의 표준 지표로 자리잡았습니다.
AUC 값은 0에서 1 사이이며, 0.5는 무작위 추측(random guessing) 수준을, 1.0은 완벽한 분류를 의미합니다. 실무에서는 AUC 0.7 이상이면 수용 가능, 0.8 이상이면 우수, 0.9 이상이면 탁월한 모델로 평가합니다. AUC의 핵심 장점은 임계값에 독립적이라는 것으로, 클래스 불균형 데이터에서도 안정적인 평가가 가능합니다.
금융 사기 탐지에서는 AUC가 0.95 이상을 목표로 하며, 의료 진단 AI에서는 0.85 이상이 FDA 승인의 기본 요건입니다. 마케팅 캠페인 타겟팅에서는 AUC 0.75만 되어도 상당한 비용 절감 효과를 기대할 수 있어, 도메인에 따라 적절한 목표치 설정이 중요합니다.
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt
# 샘플 데이터 생성
X, y = make_classification(n_samples=1000, n_classes=2,
n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42)
# 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)
# 예측 확률 (AUC 계산에는 확률값 필요)
y_pred_proba = model.predict_proba(X_test)[:, 1]
# AUC-ROC 계산
auc_score = roc_auc_score(y_test, y_pred_proba)
print(f"AUC-ROC Score: {auc_score:.4f}")
# ROC 곡선 그리기
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label=f'ROC Curve (AUC = {auc_score:.3f})')
plt.plot([0, 1], [0, 1], 'k--', label='Random Guess')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
"이번 사기 탐지 모델의 AUC가 0.92인데, 이전 모델 대비 0.05 개선됐습니다. 다만 클래스 불균형이 99:1이라 PR-AUC도 함께 봐야 할 것 같습니다."
"AUC-ROC와 Accuracy의 차이를 설명해주세요. 클래스 불균형이 심한 데이터에서 Accuracy가 95%인데 AUC가 0.6이면 어떤 문제가 있는 건가요?"
"roc_auc_score에 predict 결과 대신 predict_proba를 넣어야 합니다. 0/1 이진값으로는 AUC가 정확하게 계산되지 않아요."
AUC 계산 시 반드시 확률값(predict_proba)을 사용해야 합니다. 이진 예측값(0/1)을 넣으면 임계값 변화를 반영하지 못해 부정확한 AUC가 산출됩니다.
극심한 클래스 불균형(1:100 이상)에서는 AUC-ROC만으로 부족합니다. PR-AUC(Precision-Recall AUC)를 함께 확인하여 양성 클래스에 대한 모델 성능을 정확히 파악하세요.
다중 클래스 문제에서는 One-vs-Rest 또는 One-vs-One 방식으로 AUC를 계산해야 합니다. sklearn의 multi_class='ovr' 또는 'ovo' 옵션을 활용하세요.