목차
1. 오차행렬(confusion matrix)
2. 정밀도(precision)와 재현율(recall)
3. 임계값(threshold)에 따른 정밀도 재현율의 Trade-Off
4. ROC/AUC
극강의 헷갈림, 분류 모델의 평가지표인 정밀도와 재현율에 대해 알아보도록 하겠습니다. 정밀도와 재현율에 대해 이해하려면 먼저 오차행렬(confusion matrix)에 대해 알아야 합니다.
오차행렬을 통해 이진분류 모델이 수행한 예측 중 오류가 몇 개인지, 어떤 유형의 오류가 발생했는지를 확인할 수 있습니다. 위 사진을 보면 오차행렬이 TN, TP, FN, FP 4가지로 구성된 것을 알 수 있습니다. 두 번째 알파벳(Positive/Negative)이 모델이 예측한 값, 첫 번째 알파벳(True/False)을 통해 예측한 것이 맞았는지 틀렸는지 알 수 있습니다. 가령 TN 은 모델이 Negative로 예측했고 실제로 Negative였다는 뜻입니다.
여기서 예측의 오류가 두 종류라는 것을 알 수 있습니다.
FN : 음성(Negative)이라고 예측했지만 실제는 양성(Positive)인 경우FP : 양성(Positive)이라고 예측했지만 실제는 음성(Negative)인 경우
흔히 모델의 평가 지표로 정확도(accuracy)를 사용합니다. 정확도란 모델이 예측한 결과 중 실제로 맞춘 결과의 비율입니다(정답률).식으로 표현하자면 ( TP+TN / TP+TN+FP+FN ) 입니다. 하지만 정확도만으로 이진 분류모델을 평가하기엔 생각해봐야 할 점이 있습니다.
보험 사기에 대한 데이터가 있다고 합시다. 보험 사기에 대한 비율이 전체 데이터에서 차지하는 비중은 낮을 것입니다. 보험사기인 경우를 1 (positive), 정상적인 경우를 0(negative)라고 하고, 1의 비율이 전체 데이터의 20%, 0인 경우가 80%이라고 가정합시다. 이런 상황에서 모델은 negative로만 예측하여 정확도를 높이는 경향이 있습니다.
쉽게 말해 별도의 과정 없이 모든 데이터가 negative라고만 찍어도 80%라는 정확도를 얻을 수 있습니다. 이렇게 얻어진 정확도는 아무리 높을지라도 모델을 성능을 평가하기에 적절한 방법은 아닙니다. 따라서 불균형 데이터의 이진분류모델(대부분의 분류 문제가 그렇듯) 에서는 정밀도와 재현율이 선호됩니다.
: positive라고 예측한 것 중 실제 positive인 수의 비율
: 실제 positive 중에서 positive라고 예측한 수의 비율
언뜻 보기에 두 개가 무슨 차이인지 잘 모를 수 있습니다. 두 평가지표 간에 공통점과 차이점을 통해 비교 해보겠습니다.
공통점
식에서 알 수 있듯이, 두 평가지표가 높은 점수를 받으려면 TP가 높아야 합니다. 즉 positive라고 예측한 것이 실제로 positive인 경우가 많아야 합니다.
차이점
두 개의 평가지표가 높은 점수를 받는 방법은 한 가지가 더있는데, 분모에 있는 FP와 FN의 오류를 줄이는 것입니다. 여기서 두 평가 지표간에 추구하는 바가 다른 것을 알 수 있습니다.
정밀도 : FP(false positive) 낮아야함
FP가 낮아야 한다는 것은 다시말해 실제 negative인 것을 positive라고 예측하는 오류가 적어야 한다는 것입니다.
재현율 : FN(false negative) 낮아야함
FN이 낮아야 한다는 것은 다시말해 실제 positive인 것을 negative라고 예측하는 오류가 적어야 한다는 것입니다.
정밀도가 높아야하는 경우는 스팸 메일을 탐지하는 경우를 예로 들 수 있습니다. 정상적인 메일(negative)을 스팸메일(positive)로 잘 못 예측하는 경우 중요한 메일을 놓치는 불상사가 생길 수 있습니다. 반대로 스팸메일을 정상적인 메일로 분류할 경우 사용자가 약간의 불편을 느끼고 큰 영향은 없습니다.
재현율이 높아야 하는 경우는 암 진단을 들 수 있습니다. 암(positive)인 사람을 정상(negative)라고 잘 못 예측 하는 경우, 사전에 치료를 받지 못해 건강이 악화되는 치명적인 결과가 생길 수 있습니다. 반대로 정상인 사람을 암이라고 잘 못 예측 하는 경우 병원에 가서 검사를 받아봐야하는 약간의 불편함이 생깁니다.
이처럼 오류의 종류에 따라 그리고 어떤 분야에서 예측을 수행하느냐에 따라 사용자에게 끼치는 영향이 다릅니다. 따라서 상황에 따라 정밀도와 재현율 중 어떤 지표가 더 중요한지 판단하는 것은 매우 중요합니다.
Trade-Off 란 상호 보완적 관계를 말합니다. 정밀도 재현율은 상호 보완적 관계로 어느 한쪽이 높아지면 다른 하나는 작아집니다. 위에서 상황에 따라 중요한 지표가 달라진다고 말했듯이 우리는 더 중요한 지표가 높은 점수를 받도록 모델을 수정할 수 있습니다. 이는 임계값(threshold)의 수정을 통해 가능합니다.
이진 분류 모델이 1, 0으로 예측하는 것은 데이터가 1일 확률과 0의 확률을 각각 구해서 확률이 50%이상인 쪽으로 예측하는 것입니다. 이때 50%라는 기준값이 임계값입니다. 따라서 1일 확률이 50.1%이든 90%이든 임계값을 기준으로 모두 1로 예측하는 것입니다.
임계값이 올리는 경우 :
예를들어 1(positive)일 확률이 70% 이상인 것만 1로 예측하겠다고 임계값을 올렸다고 생각해봅시다. 상대적으로 임계값이 0.5일 때보다 positive라고 예측하는 수가 현저히 줄어듭니다. 당연하게도 실제 negative지만 positive라고 잘 못 예측하는 경우(FP) 도 줄어듭니다. 따라서 정밀도는 증가합니다.
임계값이 내리는 경우 :
positive일 확률이 40% 이상이기만 하면 모두 1로 예측하겠다고 임계값을 내렸다고 생각해봅시다. 임계값이 0.5일 때보다 positive라고 예측하는 수가 많아질 것입니다. 뒤집어 말하면 negative로 예측하는 수가 현저히 줄어듭니다. 따라서 실제 positive이지만 negative라고 잘 못 예측하는 경우(FN)도 줄어듭니다. 따라서 재현율이 증가합니다.
정리하자면 임계값을 올릴 수록 정밀도는 올라가고 재현율은 낮아집니다.
시각화를 통해 알아보도록 하겠습니다.
위 그래프를 통해 알 수 있듯이 임계값이 증가할수록 정밀도(precision)은 높아지고 재현율(recall)은 낮아지는 것을 볼 수 있다. 또한 정밀도가 증가하면 재현율은 감소하는 것을 알 수 있다. 두 지표가 서로 교차하는 임계값 약 0.47정도가 최적의 임계값이라고 볼 수 있다.
분류모델의 평가지표로는 정밀도,재현율 외에도 F1 score, F2 score 등이 있는데 이번에는 그 중 하나인 ROC / AUC 에 대해 설명하겠습니다.
ROC(Receiver Operation Characteristic Curve) 는 FPR (False positive Rate) 이 변함에 따른 TPR (True Positive Rate)의 변화를 측정하여 평가합니다. 이 때 TPR은 앞서 설명한 재현율(recall)입니다.
재현율을 다른 말로 민감도(sensitivity) 라고 하는데, 이에 대응하는 지표가 바로 특이성(Specificity)입니다.재현율 = TPR (True Positive Rate) = TP / TP+FN특이성 = TNR (True Negative Rate) = TN / TN+FPROC 의 x축인 FPR(False Positive Rate) 은 1 - TNR 입니다.
정리하자면 ROC는 FPR 값을 0~1로 변할 때 재현율의 변화라고 할 수 있다. 이는 다시 말해 임계값을 1에서 0으로 낮출 때 재현율의 변화라고 봐도 무방합니다. FPR 이 0이 되려면 임계값을 1로 맞추면 되기 때문입니다(이해가 안된다면 pass). 임계값이 높을 때 재현율이 높아야 모델의 성능이 좋다고 할 수 있습니다.(임계값을 높이면 postive 예측 기준이 올라가는데 그 기준에서도 양성을 잘 선별해낸다는 뜻)
ROC AUC 값: 0.8987
ROC 곡선이 가운데 직선에서 멀어질 수록 성능이 좋은 것입니다.
AUC (Area Under Curve)는 말 그대로 ROC곡선 아래의 면적을 나타낸다. 1에 가까울수록 성능이 좋은 것입니다.
roc_auc_score() 를 통해 구할 수 있다.
※ 이 글은 [파이썬 머신러닝 완벽가이드] 책을 참조하여 작성하였습니다. ※
[파이썬 머신러닝] 교차검증 K-Fold 와 Cross_val_score() (feat. GridSearchCV) (0) | 2024.01.01 |
---|