본문으로 건너뛰기

021 분류 평가 지표 - F1 Score, AUC

키워드: F1, AUC, ROC

개요

F1 Score와 AUC는 불균형 데이터에서 특히 중요한 평가 지표입니다. 이 글에서는 두 지표의 개념과 활용법을 깊이 있게 다룹니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: pycaret[full]>=3.0

F1 Score

Precision과 Recall의 조화 평균.

F1 = 2 × (Precision × Recall) / (Precision + Recall)

왜 조화 평균인가?

# 021 산술 평균 vs 조화 평균
precision = 0.9
recall = 0.1

# 021 산술 평균: (0.9 + 0.1) / 2 = 0.5
arithmetic_mean = (precision + recall) / 2

# 021 조화 평균: 2 × 0.9 × 0.1 / (0.9 + 0.1) = 0.18
harmonic_mean = 2 * precision * recall / (precision + recall)

print(f"산술 평균: {arithmetic_mean:.2f}") # 0.50
print(f"조화 평균 (F1): {harmonic_mean:.2f}") # 0.18

# 021 조화 평균은 낮은 값에 민감 → 둘 다 높아야 높은 F1

F1 Score 활용

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

# 021 F1 기준으로 최적 모델 선택
best = compare_models(sort='F1', n_select=1)

results = pull()
print(f"F1 Score: {results['F1'].mean():.4f}")

AUC (Area Under the ROC Curve)

ROC 곡선 아래의 면적으로, 분류기의 전반적인 성능을 측정합니다.

ROC 곡선 이해

  • X축: FPR (False Positive Rate) = FP / (FP + TN)
  • Y축: TPR (True Positive Rate) = Recall = TP / (TP + FN)
from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

model = create_model('rf', verbose=False)

# 021 ROC 곡선 시각화
plot_model(model, plot='auc')

AUC 해석

AUC 값해석
1.0완벽한 분류기
0.9-1.0매우 우수
0.8-0.9우수
0.7-0.8보통
0.5-0.7미흡
0.5무작위 추측 수준
< 0.5무작위보다 나쁨

AUC의 장점

# 021 AUC가 좋은 이유:
# 1. 임계값에 독립적 (모든 임계값에서의 평균 성능)
# 2. 클래스 불균형에 강건
# 3. 확률적 해석 가능: 양성 샘플이 음성보다 높은 점수를 받을 확률

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit') # 불균형 데이터
clf = setup(data, target='default', session_id=42, verbose=False)

# 021 AUC 기준으로 최적 모델
best = compare_models(sort='AUC', n_select=1)

실전 비교: Accuracy vs F1 vs AUC

from pycaret.classification import *
from pycaret.datasets import get_data

# 021 불균형 데이터셋
data = get_data('credit')

# 021 클래스 분포 확인
print(data['default'].value_counts(normalize=True))

clf = setup(data, target='default', session_id=42, verbose=False)

# 021 각 지표별 최적 모델
print("=== Accuracy 기준 ===")
best_acc = compare_models(sort='Accuracy', n_select=1)

print("\n=== F1 기준 ===")
best_f1 = compare_models(sort='F1', n_select=1)

print("\n=== AUC 기준 ===")
best_auc = compare_models(sort='AUC', n_select=1)

PR Curve (Precision-Recall Curve)

불균형 데이터에서 ROC보다 더 informative할 수 있습니다.

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

model = create_model('rf', verbose=False)

# 021 PR 곡선 시각화
plot_model(model, plot='pr')

다중 클래스에서의 AUC

from pycaret.classification import *
from pycaret.datasets import get_data

# 021 다중 분류 데이터
data = get_data('iris')
clf = setup(data, target='species', session_id=42, verbose=False)

model = create_model('rf', verbose=False)

# 021 다중 클래스 AUC (One-vs-Rest 방식)
plot_model(model, plot='auc')

# 021 각 클래스별 AUC가 표시됨

F-beta Score

Precision과 Recall의 가중치를 조절:

F_beta = (1 + β²) × (Precision × Recall) / (β² × Precision + Recall)
  • F1: β=1 (균형)
  • F0.5: Precision 중시 (β=0.5)
  • F2: Recall 중시 (β=2)
from sklearn.metrics import fbeta_score

# 021 PyCaret에서는 기본적으로 F1만 제공
# 021 커스텀 지표가 필요하면 sklearn 사용

y_true = [1, 0, 1, 1, 0, 1]
y_pred = [1, 0, 1, 0, 0, 1]

f1 = fbeta_score(y_true, y_pred, beta=1)
f05 = fbeta_score(y_true, y_pred, beta=0.5)
f2 = fbeta_score(y_true, y_pred, beta=2)

print(f"F1: {f1:.4f}")
print(f"F0.5 (Precision 중시): {f05:.4f}")
print(f"F2 (Recall 중시): {f2:.4f}")

지표 선택 가이드

상황추천 지표
균형 데이터, 단순 비교Accuracy
불균형 데이터, 전반적 성능AUC
불균형 데이터, Precision/Recall 균형F1
양성이 매우 희소PR-AUC
임계값 결정 필요ROC 곡선 분석

정리

  • F1 Score: Precision과 Recall의 조화 평균
  • AUC: ROC 곡선 아래 면적, 임계값 독립적
  • 불균형 데이터에서는 Accuracy 대신 F1/AUC 사용
  • AUC 0.8 이상이면 대체로 좋은 모델
  • 비즈니스 맥락에 따라 지표 선택

다음 글 예고

다음 글에서는 혼동 행렬 해석하기를 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #021