Programming

[분류 성능 평가지표 3편] F1 Score·ROC-AUC로 이진 분류 성능 완성하기

Lucas.Kim 2025. 12. 13. 05:35
반응형

앞선 2편에서는 오차행렬(Confusion Matrix)을 기반으로 정밀도(Precision)와 재현율(Recall), 그리고 두 지표 간의 트레이드오프 관계를 살펴보았습니다.
이번 3편에서는 정밀도와 재현율의 한계를 보완하는 F1 Score, 그리고 이진 분류 모델의 전반적인 예측 성능을 평가하는 ROC Curve와 ROC-AUC를 중심으로 이진 분류 평가지표를 정리합니다.

1. F1 Score 이해

(정밀도와 재현율의 맹점을 보완하는 지표)

F1 Score는 정밀도와 재현율을 결합한 평가지표입니다.
정밀도 또는 재현율 중 어느 한쪽으로 극단적으로 치우치지 않을 때 상대적으로 높은 값을 가집니다.

만약 다음과 같은 두 개의 예측 모델이 있다고 가정합니다.

  • A 예측 모델
    • 정밀도: 0.9
    • 재현율: 0.1
  • B 예측 모델
    • 정밀도: 0.5
    • 재현율: 0.5

이 경우 F1 Score는 다음과 같습니다.

  • A 모델의 F1 Score = 0.18
  • B 모델의 F1 Score = 0.5

즉, 정밀도와 재현율 간의 균형이 더 좋은 B 모델이 A 모델보다 훨씬 우수한 F1 Score를 가지게 됩니다.
이처럼 F1 Score는 정밀도와 재현율을 동시에 고려해야 하는 상황에서 매우 유용한 지표입니다.

사이킷런(scikit-learn)에서는 f1_score() 함수를 통해 F1 Score를 간단히 계산할 수 있습니다.

from sklearn.metrics import f1_score

f1 = f1_score(y_test, pred)
print(f"f1 score : {f1}")

2. ROC Curve와 ROC-AUC 이해

ROC Curve와 AUC는 이진 분류 모델의 예측 성능을 평가하는 데 있어 매우 중요한 지표입니다.
의학 분야에서 널리 사용되어 왔으며, 현재는 머신러닝 이진 분류 모델 평가에서도 핵심 지표로 활용됩니다.

2-1. ROC Curve란

ROC Curve는 FPR(False Positive Rate) 이 변할 때
TPR(True Positive Rate, Recall) 이 어떻게 변화하는지를 나타내는 곡선입니다.

  • X축: FPR
  • Y축: TPR

FPR의 변화에 따른 TPR의 변화를 곡선 형태로 표현하며,
곡선이 좌측 상단에 가까울수록 모델의 분류 성능이 우수함을 의미합니다.

2-2. AUC란

AUC(Area Under Curve)는 ROC 곡선 아래의 면적을 의미합니다.
일반적으로 AUC 값은 1에 가까울수록 좋은 분류 성능을 나타냅니다.

3. ROC Curve 계산과 임계값 변화 확인

from sklearn.metrics import roc_curve
import numpy as np

# 클래스 1에 대한 예측 확률만 추출
pred_proba_class1 = lr_clf.predict_proba(X_test)[:, 1]

# ROC Curve 계산
fprs, tprs, thresholds = roc_curve(y_test, pred_proba_class1)

# 임계값 샘플링
thr_index = np.arange(1, thresholds.shape[0], 5)

print(f"임계값 배열 인덱스 : {thr_index}")
print(f"샘플링된 임계값 : {np.round(thresholds[thr_index], 2)}")
print(f"임계값별 FPR : {np.round(fprs[thr_index], 3)}")
print(f"임계값별 TPR : {np.round(tprs[thr_index], 3)}")

4. ROC Curve 시각화

def roc_curve_plot(y_test, pred_proba_c1):
    fprs, tprs, thresholds = roc_curve(y_test, pred_proba_c1)

    plt.plot(fprs, tprs, label="ROC Curve")
    plt.plot([0, 1], [0, 1], 'k--', label="Random Classifier")

    plt.xlabel('FPR (1-Specificity)')
    plt.ylabel('TPR (Recall)')
    plt.legend()
    plt.grid()
    plt.show()

roc_curve_plot(y_test, lr_clf.predict_proba(X_test)[:, 1])

5. ROC-AUC 계산

from sklearn.metrics import roc_auc_score

pred_proba = lr_clf.predict_proba(X_test)[:, 1]
roc_score = roc_auc_score(y_test, pred_proba)

print(f'ROC AUC 값 : {roc_score}')

F1 Score는 정밀도와 재현율 간의 균형을 평가하는 지표이며,
ROC-AUC는 임계값 변화에 관계없이 이진 분류 모델의 전반적인 성능을 판단하는 데 유용한 지표입니다.

이진 분류 문제에서는 단일 지표에 의존하기보다,
정밀도·재현율·F1 Score·ROC-AUC를 함께 해석하는 것이 필수적입니다.

 

반응형