이번 글에서는 F1 score, ROC, AUC를 소개하며 성능 평가 지표를 마무리한다.
-F1 score
F1 score는 정밀도와 재현율을 결합한 지표이다. 정밀도와 재현율이 어느 한쪽으로 치우치지 않는 수치를 가질 때 상대적으로 높은 값을 가진다.
※무조건적으로 비슷할 때 가장 높은 값을 가지는 것은 아니다. 어느 한쪽으로 치우쳐 있더라도, 두 값이 각각 높은 수치를 가진다면 비슷할 때보다 F1 score가 높게 나타날 수 있다. 상대적으로 높은 값을 가진다는 뜻은 정밀도와 재현율의 합이 같다고 가정할 때, 두 값이 비슷한 경우가 한쪽으로 치우친 것보다 더 높은 값을 가진다는 뜻이다.
사이킷런은 F1 score를 구하기 위한 f1_score()메서드를 제공한다.
여느 성능 평가지표 메서드들과 마찬가지로, 첫 번째 인자로 test셋의 label값을, 두 번째 인자로 X_test의 label을 예측한 값을 입력한다.
-ROC곡선, AUC(Area Under Curve)
ROC 곡선은 FPR(False Positive Rate)이 변할 때 TPR(True Positive Rate)이 어떻게 변하는지 나타내는 곡선이다.
민감도(TPR)는 실제값 Positive(양성)가 정확히 예측되야 하는 수준을 나타낸다. 즉, Positive로 예측한 것 중 실제로Positive 인 확률을 나타낸다. (TPR = TP/(FN+TP)
특이성(TNR)은 실제값 Negative(음성)가 정확히 예측되야 하는 수준을 나타낸다. 즉, Negative로 예측한 것 중 실제로 Negative 인 확률을 나타낸다.(TNR = TN/(FP+TN)
민감도와 특이성은 서로 대응하는 지표이다. 민감도를 높이면 특이성이 떨어지고, 특이성을 높이면 민감도가 떨어지는 구조를 가진다.
※ ROC곡선에서는 특이성이 아닌 FPR을 x축으로 사용하는데 사실 FPR은 1-TNR(특이성) 이므로 특이성을 그대로 반영한다.
따라서 ROC 곡선에서는 특이성의 변화에 따라, 민감도가 어떻게 변화하는 지 나타낸다. 그렇다면 FPR(1-특이성)을 어떻게 0부터 1까지 변화시킬 수 있을까? 이전 장에서 소개한 분류 결정 임계값을 변경하면 된다.
- FPR = 0 이 되는 경우 -> 임계값을 1로 설정한다. 이 경우 Positive로 예측하는 경우가 없으므로 FP가 0이 되고, 따라서 TNR(특이성)이 1이 되므로 FPR은 0이 된다.
- FPR = 1이 되는 경우 -> 임계값을 0으로 설정한다. 이 경우 Negative로 예측하는 경우가 없으므로 TN가 0이 되고, 따라서 TNR이 0이 되므로 FPR은 1이 된다.
이렇게 임계값을 1부터 0까지 조금씩 변경하면 FPR의 값도 조금씩 변화한다. 이 때 FPR의 변화에 따라 TPR의 값이 어떻게 변하는지 나타내 주는 그래프가 바로 ROC 곡선이다.
그렇다면 ROC곡선은 어떻게 모델의 성능을 반영할까? 모델이 완벽할 경우, FPR이 0이면서 TPR은 1일 것이다. 이 같은 경우, ROC곡선은 y=1 형태의 그래프를 띌 것이다. 모델의 성능이 좋은 경우, FPR을 낮게 유지하면서도, 높은 TPR을 유지할 수 있고, TPR을 높게 유지하면서, 낮은 FPR을 유지할 수 있다.이 경우 B와 같은 그래프의 형식을 띌 것이다.
AUC는 Area Under Curve의 약자로 ROC곡선의 아래 영역의 넓이를 나타낸다. 완벽한 모델일 경우 A와 같은 그래프 형태를 띄기 때문에 AUC는 1이고, 기본 분류기의 경우 C와 같은 그래프의 형태를 띄기 때문에 AUC는 0.5가 될 것이다. 좋은 모델의 경우 AUC는 1에 가까워진다.
사이킷런은 ROC곡선을 구하기 위해 roc_curve() 메서드를 제공한다. 첫 번째 인자로 실제 클래스 값(y_test)를 입력하고, 두 번째 인자로 predict_proba(X_test)[:,1] 를 이용하여 '테스트셋의 피처데이터를 통해 계산한, 타겟이 Positive일 확률'을 입력한다.
※predict()를 이용한 예측값이 아닌 predict_proba()를 이용한 확률값을 입력해야하는 이유는 ROC커브는 임계값을 조정해가며 그려야하기 때문이다(이전 장의 분류 결정 임계값 참고).
return은 fpr, tpr, threshold값을 반환하므로 세 개의 변수를 이용해 받아야 한다.
fpr, tpr을 반환받으면 이를 x,y 로 이용해 roc curve를 그릴 수 있다(그리는 과정은 생략).
사이킷런은 ROC곡선의 AUC를 구하기 위해 roc_auc_score()메서드를 제공한다. roc_curve()와 동일하게 인자를 입력하고 auc값을 반환한다.
#이 글은 권철민 작가님의 [파이썬 머신러닝 완벽가이드]를 통해 공부한 내용을 바탕으로 정리하였습니다.
'Machine Learning > Evaluation matric' 카테고리의 다른 글
피마 인디언 당뇨병 예측 (0) | 2022.05.20 |
---|---|
정밀도와 재현율 (0) | 2022.05.15 |
정확도(accuracy), 오차 행렬(confusion matrix) (0) | 2022.05.12 |