Skip to main content

분류 평가 지표

분류 모델의 성능을 단일 지표로 판단하면 오도될 수 있습니다. 문제의 특성에 맞는 지표를 선택하고, 여러 지표를 종합적으로 해석하는 것이 중요합니다.

학습 목표

  • 혼동 행렬(Confusion Matrix)의 각 요소를 이해합니다.
  • Accuracy, Precision, Recall, F1의 차이와 적합한 상황을 파악합니다.
  • ROC-AUC와 PR-AUC의 차이를 이해합니다.
  • 불균형 데이터에서 적절한 지표를 선택할 수 있습니다.

왜 중요한가

암 진단 모델에서 정확도(Accuracy)가 99%라도, 실제 암 환자를 놓치는 비율이 높다면 의미가 없습니다. 비즈니스 목표에 맞는 지표를 선택해야 올바른 의사결정을 할 수 있습니다.

핵심 개념

혼동 행렬 (Confusion Matrix)

from sklearn.metrics import (confusion_matrix, classification_report,
                             accuracy_score, precision_score, recall_score,
                             f1_score, roc_auc_score, roc_curve)
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import seaborn as sns

# 이진 분류 데이터
X, y = make_classification(n_samples=1000, n_features=20,
                           weights=[0.7, 0.3], random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
                                                     random_state=42)

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# 혼동 행렬
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",
            xticklabels=["음성", "양성"], yticklabels=["음성", "양성"])
plt.xlabel("예측")
plt.ylabel("실제")
plt.title("혼동 행렬")
plt.show()
구분예측: 양성예측: 음성
실제: 양성TP (진양성)FN (위음성)
실제: 음성FP (위양성)TN (진음성)

핵심 지표 비교

지표수식중점적합한 상황
Accuracy(TP+TN) / 전체전체 정답률클래스 균형 시
PrecisionTP / (TP+FP)양성 예측의 정확성거짓 양성 최소화 (스팸 필터)
RecallTP / (TP+FN)실제 양성 탐지율거짓 음성 최소화 (암 진단)
F1 Score2 * P * R / (P+R)Precision-Recall 균형불균형 데이터
# 종합 리포트
print(classification_report(y_test, y_pred))

# 개별 지표
print(f"Accuracy:  {accuracy_score(y_test, y_pred):.4f}")
print(f"Precision: {precision_score(y_test, y_pred):.4f}")
print(f"Recall:    {recall_score(y_test, y_pred):.4f}")
print(f"F1:        {f1_score(y_test, y_pred):.4f}")

ROC-AUC

# ROC 곡선 그리기
y_prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
auc = roc_auc_score(y_test, y_prob)

plt.plot(fpr, tpr, label=f"ROC (AUC = {auc:.3f})")
plt.plot([0, 1], [0, 1], "k--", label="랜덤 분류기")
plt.xlabel("거짓 양성률 (FPR)")
plt.ylabel("진양성률 (TPR)")
plt.title("ROC 곡선")
plt.legend()
plt.show()

지표 선택 가이드

상황추천 지표이유
클래스 균형Accuracy, F1전반적 성능 파악
클래스 불균형F1, PR-AUCAccuracy가 오도 가능
거짓 양성 비용 높음Precision스팸 필터, 사기 경보
거짓 음성 비용 높음Recall질병 진단, 결함 탐지
확률 출력 비교ROC-AUC모델 전반적 판별력
99:1 비율의 데이터에서 모든 샘플을 다수 클래스로 예측해도 Accuracy는 99%입니다. 실제로는 소수 클래스를 전혀 탐지하지 못하는 무의미한 모델입니다. F1, Recall, PR-AUC를 사용해야 합니다.
ROC-AUC는 클래스 불균형에도 높은 값을 보일 수 있습니다. PR-AUC는 양성 클래스의 탐지 성능에 집중하므로 불균형 데이터에서 더 엄격한 평가를 제공합니다.

체크리스트

  • 혼동 행렬의 TP, FP, FN, TN을 설명할 수 있다
  • Precision과 Recall의 트레이드오프를 이해한다
  • ROC-AUC 값을 해석할 수 있다
  • 비즈니스 목표에 맞는 평가 지표를 선택할 수 있다

다음 문서