Data scientist/Machine Learning

[ML/DL] python 으로 구현하는 ROC곡선과 AUC

반응형

ROC곡선과 AUC

 

ROC 곡선은 FPR이 변할 때 TPR이 어떻게 변하는지 나타내는 곡선이다.

 

ROC 곡선은 다양한 threshold에 대한 이진 분류기의 성능을 한 번에 표시한 것이다.

 

이진 분류의 성능은 True Positive Rate를 y축으로 False Positive Rate를 X 축으로 이용해서 표현하게 된다.

 

ROC 커브는 좌상단에 붙어있는 커브가 더 좋은 분류기를 의미한다고 생각할 수 있다. 

 

즉 곡선이 100에 가까워질수록 postive에 가까워진다. 곡선이 커진다는 것은 positive라고 예측할 확률이 높아진다.

 

이 곡선의 면적은 AUC라고 한다. 이것은 ROC 곡선 밑의 면적을 구한것으로서 일반적으로 1에 가까울수록 좋은 것이다.

 

또한, ROC가 0.5에 가깝다는 건 분류가 제대로 안됐다는 것이다. 이건 분류로서 의미가 없다. 이 곡선이 직선에 가까울수록 성능이 안 좋다.

 

임계값이 1이면 positive를 예측을 할 수 없게 되고 0에 가까워질수록 positive라고 예측할 확률이 높아진다.

 

 

 

 

# roc_curve(실제값, 예측 확률 값): FPR, TPR, 임계값

(타이타닉을 이용한 생존자 예측 FPR, TPR, 임계값)

 

앞단에 타이타닉 데이터를 X_Train, y_train, X_test, y_test를 만드는 작업이 있습니다.

from sklearn.metrics import roc_curve



# 레이블 값이 1일때의 예측확률을 추출

pred_positive_label = lr_model.predict_proba(X_test)[:,1]



fprs, tprs, thresholds = roc_curve(y_test, pred_positive_label)



print("샘플추출")

print()

thr_idx = np.arange(1,thresholds.shape[0],6)

print('thr idx:',thr_idx)

print('thr thresholds value:',thresholds[thr_idx])

print('thr thresholds value:',fprs[thr_idx])

print('thr thresholds value:',tprs[thr_idx])

 

샘플을 위와 같이 추출한 다음 그 값을 인덱스로 사용함에 따른 FPRS, TPRS를 볼 수 있다.

 

이 값을 가지고 그래프를 그리면 아래와 같이 생긴다.

pred_positive_label = lr_model.predict_proba(X_test)[:,1]



fprs, tprs, thresholds = roc_curve(y_test, pred_positive_label)



precisions, recalls, thresholds = roc_curve(y_test, pred_positive_label)



plt.figure(figsize=(15,5))



# 대각선

plt.plot([0,1],[0,1],label='STR')



# ROC

plt.plot(fprs,tprs,label='ROC')





plt.xlabel('FPR')

plt.ylabel('TPR')

plt.legend()

plt.grid()

plt.show()

 

 

 

AUC 면적 구하기

from sklearn.metrics import roc_auc_score

from sklearn.linear_model import LogisticRegression



# 위 코드 확인 후

# 로지스틱 회귀

lr_model = LogisticRegression()

lr_model.fit(X_train,y_train)

prediction = lr_model.predict(X_test)

print('roc auc value {}'.format(roc_auc_score(y_test,prediction))) # 이  value는 auc에 대한 면적을 나타낸 것이다.

# display_eval(y_test,prediction)

 

 

 

 

 

 

반응형