- 정확도 : Accuracy
- 이분 판단
- 정밀도 : Precision
- 정확한 값을 맞추는지
- 재현율 : Recall
- F1 점수 : F1 Score
- PR Curve, AP Score
- ROC, AUC Score
- 전체 대상 : Accuracy
- 맞았는지 틀렸는지 이분판단
from sklearn.metrics import accuracy_score accuracy_score(정답, 모델예측값) # label과 predict
- 불균형 데이터 셋의 경우 Accuracy가 높게 측정될 수 있으므로 평가지표로 Accuracy만 사용하면 안된다
Confusion Matrix
- 실제 값(정답)과 예측 한 것을 표로 만든 평가표
confusion_matrix(정답, 모델예측값)
출처 : https://www.researchgate.net/figure/Confusion-Matrix-for-Binary-Classification-7_fig1_350487701
- (예측 맞았는지 틀렸는지)(예측)
- TP(True Positive) : 양성으로 예측했는데 맞은 개수
- TN(True Negative) : 음성으로 예측했는데 맞은 개수
- FP(False Positive) : 양성으로 예측했는데 틀린 개수, 음성을 양성으로 예측
- FN(False Negative) : 음성으로 예측했는데 틀린 개수, 양성을 음성으로 예측
- 양성 예측력 평가지표
- Recall/Sensitivity(재현율/민감도)
- TPR(True Positive Rate)
from sklearn.metrics import recall_score recall_score(y 실제값, y 예측값)
- Precision(정밀도)
- PPV(Positive Predictive Value)
from sklearn.metrics import precision_score precision_score(y 실제값, y 예측값)
- F1 점수
- 정밀도와 재현율의 조화평균 점수
- 비슷할수록 recall, precision 둘 다 좋다고 판단할 수 있는 근거
from sklearn.metrics import f1_score f1_score(y 실제값, y 예측값)
- classification_report()
- Accuracy와 각 class가 Positive일 때의 recall, precision, f1-score를 한번에 보여주는 함수
from sklearn.metrics import classification_report result = classification_report(y_train, pred_train)
- 음성 예측력 평가지표
- Specificity(특이도)
- TNR(True Negative Rate)
- TN/(TN+FP)
- Fall out(위양성률)
- FPR (False Positive Rate)
- (1-특이도)
1. matplotimport matplotlib as mpl plt.figure(figsize=(7,7)) ax = plt.gca() # 현재 axes를 조회, 없는 경우 그래프 틀 생성 plot_confusion_matrix(dummy_model, # 모델 X_test, # X y_test, # y display_labels=['neg-9X','pos-9O'], # 0과 1의 label name을 지정 cmap=plt.cm.Blues, # 색상 values_format='d', #숫자포멧. d: 정수, f: 실수(.2f) ax=ax )
- sklearn
from sklearn.metrics import ConfusionMatrixDisplay plt.figure(figsize=(7,7)) ax = plt.gca() cm = confusion_matrix(y_test, pred_test_dummy) disp = ConfusionMatrixDisplay(cm, # confusion matrix display_labels=['Not 9', '9']) # [음성레이블, 양성레이블] disp.plot(cmap='Blues', ax=ax) # cmap=색상, 출력 plt.show()
- 데이터에서 파악하는 값이 pos가 중요한지 neg가 중요한지에 따라 선택여부 갈림
- 두 가지 모두 좋은 경우가 Best
- 재현율이 더 중요한 경우
- TP/(TP+FN)
- FN(False Negative)를 낮추는데 초점
- 실제 Positive 데이터를 Negative 로 잘못 판단하면 업무상 큰 영향이 있는 경우
- ex) 암환자
- 정밀도가 더 중요한 경우
- TP/(TP+FP)
- FP(False Positive)를 낮추는데 초점
- 실제 Negative 데이터를 Positive 로 잘못 판단하면 업무상 큰 영향이 있는 경우
- pos일 확률에 대한 임계값(Threshold) 변경을 통한 변환
- Threshold : 극단적으로 치우치면 안된다
- 임계값 증가 ==> pos 예측 기준 높아 pos 예측 확률(P) 감소
- 정밀도 분모 감소 ==> 정밀도 증가
- 재현율 분자 감소 ==> 재현율 감소
- 임계값 감소 ==> pos 예측 기준 낮아 pos 예측 확률(P) 감소
- 정밀도 분모 증가 ==> 정밀도 감소
- 재현율 분자 증가 ==> 재현율 증가
==> 반비례 관계
- precision_recall_curve()
- 임계값 변화에 따른 recall/precision 확인
precision_recall_curve(y_정답, positive_예측확률) # 튜플을 반환, (precision리스트, recall리스트, threshold리스트) # 임계값 1일 때 precision, recall은 반환되지만 threshold=1은 반환이 안되기에 마지막에 추가 필요
참고)
- 위양성률(양성예측/실제예측)의 경우 재현율과 비례관계(둘 다 양성예측이 분자)
- Binarizer : 임계값 변경
- Transformer 이용해 설정한 임계값보다 작거나 같으면 0, 크면 1로 변환하는 변환기
from sklearn.preprocessing import Binarizer binarizer = Binarizer(threshold=0.6) #0.6 이하: 0, 초과: 1 로 변환 binarizer.fit_transform(data)
- PR Curve
- Positive 확률 0~1사이의 모든 임계값에 대하여 재현율(recall)과 정밀도(precision)의 변화를 이용한 평가 지표
- X축에 재현율, Y축에 정밀도를 놓고 임계값이 1 → 0 변화할때 두 값의 변화를 나타내는 선그래프
- AP Score
- PR Curve의 성능평가 지표를 하나의 점수(숫자)로 평가
- PR Curve의 선아래 면적을 계산한 값으로 높을 수록 성능이 우수
- AP Score
from sklearn.metrics import average_precision_score result = average_precision_score(정답, pos 확률)
- 그래프
from sklearn.metrics import PrecisionRecallDisplay plt.figure(figsize=(8,6)) ax = plt.gca() disp = PrecisionRecallDisplay(precision, recall, # X, y 축에 지정할 Precision, recall 값들(precision_recall_curve()가 반환한 값) average_precision=result) # ap socre (그래프에 ap socre가 나오게 하려면 넣어주고 아니면 생략가능) disp.plot(ax=ax)
- ROC Cruve
- 위양성률(FPR, X축) - 재현율(TPR, Y축), 임계값 관계 그래프
- 임계값, FPR 변화에 따른 TPR의 변화 그래프
- FPR과 TPR은 비례 형태
- FPR =0, TPR =1 완벽한 모델
- 이는 실제 음성을 양성으로 예측할 확률 0%( ==> 음성을 음성으로 예측), 실제 양성 중 양성예측 100%
from sklearn.metrics import roc_curve from sklearn.metrics import roc_auc_score fprs, tprs, threshold = roc_curve(y값, 예측확률) # FPR, TPR, Thresholds (임계값) 반환 score = roc_auc_score(y값, 예측확률) # AUC 점수 반환
- 시각화
from sklearn.metrics import RocCurveDisplay # 범례에 나올 값들 disp1 = RocCurveDisplay(fpr=fpr_model, tpr=tprs_model, roc_auc=auc_model, estimator_name='tree') disp1.plot(ax=ax)