딥러닝, 논문 리뷰

[딥러닝] 분류모델 성능 평가지표

cheorish 2024. 12. 12. 18:51

성능 평가지표란?

  • 우리가 직접 만든 모델(분류, 회귀 등)의 성능이 얼만큼의 신뢰도가 있는지 평가하기 위한 수치적 척도라고 생각하면 된다
  • 보통은 Machine Learning에서의 평가지표로 활용되지만, 딥러닝 모델에서도 충분히 활용 가능하다

우리가 오늘 정리할 모델의 성능 평가지표는, 분류 모델 성능 평가지표이다.

  • 종류는?
  • Confusion Matrix를 기반으로 Accuracy, Precision, Recall, F1_score등이 존재한다.

Confusion Matrix(혼동 행렬, 오차 행렬)

언어별 컨퓨전 매트릭스 해석 차이(Python, R) / 실제 범주와 예측 범주가 서로 다르다!

각 지표간 정의

  • \(TP\) : 실제 값이 \(Positive\)이고, 모델 값이 \(Positive\)로 예측한 경우
  • \(FP\) : 실제 값이 \(Negative\)이지만, 모델 값이 \(Positive\)로 잘못 예측한 경우
  • \(FN\) : 실제 값이 \(Positive\)이지만, 모델 값이 \(Negative\)로 잘못 예측한 경우
  • \(TN\) : 실제 값이 \(Negative\)이고, 모델 값이 \(Negative\)로 예측한 경우

ex)

  • \(TP\)
    • 실제로 암 환자가 암에 걸렸음\(P\)
    • 암 분류 모델이 환자가 암에 걸렸다고 예측함\(P\)
  • \(FP\)
    • 실제로는 정상 메일로 왔으나\(F\)
    • 스팸메일 분류 모델이 이 메일을 스팸으로 잘못 분류함\(P\)
  • \(FN\)
    • 실제로는 환자가 코로나 감염인 상태\(P\)
    • 코로나 감염 분류 모델은 환자가 감염되지 않았다고 예측함\(F\)
  • \(TN\)
    • 실제로 사기 거래가 아님\(F\)
    • 신용카드 사기 거래 감지 모델이 정상 거래라고 예측\(F\)

Accuracy Score(정확도)

정확도란?

  • 분류 모델이 전체적으로 학습한 데이터에 대해 예측한 정답값을 비교하였을 때 정답을 맞춘 비율이다.
    • 그렇지만 클래스 불균형 발생시, Positive : Negative → 9 : 1 같은 경우에는 정확도만으로 제대로 분류할 수 있는지에 대해서 판단하기 어려운 문제가 있기에 추가적인 평가가 필요하다(Recall, Precision)
  • 0~1 사이의 값을 가지며 1에 가까울 수록 좋은 값이다

계산식

$$
\text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}
$$


Precision(정밀도)

정밀도란?

  • 모델이 Positive라고 예측한 결과 값중에 실제로 정답이 Positive인 비율이다 쉽게 설명해서 모델이 실제로 적중한 값을 맞추는 정확도를 판별하기 위한 값이라고 생각하면 된다.
    • 실제 정답이 Negative인 데이터를 Positive라고 잘못 예측하면 안 되는 경우에 필요한 지표,
    • 정밀도를 높이기 위해선 FP값을 낮추는 것이 가장 중요
  • 0~1 사이의 값을 가지며 1에 가까울 수록 좋은 값이다

계산식

$$
\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}
$$


Recall(재현율)

  • 모델이 Positive라고 예측한 결과 값중에 실제로 정답이 Positive인 비율이다
    • 실제 정답이 Positive인 데이터를 Negative라고 잘못 예측하면 안 되는 경우에 필요한 지표,
    • 재현율을 높이기 위해서 FN값을 낮추는 것이 중요

계산식

$$
\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}
$$


F1 score

  • 정밀도재현율의 조화평균을 계산하여 평가하느 지표, 정밀도와 재현율의 균형을 고려하는데 사용하고, 보통 데이터의 불균형할 때도 성능을 적절히 평가할 수 있음.

특이점

  1. 균형강조 : 정밀도와 재현율 사이의 균형을 파악하여 조정하게끔 함
  2. 불균형 데이터에 특화 : 클래스 불균형시 유용함

계산식

$$
F1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}
$$

F1-Score의 평가 종류(Micro, Macro, Weighted)

  • 상기 설명한 F1-Score는 결국 다중 클래스 분류 평가에는 적합하지 않아 다른 계산방식을 써야한다.
  1. Micro F1-Score
  • 모든 클래스의 \(TP\), \(FP\), \(FN\)을 합산하여 계산.

