Evaluation 평가 ( in 분류)

1. 평가 지표

1. 정확도 Accuracy

  • 실제 데이터에서 예측 데이터가 얼마나 같은지 판단하는 지표
  • 특히 정확도는 불균형한 레이블 값 분포에서는, 적합한 평가 지표가 아님
  • ex) MNIST 데이터 셋을 다중분류에서 이진분류로 바꾸면 (7을 True, 나머지를 False) ⇒ 0과 1중 0을 찍으면 90%의 정확도가 나오게 됌
정확도(Accuracy)=TN+TPTN+FP+FN+TP정확도(Accuracy) = \frac{TN+TP}{TN+FP+FN+TP}

2. 오차 행렬 Confusion Matrix

  • T/F : ‘같은가 틀린가' & N/P : y^\widehat{y} 이 ‘neg 0 인가 pos 1 인가’
    y^\hat{y} = 0y^\hat{y} = 1
    y = 0TNFP
    y = 1FNTP
from sklearn.metrics import confusion_matirx
  • 불균형한 이진분류 데이터 세트에서는 positive 데이터 건수가 작아, negative로 예측 정확도가 높아지는 경향이 발생한다.
    • 보통 사기 행위나 암 검진 예측 이진분류 등에서는, Positive 데이터 건수가 작게 됨
      ⇒ TN는 매우 커지고, TP, FN, FP 모두 낮아지게 됨 (그냥 neg로 예측하면 정확도 자체가 올라가므로)

3. 정밀도와 재현율

3.1. 정밀도 Precision

TPFP+TP=실제양성실제음성(잘못판단)+실제양성\frac{TP}{FP+TP} = \frac{실제 양성}{ 실제 음성(잘못판단)+실제양성}
  • 양성으로 예측한 값 중에서 실제 양성인 값
    • “P야!” 라고 말한 것들 중에, <실제 P>이 있는 확률
  • [실제 음성인 데이터 예측을 양성으로 잘못 판단하면 안되는 경우]에 [정밀도]가 중요하다.
    • 스팸 메일 판단 모델 ⇒ FN 오류의 댓가는 불편한 정도, FP 경우 업무의 차질이 생김
  • precision_score()

3.2. 재현율 Recall == 민감도 Sensitivity == TPR True Positive Rate

TPFN+TP=실제양성실제양성(잘못판단)+실제양성\frac{TP}{FN+TP} = \frac{실제 양성}{실제 양성(잘못 판단)+실제 양성}
  • 실제 양성인 대상 중에 양성으로 예측한 값
    • <실제 P들> 중에 “P야!” 라고 말한 게 있는 확률
  • [실제 양성인 데이터 예측을 음성으로 잘못 판단하면 안되는 경우]에 [재현율]이 중요하다.
    • 암 판단 모델 ⇒ FN 오류의 댓가가 생명이기에, 양성을 음성으로 잘못 판단하면 안되는 경우 ↔ FP 경우, 재검사를 하는 수준의 비용
    • 금융 사기 모델 ⇒ FN 오류의 댓가가 어마어마한 금액 ↔ FP 경우, 사기인지 재확인 하는 수준의 비용
    • 통상적으로도, 정밀도보다는 재현율이 더 중요한 업무가 많긴 함
  • recall_score()

정밀도와 재현율 모두 TP를 높이는데 동일하게 촛점을 맞추지만,
정밀도는 FP를 낮추는데 촛점을 맞추고
재현율을 FN을 낮추는데 촛점을 맞춘다.
그러므로 서로 보완적인 지표로 분류의 성능을 평가하는데 도움이 되며,
가장 좋은 성능 평가는 재현율과 정밀도 모두 높은 수치를 얻는 것이며,
어느 한 평가 지표만 매우 높고 반대는 매우 낮은 경우는 바람직하지 않음

