머신러닝 (Machine Learning)/분류(Classification) 분석

분류의 평가(Evaluation) (2) F1 score , ROC AUC

DS지니 2021. 2. 13. 00:04
728x90
반응형

<이전블로그> - 분류의 평가(Evaluation) (1) Confusion Matrix, Accuracy, Precision, Recall

 

분류의 평가(Evaluation) (1) Confusion Matrix, Accuracy

머신러닝은 데이터 가공/변환, 모델 학습/예측, 그리고 평가(Evaluation)의 프로세스로 구성되어있습니다. 머신러닝 모델은 여러 가지 방법으로 예측 성능을 평가 할 수 있는데, 이 성능 평가 지표(E

gggggeun.tistory.com

 

🎯 회귀와 분류의 성능평가지표들

지도학습 Baseline (기준모델) Evaluation Metric (성능평가지표)
Regression
(회귀)
실제값과 예측값의 오차 평균값 MAE , MSE, R^2
Classification
(분류)
Majority(최빈값) Accuracy (정확도)
Confusion Matrix (오차행렬)
Precision (정밀도)
Recall (재현율)
F1 Score (F1스코어)
ROC AUC

 


 

이전 블로그에서 분류의 평가지표 중 Accuracy, Confusion Matrix, Precision, Recall에 대해 공부했습니다. 

 

이번에는 F1 Score와 ROC AUC에 대해 공부해 보도록 하겠습니다.

 

<F1 스코어를 사용하는 이유>

임계값을 이용해 정밀도, 재현율의 값들은 극단적인 수치 조작이 가능합니다.
따라서 정밀도 또는 재현율 중 하나만 스코어가 좋고 다른 하나는 스코어가 나쁜 분류는 성능이 좋지 않은 분류로 간주할 수 있습니다.
물론 분류가 정밀도 또는 재현율 중 하나에 상대적인 중요도를 부여해 각 예측 상황에 맞는 분류 알고리즘을 튜닝할 수 있지만, 그렇다고 정밀도/재현율 중 하나만 강조하는 상황이 되어서는 안됩니다.
(예를들어, 암 예측 모델에서 재현율을 높인다고 걸핏하면 양성으로 판단할 경우 환자의 부담과 불평이 커지게 됩니다.)
정밀도와 재현율의 수치가 적절하게 조합돼 분류의 종합적인 성능 평가에 사용될 수 있는 평가 지표가 필요합니다. = F1 스코어

https://thedatascientist.com/f-1-measure-useful-imbalanced-class-problems/

 

1. F1 score

F1 스코어는 정밀도와 재현율을 결합한 지표이다. 정밀도와 재현율 어느 한쪽으로 치우치지 않는 수치를 나타낼 때 F1 score는 상대적으로 높은 값을 가진다. 

 

 

예시)

  Precision Recall F1 Score
A 예측모델 0.9 0.1 0.18
B 예측모델 0.5 0.5 0.5

만약 정밀도와 재현율의 차이가 별로 없다면 F1 score는 그렇지 않은 모델보다 더 높은 값을 가지게 된다.

 

 

 

<code>

from sklearn.metrics import f1_score
f1 = f1_score(y_test, pred)
print('F1 스코어 : {0:.4f}'.format(f1))

 

2. ROC 곡선과 AUC

ROC 곡선과 이에 기반한 AUC 스코어는 이진 분류의 예측 성능 측정에서 중요하게 사용되는 지표이다. 

 

1) ROC 곡선 (Receiver Operation Characteristic Curve, 수신자 판단 곡선)

 : 일반적으로 의학 분야에서 많이 사용되지만, 머신러닝의 이진 분류 모델의 예측 성능을 판단하는 중요한 평가 지표이기도 하다.

FPR 이 변할 때,  TPR 이 어떻게 변하는지를 나타내는 곡선이다. (FPR에 대응 하는 지표로 TNR이 있다.)
Roc 곡선이 가운데 직선에 가까울수록 성능이 떨어지는 것이며, 멀어질수록 성능이 뛰어난 것이다.
임곗값이 1이면 FP가 0이 되기 때문에 FPR은 0이다.
임곗값이 0이면 TN이 0이 되기 때문에 FPR은 1이다.
임계값을 1부터 0까지 변화시켜 FPR을 구한 후, FPR 값 변화에 따른 TPR 구하는 것이 ROC곡선이다.
임곗값을 1부터 0까지 거꾸로 변화시키면서 구한 재현율 곡선의 형태와 비슷하다.

 

TPR (True Positive Rate)
=민감도, 재현율
TPR =         TP     
            (FN + TP) 
실제값 Positive(양성)가 정확히 예측돼야 하는 수준
(질병이 있는 사람은 질병이 있는 것으로 양성 판정)  
TNR (True Negative Rate)
=특이성 (Specificity)
TNR =        TN     
             (FP + TN)
실제값 Negative(음성)가 정확히 예측돼야 하는 수준
(질병이 없는 건강한 사람은 질병이 없는 것으로 음성 판정)
FPR (False Positive Rate) FPR =         FP     
             (FP + TN)

      = 1- TNR(특이성)
실제값 Negative(음성)을 Positive(양성)이라 잘못 예측 하는 수준

 

<code>

from sklearn.metrics import roc_curve

# 레이블 값이 1일떄의 예측 확률을 추출
pred_proba_class1 = lr_clf.predict_proba(X_test)[:,1]

fprs, tprs, thresholds = roc_curve(y_test, pred_proba_class1)
#반환된 임곗값 배열에서 샘플로 데이터를 추출하되, 임곗값을 5 Step으로 추출
#threshold[0]은 max(예측확률)+1로 임의 설정됨. 이를 제외하기 위해 np.arrange는 1부터 시작
thr_index = np.arange(1, thresholds.shape[0],5)
print('샘플 추출을 위한 임곗값 배열의 index', thr_index)
print('샘플 index로 추출한 임곗값: ', np.round(thresholds[thr_index],2))

#5 step 단위로 추출된 임계값에 따른 FPR, TPR 값
print('샘플 임계값별 FPR:',np.round(fprs[thr_index], 3))
print('샘플 임계값별 TPR:',np.round(tprs[thr_index], 3))

임곗값이 점점 작아지면 FPR이 커진다. 그리고 FPR이 조금씩 커질때 TPR은 가파르게 커짐을 알 수 있다.

 

1) ROC AUC (Area Under Curve)

: ROC 곡선 밑의 면적을 구한 것

 

  • 1에 가까울 수록 좋은 수치이다.
  • AUC 수치가 커지려면 FPR이 작은 상태에서 얼마나 큰 TPR을 얻을 수 있느냐가 중요하다.
  • 가운데 직선에서 멀어지고 왼쪽 상단 모서리 쪽으로 가파르게 곡선이 이동할 수록 직사각형에 가까운 곡선이 되어 면적이 1에 가까워지는 좋은 ROC AUC성능 수치를 얻게 된다.
  • 가운데 대각선 직선은 ACU값으로 0.5이다. 따라서 보통 분류의 AUC 값은 0.5 이상이다.

<code>

from sklearn.metrics import roc_auc_score


pred_proba = lr_clf.predict_proba(X_test)[:,1]
roc_score = roc_auc_score(y_test, pred_proba)
print('ROC AUC 값 : {0:.4f}'.format(roc_score))

728x90
반응형