ROC curve와 AUC, F1-score

지난 포스팅에 이어 이번에는 ROC (Receiver Operating Characteristics) curve와 AUC (Area Under Curve)그리고 F1-score에 대해 소개하고자 한다.

ROC curve & AUC

분류 모델의 평가 지표인 Recall 과 FPR에 대해 다시 한번 짚고 넘어가자.

Recall은 전체 Positive 데이터 중 모델이 얼마나 Positive 데이터를 잘 예측했는지를 나타낸다.

FPR (False Positive Rate)는 전체 Negative 데이터 중 모델이 얼마나 Positive로 잘못 예측했는지를 나타낸다. 즉, 실제로는 Negative지만 모델이 Positive로 잘못 예측한 정도를 나타낸다.

ROC curve는 Recall과 FPR 두 지표를 사용한다.

출처 : https://newsight.tistory.com/53

Recall (=True Positive Rate)를 Y축, FPR을 X축으로 정하면 위와 같은 그래프를 그릴 수 있다.

그래프가 좌측 상단쪽으로 많이 기울어질수록 분류가 잘 이루어지고 그래프가 직선에 가까워질수록 성능을 기대하기 어렵다고 볼 수 있다.

ROC curve의 아래 면적을 AUC라고 하며 AUC 값이 1에 가까울수록 분류가 잘 이루어지고 0.5에 가까울수록 분류가 잘 이루어지지 않는다고 할 수 있다.

출처 : https://scikit-learn.org/0.15/auto_examples/plot_roc.html

Multi class의 경우는 위와 같이 ROC curve를 그릴 수 있다.

위 모델의 경우는 class가 0인 데이터는 잘 분류하지만 class가 1인 데이터는 제대로 분류가 되지 않을 수 있다.

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
from sklearn.metrics import roc_auc_score
tpr = []
fpr = []
roc_auc = []
y_score = svm.fit(x_train_std, y_train).decision_function(x_test_std)
fpr,tpr,_ = roc_curve(y_test, y_score)
roc_auc = auc(fpr,tpr)
plt.figure()
plt.plot(fpr, tpr)
print(roc_auc_score(pred,y_test,average="weighted"))

python에서는 sklearn 라이브러리를 사용하면 코드 몇 줄로 쉽게 ROC curve를 그리고 AUC 값을 구할 수 있다.

위 코드와 그림은 필자가 svm 모델을 학습시킨 후 ROC curve를 그려 어느정도 분류가 잘 이루어지는지 확인한 결과다.

위의 코드에서 svm 대신에 자신이 학습시킨 모델을 넣고 x_train_std 와 y_train에는 자신의 학습 데이터를, x_test_std 와 y_test에는 테스트 데이터를 넣으면 된다.

F1-score

F1-score는 Recall과 Precision을 사용한다.

Precision은 전에도 소개했었지만 다시 한 번 짚고 넘어가자.

Recall이 전체 Positive 중 얼마나 Positive를 잘 예측했는지를 나타낸다면 Precision은 모델이 예측한 Positive 중 진짜 Positive의 비율을 나타낸다.

F1-score는 이 두개의 지표의 조화 평균 값이다.

\[F1=\frac{2 \times Recall \times Precision}{Recall + Precision}\]

Recall과 Precision은 둘 중 하나가 높은 값을 보인다고 모델이 항상 좋은 성능을 낸다고는 할 수 없다.

하지만 F1-score가 높은 값을 보이면 모델이 어느정도 좋은 성능을 낸다고 볼 수 있다.

F1-score는 분류 모델의 성능을 평가할 수 있는 좋은 지표이며 Accurcay와 마찬가지로 자주 쓰인다.

Leave a comment