본문 바로가기
전산 관련 시험/빅데이터분석기사, AI 용어

머신러닝 분류모델 평가(정밀도, 재현율, f1-score 등)

by 응_비 2023. 1. 10.

* (목표) : 정밀도, 재현율, f1-score 계산 가능하도록 수식 정리 및 암기 

정확도(Accuracy)

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

  • 정확도(Accuracy) = (예측 결과가 동일한 데이터 건수) / (전체 예측 데이터 건수)

정확도는 직관적으로 모델 예측 성능을 나타내는 평가 지표이다. 하지만 이진 분류의 경우 데이터의 구성에 따라 모델 성능을 왜곡할 수 있기 때문에 정확도 수치 하나만 가지고 성능을 평가하지 않는다.

예를 들어 캐글(Kaggle)의 타이타닉(Titanic)데이터 로 비유를 해보겠다.

먼저 성별(Sex)에 따라 남성은 생존할 확률 30% 여성이 생존할 확률 70% 라고 했을때
정확도를 사용하게 무조건 여성이 생존할 확률에 투표를 한다고 해도 70%의 성능이 나오게된다. 이는 바람직하지 않는 지표라는 것을 바로 알 수 있다.

따라서 우리는 이렇게 이진분류인 데이터 특히, 불균형(imbalanced)한 레이블 값 분포의 경우 accuracy로 성능을 확인하는것은 올바르지 않다.

오차행렬(confusion matrix)

이진 분류에서 성능 지표로서 잘 활용되는 오차행렬은 분류 모델이 얼마나 헷갈리고(confused)있는지도 함께 보여주는 지표이다. 즉, 이진 분류에서 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측오류가 발생하고 있는지를 함께 나타내는 지표이다.

분류문제에서는 반드시 confusion matrix를 출력해서 결과를해석하고 설명해야한다.(습관화 하기!!)

이미지 출처: https://rueki.tistory.com/66

위의 그림은 실제 레이블 클래스 값과 예측 레이블 클래스 값이 어떠한 유형을 가지고 매핑이 되는지를 나타내는 표 이다. 실제값이 positive인지 negative인지와 예측값이 positive인지 negative인지를 나태내고 있다.

  • T는 True를 의미하며, F는 False를 의미한다. / True는 예측값과 실제값이 같은것이며, False는 예측값과 실제값이 다름을 의미한다
  • P는 Positive를 의미하며, N은 Negative를 의미한다. /즉, 예측값이 부정(0),긍정(1)을 의미한다.
from sklearn.metrics import confusion_matrix

confusion_matrix(y_test, pred)

정밀도(Precision)와 재현율(Recall)

먼저 앞에서 언급한 정확도를 오차행렬로 표현을 하면  이러한 수식이 된다.

그렇다면 정밀도와 재현율은 어떻게 이루어져 있을까

  • 정밀도(Precision) : Positive로 예측한 경우 중 실제로 Positive인 비율이다, 즉 예측값이 얼마나 정확한가 입니다.: 
  • 재현율(Recall) : 실제 Positive인 것 중 올바르게 Positive를 맞춘 것의 비율 이다다, 즉 실제 정답을 얼마나 맞췄느냐라고 생각하시면 됩니다

출처: https://deepinsight.tistory.com/173 [Steve-Lee's Deep Insight]: , 민감도(Sensitivity) 혹은 TPR(True Positive Rate)이라고도 불린다.

이해를 돕기 위해 예를 들어보았다.

  • 암 검사를 위해 병원을 찾아온 사람에게 암여부를 예측할때에는 재현율이 중요하다, 즉 실제로 암인데 암이 아니라고 예측하면 큰일나기 때문이다.
  • 메일이 왔는데 스팸메일여부를 판단하는 것은 정밀도가 중요하다.

이렇듯 어떤것에 사용하느냐에 따라 달라지며 대부분은 재현율이 더 중요해 많이 사용하고 있다.

그렇다면 정밀도(Precision)과 재현율(Recall)을 구하는 방법을 알아보겠다.

사이킷런은 정밀도 계산을 위해서 precision_score()를, 재현율 계산을 위해 recall_score()를 API로 제공한다.

sklearn.metrics.classification_report 를 사용하면 정밀도, 재현율을 한번에 확인할 수 있다.

from sklearn.metrics import classification_report
print(classification_report(y_val, y_pred))
>>>
              precision    recall  f1-score   support

           0       0.76      0.80      0.78      7680
           1       0.75      0.70      0.72      6372

    accuracy                           0.75     14052
   macro avg       0.75      0.75      0.75     14052
weighted avg       0.75      0.75      0.75     14052

위의 classification_report를 해석해 보겠습니다.
먼저 모델의 정확도(accuracy)는 0.75%로 괜찮은 성능을 가진것을 볼 수있습니다.
하지만 만약 imbalance한 데이터라면 f1-score를 확인해 주어야 합니다.
f1score의 경우 macro avg와 weighted avg 이렇게 두가지가 있습니다.
먼저, macro avg 는 단순평균값이며, weighted avg 는 각 클래스에 속하는 표본의 갯수로 가중평균값을 뜻합니다. 이 둘의f1-score와 accuracy가 차이가 없는것으로 보아 모델은 balance한 모델인것 같고 accuracy로 사용해도 괜찮을것 같습니다.

 

F1-Score

  • F1 Score는 Precision과 Recall의 조화평균으로 주로 분류 클래스 간의 데이터가 불균형이 심각할때 사용한다.
  • 앞에서 배운 정확도의 경우, 데이터 분류 클래스가 균일하지 못하면 머신러닝 성능을 제대로 나타낼 수 없기 때문에 F1 Score를 사용한다.
  • F1 Score는 정밀도와 재현율의 조화평균이다.
  • 높을수록 좋은 모델이다.
from sklearn.metrics import f1_score
pred = pipe.predict(X_test)
f1 = f1_score(y_test, pred)

댓글