λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Machine Learning/scikit-learn

[이진 λΆ„λ₯˜_μ„±λŠ₯ 평가 μ§€ν‘œ] F1 μŠ€μ½”μ–΄ / ROC곑선

by ISLA! 2023. 9. 28.

 

πŸ’œ F1 μŠ€μ½”μ–΄

  • 정밀도와 μž¬ν˜„μœ¨μ„ κ²°ν•©ν•œ μ§€ν‘œ
  • 정밀도와 μž¬ν˜„μœ¨μ΄ μ–΄λŠ ν•œμͺ½μœΌλ‘œ μΉ˜μš°μΉ˜μ§€ μ•ŠλŠ” 수치λ₯Ό λ‚˜νƒ€λ‚Όλ•Œ μƒλŒ€μ μœΌλ‘œ 높은 값을 가짐 => μš°μˆ˜ν•œ λͺ¨λΈ
  • μ‚¬μ΄ν‚·λŸ°μ˜ f1_score( ) API μ‚¬μš©
from sklearn.metrics import f1_score

f1 = f1_score(y_test, pred)
print('f1 μŠ€μ½”μ–΄:{0:.4f}'.format(f1))
f1 μŠ€μ½”μ–΄:0.7759
 

πŸ’œ ROC 곑선

  • ROC 곑선과 이에 κΈ°λ°˜ν•œ AUC μŠ€μ½”μ–΄λŠ” 이진 λΆ„λ₯˜μ˜ 예츑 μ„±λŠ₯μ—μ„œ μ€‘μš”ν•˜κ²Œ μ‚¬μš©λ˜λŠ” μ§€ν‘œ
  • λΆ„λ₯˜μ˜ μ„±λŠ₯ μ§€ν‘œλ‘œ μ‚¬μš©λ˜λŠ” 것은 AUC : AUC μŠ€μ½”μ–΄λŠ” 곑선 λ°‘μ˜ 면적으둜, 1에 κ°€κΉŒμšΈ 수둝 μ’‹λ‹€
    • 일반적으둜 ROC 곑선 μžμ²΄λŠ” FPR, TPR의 변화값을 λ³΄λŠ” 데 μ΄μš©ν•˜λ©°, λΆ„λ₯˜μ˜ μ„±λŠ₯μ§€ν‘œλ‘œ μ‚¬μš©λ˜λŠ” 것은 AUC κ°’(면적)
  • μ‚¬μ΄ν‚·λŸ°μ˜ roc_curve( ) μ‚¬μš© : λ°˜ν™˜κ°’μ€ FPR, TPR, μž„κ³—κ°’
μž…λ ₯ νŒŒλΌλ―Έν„° y_true : μ‹€μ œ 클래슀 κ°’ array
y_score : predict_proba()의 λ°˜ν™˜κ°’ arrayμ—μ„œ positive 칼럼의 예츑 ν™•λ₯ μ΄ 보톡 μ‚¬μš©λ¨
λ°˜ν™˜ κ°’ fpr : fpr 값을 array 둜 λ°˜ν™˜
tpr : tpr 값을 array 둜 λ°˜ν™˜
thresholds: threshold κ°’ array
from sklearn.metrics import roc_auc_score

# λ ˆμ΄λΈ” 값이 1일 λ•Œμ˜ 예츑 ν™•λ₯  μΆ”μΆœ
pred_proba_class1 = lr_clf.predict_proba(X_test)[:, 1]

# roc 컀브 λ°˜ν™˜ κ°’ 확인
fprs, tprs, thresholds = roc_curve(y_test, pred_proba_class1)

 

  • AUC κ°’ 확인
from sklearn.metrics import roc_auc_score

# λ ˆμ΄λΈ” 값이 1일 λ•Œμ˜ 예츑 ν™•λ₯  μΆ”μΆœ
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))
ROC AUC κ°’: 0.8980
 
 

 

βœ… μ’…ν•© ν•¨μˆ˜ : 정확도, 정밀도, μž¬ν˜„μœ¨, F1 μŠ€μ½”μ–΄, AUC κ΅¬ν•˜κΈ°

  • μ΄μ „κΉŒμ§€ μž‘μ„±ν•œ ν•¨μˆ˜μ— ROC AUC λŠ” 예츑 ν™•λ₯ κ°’을 기반으둜 κ³„μ‚°λ˜λ―€λ‘œ, ν•¨μˆ˜μ˜ 인자λ₯Ό λ³€κ²½ν•΄μ€Œ
def get_clf_eval(y_test, pred=None, pred_proba=None):
    confusion = confusion_matrix( y_test, pred)

    accuracy = accuracy_score(y_test , pred)
    precision = precision_score(y_test , pred)
    recall = recall_score(y_test , pred)
    f1 = f1_score(y_test,pred)
    
    # ROC-AUC μΆ”κ°€
    roc_auc = roc_auc_score(y_test, pred_proba)
    
    print('였차 ν–‰λ ¬')
    print(confusion)
    
    # ROC-AUC print μΆ”κ°€
    print('정확도: {0:.4f}, 정밀도: {1:.4f}, μž¬ν˜„μœ¨: {2:.4f},\
    F1: {3:.4f}, AUC:{4:.4f}'.format(accuracy, precision, recall, f1, roc_auc))
728x90