Python notes/Data Science & Machine Learning

분류 결과 평가지표, AUC(Area Under the ROC Curve)와 Gini coefficient 비교

성실한 나무 2022. 11. 22. 12:24

#1. 분류 결과 평가지표인 AUC, Gini coefficient

 머신러닝을 통해 분류 결과를 예측했을 때 예측한 값과 실제 값을 비교해서 예측 결과를 평가한다. 그 중에서도 결과가 0과 1 두 개의 클래스로 분류되는 경우를 평가할 때 평가지표로 ROC curve, AUC, Gini coefficient를 사용할 수 있다. 클래스가 세개 이상인 경우일지라도 이진형태로 타겟 데이터를 변환하면 (scikit learn의 OneVsRestClassifier를 사용) 0과 1,2,3을 분류해내는 성능 혹은 1과 0,2,3을 분류해내는 성능을 위의 평가지표로 평가할 수 있다.

 

#2. AUC ? (+ROC curve)

 ROC curve는 Receiver Operating Characteristics curve로서 수신자 조작 특성 커브라고 하며, X축은 False Positive Rate (= 1- Specificity), Y축은 True Positive Rate으로 그린다. False Positive Rate은 ( 0인데 1이라고 잘못 분류한 데이터 개수 / 실제로 0인 데이터 전체 개수)이고, True Positive Rate은 ( 1인데 1이라고 바르게 분류한 데이터 개수 / 실제로 1인 데이터 전체 개수 )이다.

 AUC는 이 커브의 아래 면적의 너비를 가리킨다. 분류 성능이 좋을 수록 AUC는 1에 가깝고, 분류가 무작위로 되어 있을 수록 AUC는 0.5에 가깝다. 또한, 분류를 완전 반대로 한 경우(0을 1로, 1을 0으로)에는 0이 된다.

 아래는 Scikit learn에서 제공하는 유방암 데이터를  SVM (Support vector machine)을 사용하여 분류한 결과이다. 데이터를 통해 분류한 결과 유방암인 경우가 1, 유방암이 아닌 경우가 0이다. 여기서 13번 줄에 있는 predict_proba는 분류 결과가 1일 확률을 의미한다. 그래서 이 확률이 0.5 이상이면 1로 분류가 되고 0.5 미만이면 0으로 분류를 해준다. (*Scikit learn의 분류기에서는 기본적으로 0.5를 cut-off value로 삼아 0과 1의 분류를 나누지만, 분류 성능을 최적화하는 cut-off value를 별도의 방법으로 찾아서 그 값을 기준으로 분류 결과를 변경할 수도 있다. 이 부분은 별도로 포스팅을 하겠다.)

SVM classification result

 

 위에서 얻은 확률값과 실제 값을 통해 FPR, TPR을 구할 수 있으며, 이 값들로 ROC curve를 아래와 같이 그릴 수 있다. FPR과 TPR로 AUC도 얻을 수 있다. 각각 roc_curve와 auc 함수를 사용해서 구한다. 아래 그림에서 AUC 0.99란, 전체 사각형에서 파란색 직선 아래의 파란색 면적을 의미한다. X축이 1, Y축이 1이기 때문에 전체 면적은 1인데 그 중 AUC가 0.99이면 매우 높은 분류 성능을 가지고 있다고 볼 수 있다.

ROC curve, AUC 계산 w/ Python

 

#3. Gini coefficient ?

 Gini coefficient는 (2*AUC -1)의 공식으로 계산할 수 있다. 원래 공식은 아래 그래프 면적에서 A/(A+B)로 구하는데 여기서 A+B의 면적은 0.5이기 때문에 A/0.5 = 2*A로도 Gini coefficient값을 계산할 수 있다. 분류 성능이 좋을 수록 Gini는 1에 가깝고, 분류가 무작위로 되어 있을 수록 Gini는 0에 가깝다. 또한, 분류를 완전 반대로 한 경우(0을 1로, 1을 0으로)에는 -1이 된다.

 Gini를 계산하기 위해 아래 eval_gini 함수를 사용할 수 있다.

Gini coefficient w/Python

 

#4. AUC vs Gini coefficient ?

 위에서 분류한 결과를 토대로 Gini값과 AUC를 계산해 보았더니 아래와 같은 결과를 얻었다.

Gini vs AUC

 완벽하게 분류된 모델인 경우, Gini = AUC = 1,

 완벽하게 무작위로 분류된 모델인 경우, Gini = 0, AUC = 0.5

 완벽하게 반대로 분류된 모델인 경우, Gini = -1, AUC = 0 이렇게 마무리할 수 있겠다.