본문으로 건너뛰기
김신건의 로그

분류 모델 지표: Confusion Matrix, Precision, Recall, F1

· 수정 · 📖 약 5분 · 1,813자/단어 #ml #evaluation #classification #metrics
classification metrics, confusion matrix, true positive, false positive, true negative, false negative, TP, FP, TN, FN, precision, recall, 정밀도, 재현율, F1 score, F1, F-beta, specificity, sensitivity, ROC curve, AUC, AUC-ROC, AUC-PR, PR curve, MCC, Matthews Correlation Coefficient, Cohen's Kappa

정의

분류 (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 을 최대화하는 식으로 제약 최적화합니다.

참고

이 글의 용어 (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 에 재사용 하여 학습 효율을 높이는 패러다임입니다…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기