728x90
반응형
<이전블로그> - 분류의 평가(Evaluation) (1) Confusion Matrix, Accuracy, Precision, Recall
🎯 회귀와 분류의 성능평가지표들
지도학습 | Baseline (기준모델) | Evaluation Metric (성능평가지표) |
Regression (회귀) |
실제값과 예측값의 오차 평균값 | MAE , MSE, R^2 |
Classification (분류) |
Majority(최빈값) | Accuracy (정확도) Confusion Matrix (오차행렬) Precision (정밀도) Recall (재현율) F1 Score (F1스코어) ROC AUC |
이전 블로그에서 분류의 평가지표 중 Accuracy, Confusion Matrix, Precision, Recall에 대해 공부했습니다.
이번에는 F1 Score와 ROC AUC에 대해 공부해 보도록 하겠습니다.
<F1 스코어를 사용하는 이유>
임계값을 이용해 정밀도, 재현율의 값들은 극단적인 수치 조작이 가능합니다.
따라서 정밀도 또는 재현율 중 하나만 스코어가 좋고 다른 하나는 스코어가 나쁜 분류는 성능이 좋지 않은 분류로 간주할 수 있습니다.
물론 분류가 정밀도 또는 재현율 중 하나에 상대적인 중요도를 부여해 각 예측 상황에 맞는 분류 알고리즘을 튜닝할 수 있지만, 그렇다고 정밀도/재현율 중 하나만 강조하는 상황이 되어서는 안됩니다.
(예를들어, 암 예측 모델에서 재현율을 높인다고 걸핏하면 양성으로 판단할 경우 환자의 부담과 불평이 커지게 됩니다.)
정밀도와 재현율의 수치가 적절하게 조합돼 분류의 종합적인 성능 평가에 사용될 수 있는 평가 지표가 필요합니다. = F1 스코어
https://thedatascientist.com/f-1-measure-useful-imbalanced-class-problems/
1. F1 score
F1 스코어는 정밀도와 재현율을 결합한 지표이다. 정밀도와 재현율 어느 한쪽으로 치우치지 않는 수치를 나타낼 때 F1 score는 상대적으로 높은 값을 가진다.
예시)
Precision | Recall | F1 Score | |
A 예측모델 | 0.9 | 0.1 | 0.18 |
B 예측모델 | 0.5 | 0.5 | 0.5 |
만약 정밀도와 재현율의 차이가 별로 없다면 F1 score는 그렇지 않은 모델보다 더 높은 값을 가지게 된다.
<code>
from sklearn.metrics import f1_score
f1 = f1_score(y_test, pred)
print('F1 스코어 : {0:.4f}'.format(f1))
2. ROC 곡선과 AUC
ROC 곡선과 이에 기반한 AUC 스코어는 이진 분류의 예측 성능 측정에서 중요하게 사용되는 지표이다.
1) ROC 곡선 (Receiver Operation Characteristic Curve, 수신자 판단 곡선)
: 일반적으로 의학 분야에서 많이 사용되지만, 머신러닝의 이진 분류 모델의 예측 성능을 판단하는 중요한 평가 지표이기도 하다.
FPR 이 변할 때, TPR 이 어떻게 변하는지를 나타내는 곡선이다. (FPR에 대응 하는 지표로 TNR이 있다.) |
Roc 곡선이 가운데 직선에 가까울수록 성능이 떨어지는 것이며, 멀어질수록 성능이 뛰어난 것이다. |
임곗값이 1이면 FP가 0이 되기 때문에 FPR은 0이다. |
임곗값이 0이면 TN이 0이 되기 때문에 FPR은 1이다. |
임계값을 1부터 0까지 변화시켜 FPR을 구한 후, FPR 값 변화에 따른 TPR 구하는 것이 ROC곡선이다. |
임곗값을 1부터 0까지 거꾸로 변화시키면서 구한 재현율 곡선의 형태와 비슷하다. |
TPR (True Positive Rate) =민감도, 재현율 |
TPR = TP (FN + TP) |
실제값 Positive(양성)가 정확히 예측돼야 하는 수준 (질병이 있는 사람은 질병이 있는 것으로 양성 판정) |
TNR (True Negative Rate) =특이성 (Specificity) |
TNR = TN (FP + TN) |
실제값 Negative(음성)가 정확히 예측돼야 하는 수준 (질병이 없는 건강한 사람은 질병이 없는 것으로 음성 판정) |
FPR (False Positive Rate) | FPR = FP (FP + TN) = 1- TNR(특이성) |
실제값 Negative(음성)을 Positive(양성)이라 잘못 예측 하는 수준 |
<code>
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)
#반환된 임곗값 배열에서 샘플로 데이터를 추출하되, 임곗값을 5 Step으로 추출
#threshold[0]은 max(예측확률)+1로 임의 설정됨. 이를 제외하기 위해 np.arrange는 1부터 시작
thr_index = np.arange(1, thresholds.shape[0],5)
print('샘플 추출을 위한 임곗값 배열의 index', thr_index)
print('샘플 index로 추출한 임곗값: ', 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))
임곗값이 점점 작아지면 FPR이 커진다. 그리고 FPR이 조금씩 커질때 TPR은 가파르게 커짐을 알 수 있다. |
1) ROC AUC (Area Under Curve)
: ROC 곡선 밑의 면적을 구한 것
- 1에 가까울 수록 좋은 수치이다.
- AUC 수치가 커지려면 FPR이 작은 상태에서 얼마나 큰 TPR을 얻을 수 있느냐가 중요하다.
- 가운데 직선에서 멀어지고 왼쪽 상단 모서리 쪽으로 가파르게 곡선이 이동할 수록 직사각형에 가까운 곡선이 되어 면적이 1에 가까워지는 좋은 ROC AUC성능 수치를 얻게 된다.
- 가운데 대각선 직선은 ACU값으로 0.5이다. 따라서 보통 분류의 AUC 값은 0.5 이상이다.
<code>
from sklearn.metrics import roc_auc_score
pred_proba = lr_clf.predict_proba(X_test)[:,1]
roc_score = roc_auc_score(y_test, pred_proba)
print('ROC AUC 값 : {0:.4f}'.format(roc_score))
728x90
반응형
'머신러닝 (Machine Learning) > 분류(Classification) 분석' 카테고리의 다른 글
결정 트리의 과적합 (Overfitting) 시각화로 이해하기 (0) | 2021.02.14 |
---|---|
Decision Tree Graphviz (0) | 2021.02.14 |
결정 트리 (Decision Tree) (0) | 2021.02.13 |
분류의 평가(Evaluation) (1) Confusion Matrix, Accuracy, Precision, Recall (0) | 2021.02.11 |
분류(Classification) (0) | 2021.02.04 |