분류 모델 지표: Confusion Matrix, Precision, Recall, F1
정의
분류 (classification) 모델의 성능을 정량화하는 지표들입니다. 이진 분류를 기준으로 하며, multi-class 로 확장하는 방법도 함께 다룹니다. 핵심 출발점은 Confusion Matrix 이고, 여기서 accuracy, precision, recall, F1, ROC/PR 등 모든 지표가 유도됩니다.
Confusion Matrix
이진 분류의 예측 결과를 2x2 표로 정리한 것입니다. 스팸 필터를 예로 들면:
| 예측: Positive (스팸) | 예측: Negative (정상) | |
|---|---|---|
| 실제: Positive (스팸) | TP (True Positive) | FN (False Negative) |
| 실제: Negative (정상) | FP (False Positive) | TN (True Negative) |
- TP (True Positive): 스팸을 스팸이라고 맞춘 경우
- TN (True Negative): 정상을 정상이라고 맞춘 경우
- FP (False Positive): 정상을 스팸이라고 잘못 예측 (Type I error)
- FN (False Negative): 스팸을 정상이라고 놓친 경우 (Type II error)
TIP
First letter (T/F) 은 예측이 맞았는가 (True/False), second letter (P/N) 은 모델이 무엇으로 예측했는가 (Positive/Negative) 입니다. “FP = 모델은 Positive 라고 예측, 실제는 반대라 False” 로 읽으면 헷갈리지 않습니다.
기본 지표
Accuracy
전체 예측 중 맞은 비율. 직관적이지만 class imbalance 에 취약합니다. 99% 정상 메일 데이터에서 “모두 정상” 이라고 예측해도 accuracy 99% 가 나옵니다.
Precision (정밀도)
모델이 Positive 라고 예측한 것 중 실제로 Positive 인 비율. “모델이 Positive 라고 외칠 때 얼마나 믿을 만한가?”
- 스팸 필터: precision 낮으면 정상 메일이 스팸함으로 감 → 사용자 불만
- 추천 시스템: precision 낮으면 관심 없는 상품 추천 → 이탈
Recall (재현율, Sensitivity, TPR)
실제 Positive 중 모델이 맞춘 비율. “진짜 Positive 를 얼마나 놓치지 않고 잡았는가?”
- 암 진단: recall 낮으면 환자를 놓침 → 치명적
- 이상 거래 탐지: recall 낮으면 사기를 놓침 → 손실
Specificity (TNR)
실제 Negative 중 Negative 로 맞춘 비율. 의료 통계에서 자주 쓰이며 ROC 곡선의 x 축을 구성합니다.
Precision vs Recall 트레이드오프
두 지표는 대체로 상충됩니다. 이유는 대부분의 확률 모델이 임계값 (threshold) 에 따라 결정을 내리기 때문입니다. Threshold 를 낮추면 (더 많이 Positive 로 예측):
- Recall ↑ (놓치는 것 감소)
- Precision ↓ (틀린 Positive 증가)
반대로 threshold 를 높이면:
- Precision ↑ (확신 있을 때만 Positive)
- Recall ↓ (놓치는 것 증가)
어느 쪽을 우선할지는 도메인 비용 함수 에 따라 다릅니다.
| 상황 | 우선 지표 | 이유 |
|---|---|---|
| 스팸 필터 | Precision | 정상 메일 놓치는 비용 큼 |
| 추천 시스템 | Precision | 관심 없는 추천은 사용자 피로 |
| 암 진단 스크리닝 | Recall | 놓치는 비용 (사망) 극심 |
| 사기 탐지 | Recall | 놓친 사기의 손실 큼 |
| 검색 랭킹 | Precision@K | 상위 K 개만 노출됨 |
F1 Score
Precision 과 Recall 의 조화 평균 (harmonic mean):
F_1 = 2 \cdot \frac\{\text{Precision} \cdot \text{Recall}\}\{\text{Precision} + \text{Recall}\}산술 평균 대신 조화 평균을 쓰는 이유는 한쪽이 극단적으로 낮을 때 벌점을 주기 위함 입니다. Precision=1.0, Recall=0.01 이면 산술 평균은 0.505 지만 F1 은 0.0198 로 곤두박질칩니다.
F-beta
Precision 과 Recall 을 다른 비중으로 가중:
- → F1 (동일 가중)
- → F2 (recall 을 2 배 중시)
- → F0.5 (precision 을 2 배 중시)
는 “recall 을 precision 대비 몇 배로 중요하게 보는가” 의 계수입니다.
ROC 곡선과 AUC
ROC (Receiver Operating Characteristic) 곡선: 다양한 threshold 에서 (FPR, TPR) 을 그린 곡선.
- x축: FPR (False Positive Rate) = FP / (FP + TN) = 1 - Specificity
- y축: TPR (True Positive Rate) = Recall
AUC-ROC 는 이 곡선 아래 면적입니다. 0.5 는 random, 1.0 은 완벽. 직관적 해석: 랜덤한 positive 샘플과 negative 샘플을 뽑았을 때, positive 샘플의 점수가 더 높을 확률.
ROC 의 한계, 극심한 imbalance
Negative 가 압도적으로 많을 때 (예: 사기 거래 1% vs 정상 99%), FPR 이 0.01 만 되어도 절대 개수로는 엄청난 오탐입니다. 그러나 ROC 곡선은 FPR 을 %로 표현하므로 오탐의 심각성이 시각적으로 감춰집니다.
PR 곡선과 AUC-PR
Precision-Recall 곡선: threshold 별 (Recall, Precision) 을 그린 곡선.
AUC-PR 은 그 아래 면적이며, imbalanced dataset 에서 ROC 보다 정보량이 많습니다 (Saito & Rehmsmeier, 2015).
경험칙:
- 양쪽 클래스가 비슷하게 있음 → ROC/AUC 로 충분
- Positive 가 희소함 (예: <10%) → PR 곡선 / AUC-PR 을 우선
Multi-class 확장
이진의 precision/recall/F1 을 여러 클래스로 확장할 때 세 가지 평균 방식이 있습니다.
Macro-average
각 클래스별 지표를 구한 뒤 단순 평균:
- 각 클래스를 동등하게 취급
- 소수 클래스도 존중 하고 싶을 때 적합
Micro-average
모든 클래스의 TP/FP/FN 을 먼저 합산하고 지표 계산:
- 전체 샘플을 동등하게 취급 (샘플 많은 클래스가 지배)
- Micro-F1 은 multi-class accuracy 와 같아집니다
Weighted-average
각 클래스의 support (샘플 수) 로 가중 평균:
- 실제 분포를 반영
- 다수 클래스가 편중된 경우 macro 대신 자주 쓰임
기타 지표
Cohen’s Kappa
우연히 맞을 확률을 보정한 accuracy:
는 실제 관측 accuracy, 는 우연히 일치할 기대 확률. 클래스가 매우 불균형할 때 raw accuracy 보다 신뢰할 만합니다.
Matthews Correlation Coefficient (MCC)
-1 (완전 반대) ~ 0 (random) ~ 1 (완벽). Confusion Matrix 네 셀 모두를 반영하며, Chicco & Jurman 2020 은 이진 분류에서 F1/accuracy 보다 MCC 를 권장합니다.
Log Loss / Cross-Entropy
확률 출력에 대한 지표:
- 예측 확률이 실제 클래스에서 얼마나 벗어났는지 측정
- Calibration (예측 확률이 실제 빈도와 일치하는가) 를 평가할 때 함께 사용
scikit-learn 실전 코드
from sklearn.metrics import (
confusion_matrix,
classification_report,
roc_auc_score,
precision_recall_curve,
matthews_corrcoef,
)
# Confusion matrix
cm = confusion_matrix(y_true, y_pred)
# 종합 리포트 (precision, recall, F1, support 를 각 클래스별로)
print(classification_report(y_true, y_pred, digits=4))
# 확률 기반 지표 (y_proba 는 positive class 확률)
auc_roc = roc_auc_score(y_true, y_proba)
precision, recall, thresholds = precision_recall_curve(y_true, y_proba)
# MCC
mcc = matthews_corrcoef(y_true, y_pred)
threshold 튜닝
기본 threshold 0.5 를 그대로 쓰면 안 됩니다. 도메인 비용에 맞춰 조정:
from sklearn.metrics import f1_score
import numpy as np
thresholds = np.linspace(0, 1, 101)
f1s = [f1_score(y_true, y_proba > t) for t in thresholds]
best_t = thresholds[np.argmax(f1s)]
또는 precision 을 최소 몇% 이상 유지하는 조건 아래에서 recall 을 최대화하는 식으로 제약 최적화합니다.
참고
- Federated Learning 에서도 동일 지표를 클라이언트별로 계산합니다.
- Transfer Learning downstream 평가에 대부분 이 지표들을 씁니다.
- SageMaker Model Monitor 의 Model Quality Monitor 가 이 지표들을 모니터링합니다.
- HELM 의 accuracy 축은 여기서 확장된 형태입니다.
- Wikipedia: Precision and recall, Receiver operating characteristic
이 글의 용어 (4개)
- [AWS SageMaker] Model Monitor: 모델 및 데이터 드리프트 감지ml
- [!WARNING] AWS 공식 발표 (2026): 2026-07-30 부터 SageMaker Model Monitor 는 신규 고객 사용이 중단됩니다. 기존 사용 고객은 계속 …
- [LLM Eval] HELM: Holistic Evaluation of Language Modelsai
- 정의 HELM (Holistic Evaluation of Language Models) 는 Stanford CRFM (Center for Research on Foundation…
- Federated Learning: 분산 학습 without central dataml
- 정의 Federated Learning (FL) 은 데이터를 중앙에 모으지 않고 각 클라이언트 (edge device, 병원, 은행 등) 가 로컬 데이터로 모델을 학습한 뒤 모델…
- Transfer Learning: pre-training, fine-tuning, domain adaptationml
- 정의 Transfer Learning 은 source task/domain 에서 학습한 지식을 target task/domain 에 재사용 하여 학습 효율을 높이는 패러다임입니다…
이 개념을 다룬 위키 페이지 (6)
- wiki[LLM Eval] HELM: Holistic Evaluation of Language Models
- wiki사칙연산 (Arithmetic Operations)
- wikiDifferential Privacy: (ε, δ) 로 정량화하는 프라이버시 보장
- wikiFederated Learning: 분산 학습 without central data
- wiki[AWS SageMaker] Model Monitor: 모델 및 데이터 드리프트 감지
- wikiTransfer Learning: pre-training, fine-tuning, domain adaptation
💬 댓글