위키북스의 파이썬 머신러닝 완벽 가이드 책을 토대로 공부한 내용입니다.


1. F1 Score


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

F1=21recall+1precision=2precisionrecallprecision+recallF1 = {2 \over {1 \over recall}+{1 \over precision}} = 2*{precision*recall \over precision+recall}

사이킷런은 F1 스코어를 구하기 위해 f1_score() API를 제공한다. 이전에 학습한 로지스틱 회귀 기반의 타이타닉 생존자 모델을 이용하여 F1 스코어를 구해보았다.

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

[output] threshold 변화에 따른 F1 스코어를 구해보았고, 이전의 get_clf_eval() 함수에 F1 스코어를 구하는 로직을 추가하였다. 그리고 이전의 get_eval_by_threshold 함수를 이용해 0.4 ~ 0.6 별로 평가 지표를 구해보았다.

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(f'TN {confusion[0][0]}\t/ FP {confusion[0][1]}')
    print(f'FN {confusion[1][0]}\t/ TP {confusion[1][1]}')
    # 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)

[output] 위의 결과를 확인해보면 F1 스코어는 threshold가 0.6인 경우 가장 좋은 결과를 보인다. 하지만 이 경우에는 재현율이 많이 감소한다는 점을 주의해야 하한다.

profile
NLP, AI, LLM, MLops

0개의 댓글