Nerdy

분류 모델 성능 측정 지표 : 오차행렬, 정확도, 정밀도, 재현율, F-스코어 본문

Python/[Scikit-learn]

분류 모델 성능 측정 지표 : 오차행렬, 정확도, 정밀도, 재현율, F-스코어

뚱인데요? 2022. 7. 2. 15:58
728x90

앞전에는 회귀분석을 통한 예측 모델을 생성한 후 모델 성능을 측청하는 MAE, MSE, MAPE 등 지표들을 알아봤으면 이번 포스팅에서는 분류 모델의 성능 측정하는 방법을 알아볼려고 한다.

 

# 사용 모듈

 

  • 혼동행렬(오차행렬) : confusion matrix
  • 정확도(accuracy) : accuracy_score
  • 정밀도(precision) : precision_score
  • 재현율(recall) : recall_score
  • F1 score : f1_score
  • F beta score : fbeta_score

먼저 실제값과 예측값을 기반으로 confusion matrix를 생성한다.

from sklearn.metrics import confusion_matrix
y_true = [0, 1, 0, 1, 1, 0, 1, 1, 0, 1] # 실제값
y_pred = [0, 1, 0, 0, 1, 0, 1, 0, 0, 1] # 예측값

confusion_matrix(y_true, y_pred)

# array([[4, 0],
#        [2, 4]], dtype=int64)

 

혼동행렬은 이진분류 모델의 성능 지표로 많이 활용되며 실제 클래스와 예측 클래스의 값이 긍정인지(positive) 부정인지(negative) 값의 유형을 나타내는 지표라고 볼 수 있다.

아래 그림을 통해 어떤 유형을 가지고 있는지 확인해보자

출처 : https://rueki.tistory.com/66

 

  • T(True) : 예측값과 실제값이 같은가 / F(False) : 예측값과 실제값이 다른가
  • Positive : 긍정(1) / Negative : 부정(0)
  • True Positive(TP) : 실제 True인 정답을 True라고 예측 (정답)
  • True Negative(TN) : 실제 False인 정답을 False라고 예측 (정답)
  • False Positive(FP) : 실제 False인 정답을 True라고 예측 (오답)
  • False Negative(FN) : 실제 True인 정답을 False라고 예측 (오답)

간단한 예시를 통해 이 표를 쉽게 이해하면 좋을거다.

 

비가 올지 안 올지 몰라서 우산을 챙겨야 하는지 마는지 정해야 하는 상황을 예로 들면 다음과 같이 정리를 한다.

 

  • 비가 온다 : True
  • 비가 안 온다 : False
  • 우산을 챙긴다 : Positive
  • 우산을 안 챙긴다 : Negative

비 유무는 실제 클래스, 우산을 챙기는지 안 챙기는지는 예측 클래스로 분류를 하면 되고 다시 표로 정리하면 다음과 같다.

 

실제 / 예측
우산을  안 챙긴다
Negative (0)

우산을 챙긴다.
Positive (1)

비가 안 온다
(False)

True Negative (TN) False Positive (FP)

비가 온다
(True)

False Negative (FN) True Positive (TP)

 

TN과 TP 값이 높을수록 이상적인 결과라고 볼 수 있으며 TP(True Positive) 비율이 높다는 건 예측을 잘 했다는 걸로 간주할 수 있다.

 

앞에서 만든 오차행렬을 헷갈리지 않게 분류를 해준다.

 

  • TN : 4
  • FP : 0
  • FN : 2
  • TP : 4
  • Total : 10

1. 정확도(accuracy)

정확도는 실제 데이터 중 예측 데이터가 얼마나 같은지를 판단하는 지표다.

하지만 이진분류 모델의 데이터 구성에 따라 성능을 왜곡할 수 있기에 단순히 정확도 결과 하나만을 가지고 성능을 평가하지 않는다. 

· Accuracy = (TN + TP) / Total

from sklearn.metrics import accuracy_score

acc = accuracy_score(y_true, y_pred)
acc # 0.8

2. 정밀도(Precision)

Positive로 예측한 값들 중에 실제로 Positive한 값의 비율이다.(예측값이 얼마나 정확한가)

EX) 암인지 아닌지 예측할 때

· Precision = TP / (TP + FP)

from sklearn.metrics import precision_score

pre = precision_score(y_true, y_pred)
pre # 1.0

3. 재현율(Recall)

실제 값이 Positive인 값들 중에 예측을 Positive로 한 값의 비율이다.(실제 정답을 얼마나 맞췄느냐)

EX) 스팸메일 여부 판단

· Recall = TP / (TP + FN)

from sklearn.metrics import recall_score

recall = recall_score(y_true, y_pred)
recall # 0.6666666666666666

4. F-스코어

F 스코어는 정밀도(Precision)과 재현율(Recall)의 가중조화평균(weight harmonic average)이라고 한다.

정밀도와 재현율 둘 다 모델의 성능을 확인하는데 중요한 지표라고 볼 수 있으며 두개의 지표를 평균값을 통해 하나의 값으로 나타내는 방법이다.

해당 값이 높을 수록 좋은 모델이라고 볼 수 있다.

 

· Fβ = (1+β²)(precision × recall) / ((β² · precision) + recall)

 

가중치, 즉 beta = 1를 넣어주면 F1 스코어 값을 구할 수 있다.

 

· F1 = 2⋅precision⋅recall / (precision+recall)

from sklearn.metrics import f1_score # f1 스코어
f1 = f1_score(y_true, y_pred)
f1 # 0.8

from sklearn.metrics import fbeta_score # fbeta 스코어
fb = fbeta_score(y_true, y_pred, beta = 2)
fb # 0.7142857142857142

 

■ Reference

 

https://gaussian37.github.io/ml-concept-ml-evaluation/#f1-score-1

 

머신러닝에서 사용되는 평가지표

gaussian37's blog

gaussian37.github.io

https://datascienceschool.net/03%20machine%20learning/09.04%20%EB%B6%84%EB%A5%98%20%EC%84%B1%EB%8A%A5%ED%8F%89%EA%B0%80.html

 

5.4 분류 성능평가 — 데이터 사이언스 스쿨

.ipynb .pdf to have style consistency -->

datascienceschool.net

 

 

728x90