F1 score
F1 score는 정밀도와 재현율을 결합한 지표이다.
F1 score는 정밀도와 재현율 중 한쪽으로 치우치지 않았을 때 높은 값을 가진다.
사이킷 런은 f1_score() 함수를 제공한다.
ROC 곡선, AUC
머신러닝 이진 분류 모델의 예측 성능을 판단하는 지표가 된다.
- ROC (Receiver Operating Charateristic curve) : FPR을 x축, TPR(재현율)을 y축으로 놓고 그린 그래프
- AUC (Area Under Curve) : ROC 곡선의 아래쪽 영역의 면접 = 분류 성능의 지표로 사용된다.
- p = prediction(predictions, labels)
- roc = performance(p, measure='tpr', 'x,measure='fpr')
- auc = performance(p, measure='auc')
- 임계값을 따라서 모델의 성능을 높일 수 있다.
- 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 |