AUROC는 Classification의 성능을 측정하는 지표중 하나입니다. 
쉬운 예제와 파이썬 sklearn 통해 AUROC가 어떻게 계산되는지 알아보도록 하겠습니다.

1. Cutoff 에 따라서 True positive, True negative, False positive, False negative는 달라진다.

머신러닝에서 두개의 Class - "0" 또는 "1" 로 Classification을 할때,
  y 값은 사실 0~1 까지의 숫자를 갖게 됩니다.

에를 들어서, 체중, 키, 혈압 과 같은 features들을 이용하여,
질병이 있는지 유무를 Training 한다고 해봅시다. 
질병이 있을 경우는 1로, 질병이 없을 경우는 0으로 코딩을 합니다.

그러면 Predicted value 로 0,1 이나오겠지만, 이는 사실 에러값을 최소로 하거나 정확도를 최대로 해서 나온 값입니다.
실제로는 0~1사이에 값이 나올 수 있습니다.

그렇다면 cutoff를 어떻게 설정하느냐에 따라 Classification의 결과가 달라지게 됩니다.


이 예시는 Cutoff에 따라 Class가 다르게 결정되는 것을 보여줍니다. 
그렇기떄문에 Cutoff에 따라 False positive(FP), False negative(FN), True positive(TP),

True negative (TN)의 값이 달라지게 됩니다.



예시로 Cutoff가 0.8 일때와 Cutoff가 0.4일때 False positive(FP), False negative(FN), True positive(TP),

True negative (TN)가 달라진 것을 볼 수 있습니다.


2. AUC of ROC(Receiver Operating Characteristic) : False positive Rate- False Negative Rate 에서 AUC.

가장 일반적으로 AUC라고 하면 False positive rate-false negative rate 그래프에서 AUC를 의미하며, 이를 ROC AUC라고 부릅니다.

True positive rate(TPR)는 TP/TP+FN로 계산되며 False positive rate(FPR) 는 FP/ FP+TN으로 계산됩니다.

Cutoff 가 0.8 일때는 TPR은 1/1+3 =0.25 이고 FPR 는 0/0+4 =0 
Cutoff 가 0.4 일때는 TPR은 3/3+1 =0.75 이고 FPR 는 1/1+3 =0.25 
>>> import matplotlib.pyplot as plt
>>> plt.plot(fpr,tpr,label="data 1, auc="+str(auc))
[<matplotlib.lines.Line2D object at 0x2b98b5b90160>]
>>> plt.xlabel("False Positive Rate")
>>> plt.ylabel("True Positive Rate")
Text(42.597222222222214, 0.5, 'True Positive Rate')
>>> plt.savefig('rocauc.pdf')

 
보통 예측이 잘되는 모델의 경우 0.9 이상의 AUROC를 갖게 됩니다.

>>> from sklearn.metrics import roc_auc_score
>>> roc_auc_score(y_true, y_predicted)
0.90625
>>> fpr, tpr, thresholds = metrics.roc_curve(y_true, y_predicted, pos_label=1)
>>> fpr
array([0.  , 0.  , 0.  , 0.25, 0.5 , 1.  ])
>>> tpr
array([0.  , 0.25, 0.75, 0.75, 1.  , 1.  ])
>>> thresholds
array([1.9, 0.9, 0.6, 0.5, 0.4, 0.1])

 

3. Precision AUC = Average Precision:
Precision - Recall 에서 AUC

AUC ROC 와 비슷한 컨셉이지만, False positive rate 와 False negative rate 대신에 Precision-Recall의 Area Under Curve 값을 Precision AUC혹은 Average Precision이라고 부릅니다.

Cutoff가 0.8 일때와 Cutoff가 0.4일때


 precision과 recall 값이 변화한 것을 볼 수 있습니다.
이렇듯 Cutoff에 따라서 precision과 recall값을 x축y축으로 scatter plot을 그리면 아래와 같습니다.


아무래도 샘플의 갯수가 적으니 Cutoff  가 적어서 점이 연속적으로 보이지는 않지만,
대략적으로 점을 이어주면 아래와 같은 그래프에서 Area under Curve를 얻을 수 있습니다.





점이 Precision과 recall이 전부 1 에 가까우면 꽉채워진 사각형의 Area를 갖게되고 이경우엔 Precision AUC (또는 Average Precision) = 1 이 됩니다. 

>>> import numpy as np
>>> from sklearn.metrics import precision_recall_curve
>>> y_true = np.array([0, 0, 0,0,1,1,1, 1])
>>> y_predicted = np.array([0.1, 0.4, 0.35,0.5,0.6, 0.8,0.4,0.9])
>>> precision, recall, thresholds = precision_recall_curve(y_true, y_predicted)
>>> precision
array([0.66666667, 0.75, 1. , 1. , 1. ,1. ])
>>> recall
array([1. , 0.75, 0.75, 0.5 , 0.25, 0. ])
>>> thresholds
array([0.4, 0.5, 0.6, 0.8, 0.9])


>>> average_precision_score(y_true,y_predicted)
0.9166666666666666

(더 참고하면 좋은 문서: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html)