다중 클래스 분류 문제(예: 클래스가 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')
'AI & Data Analysis > Deep Learning' 카테고리의 다른 글
| [Survey] Methods to Reduce Cell Count (2) | 2025.08.14 |
|---|---|
| [ScRAT] SPILT Dataset Results (4) | 2025.08.08 |
| [ScRAT] sampling() function process (1) | 2025.08.07 |
| scRNA-seq Analysis Insight (0) | 2025.08.05 |
| [AMIL] Cell Type Annotation Procedure (COVID, Cardio, Parkinson) (0) | 2025.07.30 |