본문 바로가기
AI & Data Analysis/Deep Learning

[Multi-Class Classification] recall, precision, auc

by doraemin_dev 2025. 8. 8.

다중 클래스 분류 문제(예: 클래스가 3개인 경우)에서 recall, precision, auc 값을 어떻게 계산하는가?


🔸 코드 설명

from sklearn.metrics import confusion_matrix, recall_score, precision_score

cm = confusion_matrix(true, pred)
recall = recall_score(true, pred, average='macro')
precision = precision_score(true, pred, average='macro')
  • true : 실제 정답 레이블 리스트 (예: [0, 1, 2, 1, 0])
  • pred : 모델이 예측한 레이블 리스트 (예: [0, 2, 1, 1, 0])

🔹 confusion_matrix(true, pred)

다중 클래스일 경우 confusion matrix는 (n_classes, n_classes) 크기의 행렬이 됩니다.

예: 클래스가 3개일 경우 (클래스: 0, 1, 2)

            Predicted
           0    1    2
Actual 0  [30   2    3]
       1  [ 1  28    1]
       2  [ 0   3   27]
  • (i, j) 위치는 "실제 클래스 i인데, 예측 클래스가 j인" 샘플 수입니다.

🔹 recall_score(true, pred, average='macro')

recall_score은 다음과 같이 계산됩니다:

  • average='macro' → 클래스별 recall을 각각 계산한 후 평균을 냅니다.

$\text{Recall}_{\text{macro}} = \frac{1}{C} \sum_{i=1}^{C} \frac{TP_i}{TP_i + FN_i}$

  • $ TP_i $ : 클래스 i로 정확히 예측한 수
  • $ FN_i $ : 클래스 i인데 다른 클래스로 잘못 예측된 수
  • $C$: 클래스 개수

→ 즉, 각 클래스에 대해 recall을 구한 뒤 단순 평균을 내는 방식입니다.


🔹 precision_score(true, pred, average='macro')

precision_score도 마찬가지로 클래스별 precision을 구한 뒤 평균을 냅니다.

$\text{Precision}_{macro} = \frac{1}{C} \sum_{i=1}^{C} \frac{TP_i}{TP_i + FP_i}$

  • $FP_i$ : 클래스 i로 잘못 예측한 수

🔹 그럼 AUC는 어떻게?

AUC는 보통 이진 분류에서 사용하는 지표지만, 다중 클래스 문제에서는 다음 중 한 가지 방식으로 확장합니다:

1. average='macro' 또는 'weighted' 사용

from sklearn.metrics import roc_auc_score

auc = roc_auc_score(y_true, y_score, multi_class='ovr', average='macro')
  • y_score: 클래스마다의 확률 분포 또는 점수 (softmax 결과) 필요
    • 예: shape = (n_samples, n_classes)
  • multi_class='ovr': One-vs-Rest 방식으로 각 클래스를 기준으로 이진 분류처럼 AUC를 계산한 후 평균

🔸 요약

항목 방식 요약
Confusion matrix 클래스별 예측 성능 파악
Recall / Precision average='macro' 옵션 사용시 각 클래스별 계산 후 평균
AUC (다중 클래스) 확률값을 기반으로 roc_auc_score() 사용, multi_class='ovr'

✅ 참고 코드 예시 (AUC 포함)

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import label_binarize

# 클래스 수
n_classes = 3
y_true = [0, 2, 1, 2, 0, 1]
y_pred = [0, 1, 1, 2, 0, 2]

# 예측 확률 (예: softmax 출력)
y_prob = [
    [0.9, 0.05, 0.05],
    [0.1, 0.6, 0.3],
    [0.2, 0.5, 0.3],
    [0.1, 0.2, 0.7],
    [0.8, 0.1, 0.1],
    [0.2, 0.3, 0.5],
]

# one-hot encoding of labels
y_true_bin = label_binarize(y_true, classes=[0, 1, 2])

# AUC 계산
auc = roc_auc_score(y_true_bin, y_prob, average='macro', multi_class='ovr')