본문 바로가기
e-Logbook

ROC-AUC 를 score로 사용하는 사람들의 흔한 실수

by Thdnice 2022. 6. 6.
반응형

 

 통상 분류(Classification) 은 회귀 예측보다 그 평가 지표를 정량화 하기가 어렵다. 그래서 Cross entropy 같은 다소 복잡한 loss function 을 쓰기도 하는데, 그래도 이진분류 (0 or 1) 에서 가장 흔하게 사용되는 평가 지표는 물론 정합도 (accuracy) 겠지만, 다루는 데이터가 한 쪽으로 심하게 치우친 경우 (imbalanced data)에는 Accuracy는 사실 별 도움이 되지 않는다.

 이를 위해 F1-Score 또는 balanced score를 사용하기도 하는데, 이 또한 모델의 자체 성능보다, 이를 분류로 반환하는 cut-off 에 크게 좌지우지 되기 때문에 모델의 성능을 평가하는데에는 썩 좋은 지표라고 하기 어렵다.

 그래서 많이 사용하는게 roc-auc 지표인데, 많은 사람들이 이걸 그냥 기계적으로

from sklearn.metrics import roc_auc_score
y_predict = model.predict( x ) 
roc_auc_score( y, y_predict )

 

 하고 사용하는걸 보았다. (세상에...)

위에서도 이야기 했지만, Confusion matrix를 통한 정합도(Accuracy), 재현율(Recall)이니 민감도(Sensitivity)니 하는 것들은 모델자체의 성능 + Cut-off 의 성능이 복합적으로 들어가있고, 이 대신, 순수하게 모델 자체의 성능만을 평가하고 싶어서 사용하는게 ROC-AUC score 이다. 

 따라서 roc-auc score 의 input 으로는 cut-off 를 통하지 않은 분류될 확률 그 자체가 들어가야 한다. (그래야 그 확률에 대한 cut-off 를 옮겨가면서  false-positive rate 와 true-positive rate 의 비율을 그려나갈 수 있다. 그리고 그렇게 커브(정확히는 꺽은선 그래프에 가깝지만)가 그려져야 그 아래의 면적을 계산할 수 있지 않겠는가?

예를들어 어떤 사람의 소비 패턴을 보고, 이 사람이 대학생인지를 맞추는 모델이 있다고 하자. 그러면 처음에 주어지는 n개의 feature 로부터 어떤 확률값을 뽑아낼 수 있다. (통상 predcit_proba), 그러면 이 상태에서는 cut-off 를 가장 작은 0, 그리고 0.11, 0.22, 0.45, 0.75, 0.93 으로 바꿔가면서  각 cut-off 에 대해 어떻게 분류가 되는지 맞출 수 있다. 만약 cut-off 가 0 이면 모두가 대학생이라고 예측하므로 True 에 대해서는 무조건 다 맞추는 모델이되고, 반면에 cut-off 가 1이면 모두가 대학생이 아니라고 예측하므로 True에 대해서 무조건 다 못맞추는 모델이 되고, 따라서 roc-auc curve 는 항상 (0,0), (1,1) 에서 끝나게 되며,  그 사이의 cut-off 에 대해서는 각기 다른 값이 나온다. 

 

그런데 만약 우리가 roc-auc score 에 이미 predicted 된 값을 넣어버리면,  이는 딱 3개의 값밖에 가질 수 없고, 그러면 이는 사실 커브 곡선이 아닌 그냥 직선의 면적을 구하는게 된다. (실제로 x-y 축은 cut-off 값이 아니라 cut-off 값의 변화에 따른 FPR/TPR 의 비율이므로 저 사이의 값이 0.1이든 0.2이든 0.3이든 아~무 상관없다)

 

따라서 이렇게 쓰면 안된다...... (아니 애초에 모델 자체의 성능만을 보려고 roc-auc score를 쓰는건데.. 왜 거기서 predict 하고 있어요?)

 

돌아와서 위에 코드에서 단 몇줄만 바꾸면 된다.

from sklearn.metrics import roc_auc_score
y_prob = model.predict_proba( x ) 
roc_auc_score( y, y_prob )

 

중요한건 코드가 아니라, 거기에 들어있는 뜻을 이해할 것.

 

 

 

 

 

 

반응형