3.3. 정밀도/재현율 트레이드 오프 trade-off

  • 정밀도와 재현율은 상호보완적 지표이다.

  • predict_proba(): 개별 데이터별로 예측 확률을 반환하는 메서드

    • predict() 가 위 메서드를 참고, 정제하여 보여주는 개념이라 생각하면 편함
  • predict()의 의사(pseudo) 코드 만들기

    from sklearn.preprocessing import Binarizer
    
    #Binarizer의 threshold 설정값. 분류 결정 임곗값임.  
    custom_threshold = 0.5
    
    # predict_proba( ) 반환값의 두번째 컬럼 , 즉 Positive 클래스 컬럼 하나만 추출하여 Binarizer를 적용
    pred_proba_1 = pred_proba[:,1].reshape(-1,1)
    
    binarizer = Binarizer(threshold=custom_threshold).fit(pred_proba_1) 
    custom_predict = binarizer.transform(pred_proba_1)
    
    get_clf_eval(y_test, custom_predict)
    • 임곗값 threshold 보다 같거나 작으면 0을, 크면 1로 변환하고 반환한다.
      • 분류 결정 임곗값은 양성 예측값을 결정하는 확률의 기준이 된다.
        • 임곗값이 낮을 수록 True값이 많아진다. (양성증가)
        • 양성 예측값이 많아지면 상대적으로 재현율이 높아진다. 정밀도는 떨어진다.
  • threshold 임곗값에 따른 재현률/정밀도 변화

  • precision_recall_curve() : 임곗값 변화에 따른 정밀도와 재현율 값 나타내주는 API

    • 입력 파라미터

      • y_true : 실제 클래스값 배열 (배열 크기 = [데이터 건수])
      • probas_pred : pos 칼럼의 예측 확률 배열 (배열 크기 = [데이터 건수])
    • 반환 값
      - 정밀도 : 임곗값별 정밀도 값을 ndarray로 반환
      - 재현율 : 임곗값별 재현율 값을 ndarray로 반환
      - 임곗값 : 일반적으로 0.11~0.95 정도의 임곗값들을 ndarray로 반환

      from sklearn.metrics import precision_recall_curve
      
      precision, recalls, threshold = precision_recall_curve(y_test, \
      																*X_test의 predict_proba() 의 양성 예측 확률 배열* ) *# == [:,1]*

4. F1 Score

  • 정밀도와 재현율을 결합한 지표. 정밀도와 재현율이 어느 쪽으로 치우치지 않을 때 상대적으로 높은 값을 가짐
F1=2prcisionrecallprecision+recallF1 = 2*\frac{prcision*recall}{precision+recall}
from sklearn.metrics import f1_score

5. ROC 곡선과 AUC

: 머신러닝 이진분류 모델의 예측 성능을 판단하는 중요한 평가지표

  • ROC 곡선: FPR(False Positive Rate)이 변할 때 [X축], TPR(True Positive Rate)이 변하는지 [Y축] 나타내는 곡선
    • TPR (재현율) = TP/(FN+TP) = 실제 양성이 정확히 예측되어야 하는 수준(민감도)
      - 질병이 있는 사람은 질병이 있는 것으로 양성 판정

      TPR(재현율,민감도)=TPFN+TPTPR(재현율, 민감도) = \frac{TP}{FN+TP}
    • TNR (특이성) = TN/(FP+TN) = 실제 음성이 정확히 예측되어야 하는 수준 (특이성 ↔ 민감도에 대응하는 지표)

      • 질병이 없는 사람은 질병이 없는 것으로 음성 판정

        TNR(특이성)=TNFP+TNTNR(특이성) = \frac{TN}{FP+TN}
  • ROC 곡선의 X축 기준인 FRP = FP/(FN+TP) = 1 - TNR (pos 틀린 비율?)
FPR=FPFP+TN=1TNR(특이성)=1TNFP+TNFPR = \frac{FP}{FP+TN} = 1-TNR(특이성) = 1 - \frac{TN}{FP+TN}
  • ROC 곡선이 중앙 직선에 가까울수록 성능이 떨어지는 것이며, 멀어질수록 성능이 뛰어난 것
    • ROC 곡선은 FPR을 0부터 1까지 변경하면서 TPR의 변화 값을 구함 [HOW?] ⇒ 분류 결정 임곗값(thresholds)을 변경하면 됨
    • thresholds는 Positive 예측값을 결정하는 확률이기에, FPR을 0으로 만들려면 임곗값을 1로 지정하면 됨
  • roc_curve()
    • 입력 파라미터
      • y_true : 실제 클래스 값 array ( array shape = [데이터 건수] )
      • y_score : predict_proba()의 반환 값 array에서 Positive 칼럼의 예측 확률이 보통 사용 됨 (array shape = [n_samples] )
    • 반환 값
      • FPR : FPR 값을 array로 반환
      • TPR : TPR 값을 array로 반환
      • Thresholds : Thresholds 값 array
  • AUC (Area Under Curve) : ROC 곡선 밑의면적을 구한 것으로, 일반적으로 1에 가까울 수록 좋은 수치
    • AUC 수치가 커지려면, FPR이 작은 상태에서 알마나 큰 TPR을 얻을 수 있느냐가 관건
      from sklearn.metrics import roc_auc_score
      
      ### roc_auc_score(y_test, y_score)로 y_score는 predict_proba()로 호출된 예측 확률
      ### ndarray중 Positive 열에 해당하는 ndarray입니다. 
      
      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))
profile
mios의 데이터 놀이터 | Instagram@data.decision (하단 홈 아이콘 버튼)

0개의 댓글