---
# System prepended metadata

title: AUC

---

## AUC 簡介
![image](https://hackmd.io/_uploads/BJzNkvb6ge.png)
- AUC 的建立流程是：
先準備每筆資料的「預測分數」與「真實標籤」 → 設定多個 threshold → 計算各 threshold 的 TPR 與 FPR → 繪製 ROC 曲線 → 計算曲線下的面積作為 AUC。

- AUC計算方式
AUC = ROC–curve這條線以下的面積，即代表 AUC 越大正確率越高。
- AUC 特性
**1.** 如果把資料的正負標籤整個「對調」，新舊 AUC 為互補，新的AUC會變成 1 - 原本的AUC
$$AUC(new) = 1 - AUC(origin)$$
**2.** AUC的範圍在1 ~ 0 之間。
- AUC 優點
相較於其他指標，AUC 相對更 ”客觀”，因為它考慮全部 threshold 的情況。
- AUC 判別規則
$AUC = 0.5$ (no discrimination 無鑑別力)，ROC剛好是對角線
$0.7 ≦ AUC ≦ 0.8$ (acceptable discrimination 可接受的鑑別力)
$0.8 ≦ AUC ≦ 0.9$ (excellent discrimination 優良的鑑別力)
$0.9 ≦ AUC ≦1.0$ (outstanding discrimination 極佳的鑑別力)

## AUC 實際例子
![image](https://hackmd.io/_uploads/SJtL_IbTel.png)
上圖為下面計算完成後所繪製的。
>[!Tip] AUC 計算流程 & 實際操作
>**Step 0 : dataset**
>```
>y = [1, 1, 0, 0, 1]
>y_pred_proba =[300, 720, 850,  400, 200]
>```
>**Step 1：將預測機率排序（由大到小）**
>```
>y_pred_proba = [300, 720, 850,  400, 200]
>sort_y_pred_proba = [850, 720, 400, 300, 200] #排序後的
>```
>**Step 2：建立 Threshold 列表**
在排序好的預測值基礎上，於最前面加上一個「最大值+1」，作為第一個 threshold：
>```
>threshold = [851, 850, 720, 400, 300, 200]
>```
>**Step 3：計算各 Threshold 對應的 FPR、TPR**
用剛剛所得出的 threshold 去運算 FPR, TPR ，如果有重複的點位就將其刪除
>```
>roc_point = [{0, 0}, {0, 0.33}, {0, 0.67}, {0, 0.67}, {1, 0.67}, {1, 1}]
>```
>**Step 4：移除重複的點**
例如這裡有兩個 {0, 0.67}，將重複的點去掉，得到：
>```
>New_roc_point = [{0, 0}, {0, 0.33}, {0, 0.67}, {1, 0.67}, {1, 1}]
>```
>**Step 5：繪製 ROC 曲線並計算 AUC**
>- 使用 `New_roc_point` 依序連線，即為 ROC 曲線
>- 將曲線下方的區域分割成梯形，計算面積總和

## Python 上的 AUC
**方法(一)**
```
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

fpr, tpr, thresholds = roc_curve(y_true, y_score)
roc_auc = auc(fpr, tpr)
```
> 先用 `roc_curve` 去計算 fpr, tpr，在使用 `auc` 去計算最終的值。
>優點: 可畫 ROC-curve, 將數據視覺化且能得到 threshold

**方法(二)**
```
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_true, y_score)
```
> 直接使用 `roc_auc_curve` 計算 auc
優點: 相對簡單，且計算較為快速