본문 바로가기

All about Data/Statistics

F1 Score, Roc곡선, Auc 계산방법 / scikit-learn 코드로 구현하기

정밀도와 재현율을 구했다면, 이번엔 F1 Score, ROC, AUC를 구해볼 차례이다. 역시나 어려운 개념은 아니므로, 단어에 기죽지 말자.

[↓↓정밀도와 재현율 개념 학습이 필요하신 분들↓↓]

정밀도(precision)와 재현율(recall)의 오차행렬 헷갈리지 않는 방법, 분류모델 평가지표



1. F1 Score: 정밀도와 재현율의 조화 평균

계산방법: F1 Score = 2 x (정밀도 x 재현율) / (정밀도 + 재현율)

정밀도와 재현율을 구하다보면, 한 쪽으로 치우친 결과를 만들 수 있도록 모델을 조작할 수 있으므로 무조건 한 쪽 수치가 높은 것보다는 조화 평균도 함께 고려를 해야 한다. 위의 계산식을 보면, F1 Score에서 높은 점수를 받으려면, 정밀도와 재현율 둘 다 어느 정도 높은 수치를 받아야만 가능하다.

정밀도가 더 중요한 경우의 모델 2개를 평가한다고 가정해보자.

  • (모델1) 정밀도 0.9, 재현율 0.3 → F1 Score 0.45
  • (모델2) 정밀도 0.8, 재현율 0.6 → F1 Score 0.87

정밀도로만 판단하면, 모델1을 택하겠지만, F1 Score까지 살펴보면 모델2가 훨씬 높은 점수를 받고 있으므로 모델2가 더 정교하다고 볼 수 있다. 즉, 한 쪽이 아무리 높다고해도, 나머지 한 쪽이 낮은 수치를 가지면 F1 Score는 높은 점수를 받을 수 없다.


2. ROC 곡선 (Receiver Operation Characteristic Curve)

ROC 곡선은 FPR(False Positive Rate)가 변할 때, TPR(True Positive Rate)가 어떻게 변하는지 나타나는 곡선을 의미한다.
FPR = FP / (TN+FP) : 실제 음성인 것 중에서, 양성으로 잘못 예측한 비율 - 낮을수록 좋음.
TPR = TP / (TP+FN) : 재현율/민감도, 실제 양성인 것 중에서 양성으로 맞게 예측한 비율 - 높을수록 좋음.

TP : True Positive (긍정예측 → 정답)
FP : False Positive (긍정예측 → 오답)
TN : True Negative (부정예측 → 정답)
FN : False Negative (부정예측 → 오답)



곡선 그래프로 살펴보자. ROC 곡선은 아래 파란색 선처럼 직각형태에 가까울수록 높이 평가된다. 반대로, Random 라인에 가까워질수록 성능이 나쁘다고 평가된다.

Roc곡선그래프

 

3. AUC(Area Under ROC)

AUC는 ROC 곡선 아래의 면적을 의미하며, ROC 곡선이 왼쪽 상단으로 가까워질수록 AUC면적도 1에 가까워진다.
가로와 세로의 max값이 1인 정사각형이므로 최대값이 1이다.
즉 ROC곡선과 AUC는 세트라고 볼 수 있다.

scikit-learn



편리하게도 scikit-learn에서는 F1 score와, roc auc score를 계산할 수 있는 library가 제공된다.
다음과 같이 import해서 분류모델 평가에 활용해보자.

from sklearn.metrics import f1_score f1 = f1_score(y_true, y_pred) # y_true : 정답 값, y_pred : 예측 값 print("F1 score: {}".format(f1))

 

from sklearn.metrics import roc_auc_score roc_auc = roc_auc_score(y_true, y_pred) print("ROC AUC Score: {}".format(roc_auc))