Confusion Matrix 구현 Python
fig, ax = plt.subplots()
pcm = plot_confusion_matrix(pipe, X_val, y_val,
cmap=plt.cm.Blues,
ax=ax);
plt.title(f'Confusion matrix, n = {len(y_val)}', fontsize=15)
plt.show()
- 정확도(Accuracy): (TP+TN) / Total
전체 범주를 모두 바르게 맞춘 경우(True값 전체)를 전체 수로 나눈 값
>>> 종속변수의 비율이 불균형할때 가치가 낮아진다. - 정밀도(Precision): TP / (TP+FP)
Positive로 예측한 경우 중 올바르게 Positive를 맞춘 비율
>>>정밀도가 중요한 경우는 실제 False를 True라고 판단하면 안되는 경우 - 재현율(Recall, Sensitivity): TP / (TP+FN)
실제 Positive인 것 중 올바르게 Positive를 맞춘 것의 비율
>>> 재현율이 중요한 경우는 실제 True를 False로 잘못판단하면 큰일나는 경우 - F1점수(F1 score): 2·[(정밀도x재현율)/(정밀도+재현율)] = 2·((Precision·Recall)/(Precision+Recall))
정밀도와 재현율의 조화평균(harmonic mean)
>>> 정밀도와 재현율중 한쪽으로 치우치면 F1 Score의 값이 낮게나타남 - 임계값(thresholds)
TPR(재현율Sensitivity; tp /(tp+fn))은 최대화 하고FPR(위양성률; fp/(fp+tn))은 최소화 하는 임계값이 최적의 임계값
임계값 (Threshold) = 1 == FP=0 ==> FPR=0
임계값 (Threshold) = 0 == TN=0 ==> FPR=1 (임계값 (Threshold) 가 0이면 확률이 모두 True 라고 예측) - ROC, AUC (Receiver Operating Characteristic, Area Under the Curve)
- ROC curve :모든 임계값을 한 눈에 보고 모델을 평가할 수 있는 방법
ROC curve는 이진분류문제에서 사용(다중분류문제에서는 각 클래스를 이진클래스 분류문제로 변환(One Vs All)하여 구함). 여러 임계값에 대해 TPR(True Positive Rate, recall)과 FPR(False Positive Rate) 그래프를 보여준다.
>>>> FPR (False Positive Rate)이 변할 때 TPR (True Positive Rate) 이 어떻게 변하는지를 나타내는 곡선
- AUC: ROC curve의 아래 면적, AUC값은 높을 수록 좋다.
>>> 랜덤일때 0.5의 값을 가진다. 따라서, 0.5미만은 의미없는 모형이라고 판단. 1에 가까울수록 좋은 모형.
재현율의 경우 실제 암진단을 하는 경우. 정밀도의 경우 넷플릭스의 영화 추천 같은 경우.
사이킷런 roc_curve는 임계값에 따른 TPR, FPR 수치를 자동으로 계산해 준다.
# 혼동행렬, 정확도, 정밀도, 재현율, F1, AUC 불러오기
def get_clf_eval(y_test, y_pred):
confusion = confusion_matrix(y_test, y_pred)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
F1 = f1_score(y_test, y_pred)
AUC = roc_auc_score(y_test, y_pred)
print('오차행렬:\n', confusion)
print('\n정확도: {:.4f}'.format(accuracy))
print('정밀도: {:.4f}'.format(precision))
print('재현율: {:.4f}'.format(recall))
print('F1: {:.4f}'.format(F1))
print('AUC: {:.4f}'.format(AUC))
Sklearn Classification report
from sklearn.metrics import classification_report
print(classification_report(y_val, y_pred))
precision recall f1-score support
0 0.76 0.80 0.78 7680
1 0.75 0.70 0.72 6372
accuracy 0.75 14052
macro avg 0.75 0.75 0.75 14052
weighted avg 0.75 0.75 0.75 14052
각각 사용해야 하는 상황이 다르다, 데이터 분석의 목적, 평가 방법에 어울리는 성능 평가 지표를 활용해야한다..
1) 타이타닉 생존자 분류 분류모델의 성능 평가 지표로 정확도를 사용합니다.
2) 식물종류 판별 성능 평가 지표로 F1 Score를 사용합니다.
# 평가를 위한 cross_validate를 가져오고, 교차검증을 위한 KFold를 가져옵니다.
from sklearn.model_selection import cross_validate, KFold
# 평가지표 5개를 가져옵니다.
# 정확도, 정밀도, 재현율, f1_score, auc
from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
# 교차검증을 설정합니다.
# n_splits=20의 의미는 전체의 19/20은 훈련, 1/20은 테스트 데이터로 사용한다는 의미입니다.
# 이렇게 하면 총 20번 교차검증을 수행합니다.
k_fold = KFold(n_splits=20, random_state=1, shuffle=True)
# 평가지표를 객체로 만들어줍니다.
scoring = {'accuracy' : make_scorer(accuracy_score),
'precision' : make_scorer(precision_score),
'recall' : make_scorer(recall_score),
'f1_score' : make_scorer(f1_score),
'roc_auc_score': make_scorer(roc_auc_score)
}
result = cross_validate(rf, x, y, cv=k_fold, scoring=scoring)
# 평가 결과가 가진 키를 출력해봅니다.
result.keys()
# 20번 교차검증을 수행했기 때문에 20개의 평가지표들의 평균값을 구해줍니다.
accuracy = result["test_accuracy"].mean()
precision = result["test_precision"].mean()
recall = result["test_recall"].mean()
f1_score = result["test_f1_score"].mean()
auc_score = result["test_roc_auc_score"].mean()
print("accuracy: {0: .4f}".format(accuracy))
print("precision: {0: .4f}".format(precision))
print("recall: {0: .4f}".format(recall))
print("f1_score: {0: .4f}".format(f1_score))
print("auc_score: {0: .4f}".format(auc_score))