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