$$
\text{Micro F1} = \frac{2 \cdot \text{Micro Precision} \cdot \text{Micro Recall}}{\text{Micro Precision} + \text{Micro Recall}}
$$

  1. Macro F1-Score
  • 각 클래스의 F1-Score를 계산한 후, 평균을 구함.

$$
\text{Macro F1} = \frac{\sum_{i=1}^{n} F1_i}{n}
$$

  1. Weighted F1-Score
  • 각 클래스의 F1-Score를 계산한 후, 클래스의 샘플 수에 비례한 가중 평균을 구함.

$$
\text{Weighted F1} = \frac{\sum_{i=1}^{n} w_i \cdot F1_i}{\sum_{i=1}^{n} w_i}
$$

  • \(w_i\): 클래스 \(i\)의 샘플 비율.

🚀 ROC Curve

  • 모델의 TPR(재현율)FPR간의 관계를 곡선으로 나타내는 지표

계산식

$$
\text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}}
$$

$$
\text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}}
$$

특이점

  1. 곡선 아래 면적(AUC)이 클수록 모델 성능이 우수함(쉽게 말해서 곡선이 왼쪽 상단으로 치우치는 그림일수록)
  2. 완벽한 모델의 AUC 값은 1이고, 랜덤 모델의 AUC 값은 0.5

그래프

출처 : https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-classification-in-python/ https://www.evidentlyai.com/classification-metrics/explain-roc-curve

예시코드

# roc curve and auc
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score

# generate 2 class dataset
X, y = make_classification(n_samples=1000, n_classes=2, random_state=1)
# split into train/test sets
trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2)
# generate a no skill prediction (majority class)
ns_probs = [0 for _ in range(len(testy))]
# fit a model
model = LogisticRegression(solver='lbfgs')
model.fit(trainX, trainy)
# predict probabilities
lr_probs = model.predict_proba(testX)
# keep probabilities for the positive outcome only
lr_probs = lr_probs[:, 1]
# calculate scores
ns_auc = roc_auc_score(testy, ns_probs)
lr_auc = roc_auc_score(testy, lr_probs)
# summarize scores
print('No Skill: ROC AUC=%.3f' % (ns_auc))
print('Logistic: ROC AUC=%.3f' % (lr_auc))
# calculate roc curves
ns_fpr, ns_tpr, _ = roc_curve(testy, ns_probs)
lr_fpr, lr_tpr, _ = roc_curve(testy, lr_probs)
# plot the roc curve for the model
plt.plot(ns_fpr, ns_tpr, linestyle='--', label='No Skill')
plt.plot(lr_fpr, lr_tpr, marker='.', label='Logistic')
# axis labels
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
# show the legend
plt.legend()
# show the plot
plt.show()

Specificity (특이도)

  • 실제 Negative한 값 중에서 모데링 Negative로 정확히 예측한 비율

수식

$$
\text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}}
$$


Matthews Correlation Coefficient (MCC)

  • 이진 분류 모델의 성능을 하나의 값으로 요약하는 지표.

수식

$$
\text{MCC} = \frac{\text{TP} \cdot \text{TN} - \text{FP} \cdot \text{FN}}{\sqrt{(\text{TP} + \text{FP})(\text{TP} + \text{FN})(\text{TN} + \text{FP})(\text{TN} + \text{FN})}}
$$

  • \(MCC = 1\): 완벽한 모델.
  • \(MCC = 0\): 랜덤 예측.
  • \(MCC = -1\): 완전히 잘못된 모델.

Balanced Accuracy (균형 정확도)

  • 클래스 불균형 데이터에서 정확도를 조정하여 사용.

수식:

$$
\text{Balanced Accuracy} = \frac{\text{Sensitivity} + \text{Specificity}}{2}
$$


Cohen’s Kappa

  • 모델이 랜덤하게 예측할 확률과 실제 예측의 일치도를 측정.

수식

$$
\kappa = \frac{p_o - p_e}{1 - p_e}
$$

  • \(p_o\): 관찰된 정확도(Observed Accuracy).
  • \(p_e\): 랜덤하게 맞출 확률(Expected Accuracy).

결론

모델 평가 지표 선택 기준

  1. 데이터 균형
  • 데이터가 균형적일 때:
    • Accuracy, F1-Score, ROC-AUC.
  • 데이터가 불균형할 때:
    • Precision, Recall, MCC.
  1. 문제 유형
  • \(FP\)보다 \(FN\)이 중요한 문제(예: 암 진단):
    • Recall, F1-Score.
  • \(FN\)보다 \(FP\)가 중요한 문제(예: 스팸 필터링):
    • Precision, Specificity.