1. 程式人生 > 實用技巧 >AUC及其計算

AUC及其計算

概念

AUC(Area Under Curve)被定義為ROC曲線下與座標軸圍成的面積,顯然這個面積的數值不會大於1。又由於ROC曲線一般都處於y=x這條直線的上方,所以AUC的取值範圍在0.5和1之間。AUC越接近1.0,檢測方法真實性越高;等於0.5時,則真實性最低,無應用價值.
AUC:(ROC曲線下方的面積大小)
參考:百度百科

含義理解二 : AUC(are under curve)是一個模型的評價指標,用於分類任務。
那麼這個指標代表什麼呢?這個指標想表達的含義,簡單來說其實就是隨機抽出一對樣本(一個正樣本,一個負樣本),然後用訓練得到的分類器來對這兩個樣本進行預測,預測得到正樣本的概率大於負樣本概率的概率。

參考

AUC的計算方法

  1. 方法一 : 定義計算 -> 計算面積 -> 不好實現

  2. 方法二: 從概率的角度進行實現
    有如下公式:

公式解釋:
首先對score從大到小排序,然後令最大score對應的sample 的rank為n,第二大score對應sample的rank為n-1,以此類推。然後把所有的正類樣本的rank相加,再減去M-1種兩個正樣本組合的情況。得到的就是所有的樣本中有多少對正類樣本的score大於負類樣本的score。然後再除以M×N

程式碼實現:

import numpy as np

def calculate_auc(y, p):
    '''
    y: 真實Label的向量 ndarray
    p: 預測為正例的概率的向量 ndarray
    '''
    # 保證相同概率的0排在1前面
    tmp = np.array(sorted(zip(y, p), key=lambda x:(x[1], -x[0]), reverse=True))
    neg = 0
    pos = 0
    for i in y:
        if i == 0:
            neg += 1
        elif i == 1:
            pos += 1
    loss = 0
    neglst = np.array([])
    for i in range(len(tmp)):
        if tmp[i][0] == 1:
            loss += np.sum(neglst == tmp[i][1]) / 2 + np.sum(neglst != tmp[i][1])
        else:
            neglst = np.append(neglst, tmp[i][1])
            
    return 1 - loss / (neg*pos)


參考:
https://blog.csdn.net/lieyingkub99/article/details/81266664

https://blog.csdn.net/renzhentinghai/article/details/81095857

https://blog.csdn.net/jose_M/article/details/105587339?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.pc_relevant_is_cache&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.pc_relevant_is_cache

時間匆匆,簡單記錄~