article thumbnail image
Published 2021. 11. 19. 19:35

F1 score

F1 score는 정밀도와 재현율을 결합한 지표이다.

F1 score는 정밀도와 재현율 중 한쪽으로 치우치지 않았을 때 높은 값을 가진다.

사이킷 런은 f1_score() 함수를 제공한다.

 


ROC 곡선, AUC

머신러닝 이진 분류 모델의 예측 성능을 판단하는 지표가 된다.

 

  1. ROC (Receiver Operating Charateristic curve) : FPR을 x축, TPR(재현율)을 y축으로 놓고 그린 그래프
  2. AUC (Area Under Curve) : ROC 곡선의 아래쪽 영역의 면접 = 분류 성능의 지표로 사용된다.
  3. p = prediction(predictions, labels)
    1. roc = performance(p, measure='tpr', 'x,measure='fpr')
    2. auc = performance(p, measure='auc')
  4. 임계값을 따라서 모델의 성능을 높일 수 있다.
  5. AUC가 높을수록 성능이 좋다.

TPR : 참으로 예측한 것이 맞았을 때의 비율

FPR : 참으로 예측한 것이 틀렸을 때의 비율


F1 score 실습

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

 

def get_clf_eval(y_test , pred):
    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 = f1_score(y_test,pred)
    print('오차 행렬')
    print(confusion)
    # f1 score print 추가
    print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f}, F1:{3:.4f}'.format(accuracy, precision, recall, f1))

thresholds = [0.4 , 0.45 , 0.50 , 0.55 , 0.60]
pred_proba = lr_clf.predict_proba(X_test)
get_eval_by_threshold(y_test, pred_proba[:,1].reshape(-1,1), thresholds)

임계값에 따른 F1 값이 나온다.

임계값이 0.6일때 가장 F1 값이 높긴 하지만 이걸 선택하기엔 무리가 있다. 재현율이 너무 낮기 때문이다. 


ROC curve, AUC 실습

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)
# 반환된 임곗값 배열 로우가 47건이므로 샘플로 10건만 추출하되, 임곗값을 5 Step으로 추출. 
thr_index = np.arange(0, thresholds.shape[0], 5)
print('샘플 추출을 위한 임곗값 배열의 index 10개:', thr_index)
print('샘플용 10개의 임곗값: ', 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))

 

def roc_curve_plot(y_test , pred_proba_c1):
    # 임곗값에 따른 FPR, TPR 값을 반환 받음. 
    fprs , tprs , thresholds = roc_curve(y_test ,pred_proba_c1)

    # ROC Curve를 plot 곡선으로 그림. 
    plt.plot(fprs , tprs, label='ROC')
    # 가운데 대각선 직선을 그림. 
    plt.plot([0, 1], [0, 1], 'k--', label='Random')
    
    # FPR X 축의 Scale을 0.1 단위로 변경, X,Y 축명 설정등   
    start, end = plt.xlim()
    plt.xticks(np.round(np.arange(start, end, 0.1),2))
    plt.xlim(0,1); plt.ylim(0,1)
    plt.xlabel('FPR( 1 - Sensitivity )'); plt.ylabel('TPR( Recall )')
    plt.legend()
    plt.show()
    
roc_curve_plot(y_test, lr_clf.predict_proba(X_test)[:, 1] )

 

 

'💡 AI > ML' 카테고리의 다른 글

ML - Ensemble Learning  (0) 2021.11.22
ML - Decision Tree  (0) 2021.11.21
ML - Confusion Matrix, Precision, Recall  (0) 2021.11.18
ML - 평가(evaluation)  (0) 2021.11.12
ML - fit(), transform() 과 fit_transform()의 차이  (0) 2021.09.15
복사했습니다!