카테고리 없음

Chapter 3.5 ROC 곡선과 AUC

yooni825 2024. 5. 16. 09:59

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 곡선의 최저 값

- 점선 : 동전을 무작위로 던져 앞/뒤를 맞추는 랜덤 수준의 이진분류의 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])

titanic 예제의 ROC 곡선

 

 

AUC  (Area Under Curve) 

- ROC 곡선 밑의 면적을 구한 것

- 일반적으로 1에 가까울수록 좋은 수치 

- 가운데 직선에서 멀어지고 왼쪽 상단 모서리쪽으로 가파르게 곡선이 이동할수록 직사각형에 가까운 곡선이 되어 면적이 1에 가까워지는 좋은 ROC AUC 성능 수치를 가진다.

- 보통의 분류는 0.5 이상의 AUC 값을 가짐