본문 바로가기

머신러닝

머신러닝 이진분류의 Evaluation 평가에 대해 알아보자(Accuracy, Precision, Recall, F1_Score, ROC_AUC)

머신러닝의 이진분류의 평가는 정확도, 오차행렬, 정밀도, 재현율, F1_스코어, ROC_AUC 로 할 수 있다. 이 평가들은 다른 지표에서도 이용 가능 하지만 특히나 영향력을 발휘하는 평가 지표 들이다. 그러면 하나 하나에 대해 자세히 알아보고자 한다.

 

1. Accuracy(정확도)

정확도는 전체 데이터에서 예측 결과가 동일한 데이터의 건수의 퍼센트를 나타낸다.

만일 전체 실제 데이터는 [1, 1, 0, 0, 0]이고 

실제 데이터는 [1, 1, 1, 0, 0] 이면 가운데 1이 틀리게 예측되었다. 이럴 때 정확도는 0.8이다. 아주 직관적이고 편리한 방법이다. 하지만 데이터가 어떻게 구성되있냐에 따라 우연적으로 accuracy 가 아주 좋게 나올 수 도 있고 아닐 수도 있기 때문에 이것만 가지고 수치를 평가하는 것은 어리석은 행동이다.

사이킷런에서는 accuracy_score 를 제공하여서 accuracy를 측정하게 하고 있다.

accuracy_score(${진짜 데이터}, ${예측 데이처}) 를 넣으면 accuracy를 측정해준다. 상세한 내용은 밑에 있다.

scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html

 

sklearn.metrics.accuracy_score — scikit-learn 0.24.1 documentation

 

scikit-learn.org

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

정밀도와 재현율을 같이 따라다니면서 평가하는 지표이다. 사실 책을 보면서 공식을 이해하는데 힘들었는데 핸즈온머신러닝의 그림을 보고 바로 이해하게 되었다. 글로만 학습하지 말고 그림으로 학습해보자

위에는 숫자로 5로 예측하는 mnist 분류이다. 여러가지 숫자가 있을 때 5가 있는지 예측을 해본다.

TN은True Negative 로 진짜 아님 이다. 위에 있는 숫자들은 머신러닝에서 5라고 학습되지 않닸다.

TP는 True Positive로 진짜 예측맞음 이다. 위에 보면 TP는 5로 예측이 잘 된 데이터이다.

FP는 가짜로 예측맞음 이다. 위에 보면 6이 5로 학습이 되었다. 그러면 이 학습은 잘못 된 것이다.

FN는 가짜 아님 이다.  사실 5인데 5가 아닌 것으로 학습이 되었다.

 

정밀도는 위에 그림에서 보다 시피 오른쪽의 FP와 TP를 합한 것에서 진짜 예측 맞음이 몇 퍼센트인지 보는 것이고

재현율은 위에 그림에서 밑에 FN과 TP를 합친 것에서 진짜 예측 맞음이 얼마나 있는지 파악하는 것이다.

 

정밀도는 주로 스팸 메일의 판단 여부에서 중요하다고 소개되고 있다. 만약 스팸메일인지 아닌지 판단하는 모델이 있다고 가정한다. 위에 FP는 스팸메일이 아님에도 불구하고 스팸메일로 분류가 되어버린 가짜로 예측맞음이기 때문에 사용자는 필요한 메일을 못받는 경우가 발생한다.

 

재현율은 보험 사기와 같은 금융 사기 모델에서 적합하다고 소개된다. 만약 금융사기인지 아닌지 판단하는 모델이 있을 때 금융사기인 것을 금융사기가 아니라고 예측해버리면 사람들은 사기를 당하게 된다. 

 

보통 정밀도 보다는 재현율의 중요성이 더 크긴 하지만 상황에 따라 다르기 때문에 모델을 만들기 전에 한번 생각해봐야 할 것이다.

 

정밀도/재현율 트레이드 오프

분류 학습을 할 때 업무의 특성상 정밀도, 재현율이 강조되야 할 때가 있다. 그때는 분류의 Threshold를 조정하여서 두개의 수치를 각각 높일 수 있다. 하지만 두 가지는 상호 보완적인 지표여서 정밀도를 높이면 재현율이 떨어지게 되고 재현율을 높이면 정밀도가 떨어지게 된다. 이것은 정밀도/재현율의 Trade-off 라고 한다. 

 

밑에는 정밀도와 재현율의 사이킷런 라이브러리 소개 페이지이다.

scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html

 

sklearn.metrics.precision_score — scikit-learn 0.24.1 documentation

 

scikit-learn.org

 

scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html

 

sklearn.metrics.recall_score — scikit-learn 0.24.1 documentation

 

scikit-learn.org

3. F1-score (F1 스코어)

 

F1스코어는 정밀도와 재현율을 결합하여서 만든 지표이다.

아까 정밀도와 재현율에서 말했다 시피 정밀도와 재현율은 서로 한쪽으로 값이 치우치지 않고 둘이 비슷할 때 좋다. f1 스코어는 이런 정밀도와 재현율의 비율을 결합해서 만든 것이다. 

 

만약 정밀도가 1이고 재현율이 0.2라고 가정을 한다. 그러면 위에 식중 가운데 것에 대입을 해보면 정밀도는 1/1이기 때문에 1이 외버리고 재현율은 1/0.2이기 때문에 5가 되버린린다. 그러면 총 6이 되고 2/6은 1/3이 된다.

정밀도가 0.5이고 재현율이 0.5라고 가정을 한다면 위에 식에서 정밀도는 1/0.5이기 때문에 2가 되고 재현율도 비율이 같기 때문에 2가 된다. 그러므로 총 2/4 곧 1/2가 나온다.

 

여기서 알 수 있는 것은 무엇일까? 재현율과 정밀도의 차이가 크지 않을수록 F1 스코어는 높게 나온다. 그래서 F1스코어가 높게 나올 수록 정밀도와 재현율이 한쪽으로 치우쳐져 있지 않다고 볼 수 있다.

 

scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html

 

sklearn.metrics.f1_score — scikit-learn 0.24.1 documentation

 

scikit-learn.org

4. ROC_AUC

용어설명

FPR(FalsePositive Rate)FPR = FP/FP+TN  , (1-TNR)

TPR(True Positive Rate) 한국어로 재현율, 민감도 (TPR = TP/TP+FN)

TNR(True Negative Rate) 한국어로 특이성, (TNR = TN/FP+TN)

ROC곡선과 AUC스코어는 이진 분류의 예측 성능에서 중요하게 사용된다. ROC 곡선은 영어로 Receiver operation Characteristic Curve 인데 한국어로 수신자 판단 곡선이다. 예전 2차 대전에서 통신 장비 성능 평가를 위해 만들어진 수치여서 이름이 이렇다고 한다. ROC곡선은 FPR(FalsePositive Rate) 를 X축으로 하고 TPR(True Positive Rate)을 Y 축으로 한다. 그래서 FPR에 변화에 따른 TPR 의 변화가 곡선으로 나타난다.  

여기서 파란색은 ROC 곡선의 최저 값이다. ROC 곡선이 파란색 가운데에 가까워 질 수록 성능이 좋지 않다고 한다. 

AUC의 값은 ROC 곡선 밑의 면적을 구한 것으로 면적이 넓을수록, 1에 가까울수록 좋은 수치이다. AUC 수치가 커지려면 FPR이 얼마나 작은 상태에서 얼마나 큰 TPR을 얻을 수 있느냐가 중요하다.

scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html

 

sklearn.metrics.roc_auc_score — scikit-learn 0.24.1 documentation

 

scikit-learn.org