위키북스의 파이썬 머신러닝 완벽 가이드 책을 토대로 공부한 내용입니다.
F1 score는 정밀도와 재현율을 결합한 지표이며, 정밀도와 재현율이 어느 한쪽으로 치우치지 않는 수치를 나타낼 때 상대적으로 높은 값을 가진다.
사이킷런은 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인 경우 가장 좋은 결과를 보인다. 하지만 이 경우에는 재현율이 많이 감소한다는 점을 주의해야 하한다.