ROC 곡선 & AUC 스코어
- 이진 분류의 예측 성능 측정에서 중요하게 사용되는 지표
ROC 곡선 (Receiver Operation Characteristic Curve)
- 수신자 판단 곡선이라 불림
- FPR이 변할 때 TPR이 어떻게 변하는지를 나타내는 곡선
- FPR : X축 , TPR : Y축
TPR (True Positive Rate)
- 재현율 / 민감도
- TPR = TP / (FN + TP)
- 실젯값 Positive가 정확히 예측돼야 하는 수준을 나타냄
EX) 질병이 있는 사람은 질병이 있는 것으로 양성 판정
TNR (True Negative Rate)
- 특이성
- TNR = TN / (FP + TN)
- 실젯값 Negative가 정확히 예측돼야 하는 수준을 나타냄
EX) 질병이 없는 건강한 사람은 질병이 없는 것으로 음성 판정
FPR = FP / (FP + TN) = 1 - TNR = 1 - 특이성
- 가운데 직선 : ROC 곡선의 최저 값
- 점선 : 동전을 무작위로 던져 앞/뒤를 맞추는 랜덤 수준의 이진분류의 ROC 곡선 ( AUC = 0.5)
- ROC 곡선은 직선에 가까울수록 성능이 떨어지며, 멀어질수록 성능이 뛰어남
- ROC 곡선은 FPR을 0부터 1까지 변경하면서 TPR의 변화값을 구함
분류 결정 임곗값
- Positive 예측값을 결정하는 확률의 기준
1. FPR을 0으로 만들기 위해서는 임곗값을 1로 지정
-> 임곗값을 1로 지정 시, Positive 예측 기준이 매우 높기 때문에 분류기가 임곗값보다 높은 확률을 가진 데이터를 Positive으로 예측 불가
2. FPR을 1로 만들기 -> 임곗값을 0으로 만들기
- 분류기의 Positive 확률 기준이 너무 낮아서 모든 것을 Positivedmfh dPCmr
roc_curve() 메서드
입력 파라미터 | y_true : 실제 클래스 값 array( array shape = [데이터 건수]) y_score : predict_proba()의 반환 값 array에서 Positive 칼럼의 예측 확률이 보통 사용됨. array.shape = [n_samples] |
반환 값 | fpr : fpr을 array로 반환 tpr : tpr을 array로 반환 thresholds : threshold 값 array |
타이타닉 생존자 예측 모델의 FPR, TPR, 임곗값 구하기
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으로 추출
#thresholds[0]은 max(예측확률)+1로 임의 설정됨. 이를 제외하기 위해 np.arange는 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))
ROC 곡선 구하기
def roc_curve_plot(y_test, pred_proba_c1):
#임곗값에 따른 FPR, TPR 값을 반환받음
fprs, tprs, thresholds = roc_curve(y_test, pred_proba_c1)
#ROC 곡선을 그래프 곡선으로 그림
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-Specificity)'); plt.ylabel('TPR(Recall)')
plt.legend()
roc_curve_plot(y_test, pred_proba[:, 1])
AUC (Area Under Curve)
- ROC 곡선 밑의 면적을 구한 것
- 일반적으로 1에 가까울수록 좋은 수치
- 가운데 직선에서 멀어지고 왼쪽 상단 모서리쪽으로 가파르게 곡선이 이동할수록 직사각형에 가까운 곡선이 되어 면적이 1에 가까워지는 좋은 ROC AUC 성능 수치를 가진다.
- 보통의 분류는 0.5 이상의 AUC 값을 가짐