最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)計算AUC的三種方式總結(jié)

 更新時間:2022年07月12日 11:29:38   作者:strive_1106  
AUC(Area?under?curve)是機器學(xué)習(xí)常用的二分類評測手段,直接含義是ROC曲線下的面積。本文總結(jié)了Python語言實現(xiàn)計算AUC的三種方式,感興趣的可以學(xué)習(xí)一下

介紹

AUC(Area Under Curve)被定義為ROC曲線下與坐標(biāo)軸圍成的面積,顯然這個面積的數(shù)值不會大于1。又由于ROC曲線一般都處于y=x這條直線的上方,所以AUC的取值范圍在0.5和1之間。AUC越接近1.0,檢測方法真實性越高;等于0.5時,則真實性最低,無應(yīng)用價值。

auc計算方式:參考Python實現(xiàn)計算AUC的示例代碼

實現(xiàn)代碼

import numpy as np
from sklearn.metrics import roc_auc_score
y_true = [1,1,0,0,1,1,0]
y_pred = [0.8,0.7,0.5,0.5,0.5,0.5,0.3]
print(roc_auc_score(y_true, y_pred))
# 下面實現(xiàn)的是方法1
# https://blog.csdn.net/lieyingkub99/article/details/81266664?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242
def cal_auc1(y_true, y_pred):
    n_bins = 10
    postive_len = sum(y_true)  # M正樣本個數(shù)
    negative_len = len(y_true) - postive_len  # N負(fù)樣本個數(shù)
    total_case = postive_len * negative_len  # M * N樣本對數(shù)
    pos_histogram = [0 for _ in range(n_bins)]  # 保存每一個概率值下的正樣本個數(shù)
    neg_histogram = [0 for _ in range(n_bins)]  # 保存每一個概率值下的負(fù)樣本個數(shù)
    bin_width = 1.0 / n_bins
    for i in range(len(y_true)):
        nth_bin = int(y_pred[i] / bin_width)  # 概率值轉(zhuǎn)化為整數(shù)下標(biāo)
        if y_true[i] == 1:
            pos_histogram[nth_bin] += 1
        else:
            neg_histogram[nth_bin] += 1
    print(pos_histogram)
    print(neg_histogram)
    accumulated_neg = 0
    satisfied_pair = 0
    for i in range(n_bins):
        satisfied_pair += (pos_histogram[i] * accumulated_neg + pos_histogram[i] * neg_histogram[i] * 0.5)
        print(pos_histogram[i], neg_histogram[i], accumulated_neg, satisfied_pair)
        accumulated_neg += neg_histogram[i]
 
    return satisfied_pair / float(total_case)
print(cal_auc1(y_true, y_pred))
# 下面實現(xiàn)的是方法2
# https://blog.csdn.net/lieyingkub99/article/details/81266664?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242
def cal_auc2(y_true, y_pred):
    n_bins = 10
    postive_len = sum(y_true)  # M正樣本個數(shù)
    negative_len = len(y_true) - postive_len  # N負(fù)樣本個數(shù)
    total_case = postive_len * negative_len  # M * N樣本對數(shù)
    prob_rank = [0 for _ in range(n_bins)]  # 保存每一個概率值的rank
    prob_num = [0 for _ in range(n_bins)]  # 保存每一個概率值出現(xiàn)的次數(shù)
    bin_width = 1.0 / n_bins
    raw_arr = []
    for i in range(len(y_true)):
        raw_arr.append([y_pred[i], y_true[i]])
    arr = sorted(raw_arr, key=lambda d: d[0]) # 按概率由低到高排序
    for i in range(len(arr)):
        nth_bin = int(arr[i][0] / bin_width)  # 概率值轉(zhuǎn)化為整數(shù)下標(biāo)
        prob_rank[nth_bin] = prob_rank[nth_bin] + i + 1
        prob_num[nth_bin] = prob_num[nth_bin] + 1
    satisfied_pair = 0
    for i in range(len(arr)):
        if arr[i][1] == 1:
            nth_bin = int(arr[i][0] / bin_width)  # 概率值轉(zhuǎn)化為整數(shù)下標(biāo)
            satisfied_pair = satisfied_pair + prob_rank[nth_bin] / prob_num[nth_bin]
    return (satisfied_pair - postive_len * (postive_len + 1) / 2 ) / total_case
 
 
 
print(cal_auc2(y_true, y_pred))
 
# 根據(jù)roc曲線,找不同點算下面積, 需要點足夠多
def cal_auc3(y_true, y_pred):
    """Summary
    Args:
        raw_arr (TYPE): Description
    Returns:
        TYPE: Description
    """
    raw_arr = []
    for i in range(len(y_true)):
        raw_arr.append([y_pred[i], y_true[i]])
    print(raw_arr)
    arr = sorted(raw_arr, key=lambda d:d[0], reverse=True)
    pos, neg = 0., 0.
    for record in arr:
        if record[1] == 1.:
            pos += 1
        else:
            neg += 1
 
    fp, tp = 0., 0.
    xy_arr = []
    for record in arr:
        if record[1] == 1.:
            tp += 1
        else:
            fp += 1
        xy_arr.append([fp/neg, tp/pos])
    print(xy_arr)
    auc = 0.
    prev_x = 0.
    prev_y = 0.
    for x, y in xy_arr:
        if x != prev_x:
            auc += ((x - prev_x) * (y + prev_y) / 2.)
            prev_x = x
            prev_y = y
        print(auc)
    import numpy as np
    from sklearn.metrics import roc_auc_score
    y_true = [1, 1, 0, 0, 1, 1, 0]
    y_pred = [0.8, 0.7, 0.5, 0.5, 0.5, 0.5, 0.3]
    print(roc_auc_score(y_true, y_pred))

方法補充

下面是小編為大家找到的另外三個計算AUC的代碼,會輸出三種方法各自的auc,以及通過面積計算AUC時的ROC曲線。

在通過面積計算AUC的方法中,沒有遍歷數(shù)據(jù)的預(yù)測概率作為分類閾值,而是對[0,1]區(qū)間等分得到一系列閾值。

# AUC的計算
import numpy as np
import matplotlib.pyplot as plt

for e in range(3):
    print("\nRound: ", e+1)

    num = 1000
    auc1 = auc2 = auc3 = 0.

    # 準(zhǔn)備數(shù)據(jù)
    pred_prob = list(np.random.uniform(low=0,high=1, size=[num]))
    labels = [int(prob>0.5) for prob in list(np.random.uniform(low=0,high=1, size=[num]))]

    # 檢查數(shù)據(jù)
    # print("pred_prob:\n", pred_prob)
    # print("labels:\n", labels)

    # 方法一,面積加和
    roc_point = []
    for i in range(num):
        i = pred_prob[i]
        TP = 0  # 真陽樣本數(shù)
        FP = 0  # 假陽樣本數(shù)
        TP_rate = 0.  # 真陽率
        FP_rate = 0.  # 假陽率
        pos_num = 0   # 預(yù)測真樣本數(shù)

        # 計數(shù)過程
        for ind, prob in enumerate(pred_prob):
            if prob>i:
                pos_num += 1
            if prob>i and labels[ind]>0.5:
                TP+=1
            elif prob>i and labels[ind]<0.5:
                FP+=1
        if pos_num!=0:
            TP_rate = TP / sum(labels)
            FP_rate = FP / (num-sum(labels))
        roc_point.append([FP_rate, TP_rate])  # 記錄ROC中的點
    # 畫出ROC曲線
    roc_point.sort(key=lambda x: x[0])
    plt.plot(np.array(roc_point)[1:, 0], np.array(roc_point)[1: ,1])
    plt.xlabel("FPR")
    plt.ylabel("TPR")
    plt.show()

    # 計算每個小長方形的面積,求和即為auc
    lastx = 0.
    for x,y in roc_point:
        auc1 += (x-lastx)*y  # 底乘高
        lastx = x

    print("方法一 auc:", auc1)

    # 方法二,利用AUC關(guān)于排列概率的定義計算
    auc2 = 0
    P_ind = []  # 正樣本下標(biāo)
    F_ind = []  # 負(fù)樣本下標(biāo)
    P_F = 0  # 正樣本分?jǐn)?shù)高于負(fù)樣本的數(shù)量
    F_P = 0  # 負(fù)樣本分?jǐn)?shù)高于正樣本的數(shù)量

    #  計數(shù)過程
    for ind, val in enumerate(labels):
        if val > 0.5:
            P_ind.append(ind)
        else:
            F_ind.append(ind)
    for Pi in P_ind:
        for Fi in F_ind:
            if pred_prob[Pi] > pred_prob[Fi]:
                P_F += 1
            else:
                F_P += 1
    auc2 = P_F/(len(P_ind)*len(F_ind))
    print("方法二 auc:", auc2)

    # 方法三,方法二的改進,簡化了計算,降低了時間復(fù)雜度
    new_data = [[p, l] for p, l in zip(pred_prob, labels)]
    new_data.sort(key=lambda x:x[0])

    # 求正樣本rank之和
    rank_sum = 0
    for ind, [prob,label] in enumerate(new_data):
        if label>0.5:
            rank_sum+=ind
    auc3 = (rank_sum - len(P_ind)*(1+len(P_ind))/2) / (len(P_ind)*len(F_ind))
    print("方法三 auc:", auc3)

運行結(jié)果

到此這篇關(guān)于Python實現(xiàn)計算AUC的三種方式總結(jié)的文章就介紹到這了,更多相關(guān)Python計算AUC內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django模板語法、請求與響應(yīng)的案例詳解

    Django模板語法、請求與響應(yīng)的案例詳解

    本文主要介紹了Django的模板語法、請求與響應(yīng),包括如何創(chuàng)建和渲染模板文件、傳參機制、靜態(tài)文件的引入以及如何處理GET和POST請求,通過綜合小案例,展示了如何使用Django實現(xiàn)一個簡單的登錄頁面并根據(jù)用戶名密碼進行驗證,感興趣的朋友跟隨小編一起看看
    2025-01-01
  • CentOS 安裝 Python 3.11.9完整步驟

    CentOS 安裝 Python 3.11.9完整步驟

    在CentOS上安裝Python3.11.9并替換系統(tǒng)默認(rèn)Python版本的步驟,包括安裝依賴、下載解壓源碼、編譯安裝、更新默認(rèn)版本、驗證安裝,并提供注意事項和創(chuàng)建虛擬環(huán)境的建議,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-11-11
  • python利用遞歸方法實現(xiàn)求集合的冪集

    python利用遞歸方法實現(xiàn)求集合的冪集

    這篇文章主要給大家介紹了關(guān)于python利用遞歸方法實現(xiàn)求集合的冪集的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python學(xué)習(xí)筆記之字符串和字符串方法實例詳解

    Python學(xué)習(xí)筆記之字符串和字符串方法實例詳解

    這篇文章主要介紹了Python學(xué)習(xí)筆記之字符串和字符串方法,結(jié)合實例形式詳細(xì)分析了Python字符串相關(guān)操作函數(shù)與使用技巧,需要的朋友可以參考下
    2019-08-08
  • flask數(shù)據(jù)庫序列化操作實例探究

    flask數(shù)據(jù)庫序列化操作實例探究

    這篇文章主要為大家介紹了flask數(shù)據(jù)庫序列化操作實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • pandas創(chuàng)建DataFrame對象失敗的解決方法

    pandas創(chuàng)建DataFrame對象失敗的解決方法

    本文主要介紹了pandas創(chuàng)建DataFrame對象失敗的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • python實現(xiàn)的漢諾塔算法示例

    python實現(xiàn)的漢諾塔算法示例

    這篇文章主要介紹了python實現(xiàn)的漢諾塔算法,結(jié)合實例形式分析了漢諾塔算法的原理、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-10-10
  • Django框架模板語言實例小結(jié)【變量,標(biāo)簽,過濾器,繼承,html轉(zhuǎn)義】

    Django框架模板語言實例小結(jié)【變量,標(biāo)簽,過濾器,繼承,html轉(zhuǎn)義】

    這篇文章主要介紹了Django框架模板語言,結(jié)合實例形式總結(jié)分析了Django框架中變量,標(biāo)簽,過濾器,繼承,html轉(zhuǎn)義等相關(guān)模板語言操作技巧,需要的朋友可以參考下
    2019-05-05
  • python閉包與引用以及需要注意的陷阱

    python閉包與引用以及需要注意的陷阱

    這篇文章主要介紹了python閉包與引用以及需要注意的陷阱,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • Python中使用sklearn進行特征降維的方法

    Python中使用sklearn進行特征降維的方法

    在Python中,可以使用sklearn庫中的特征降維方法對數(shù)據(jù)進行處理。主要包括基于PCA算法的降維、基于LDA算法的降維、以及利用特征選擇方法進行降維。這些方法可以提高模型的訓(xùn)練效率和預(yù)測準(zhǔn)確率,特別是在高維數(shù)據(jù)集中具有重要的作用
    2023-04-04

最新評論

海兴县| 青河县| 鹤壁市| 怀宁县| 阿图什市| 万载县| 曲沃县| 云霄县| 屏边| 杭锦后旗| 衡阳县| 沁阳市| 华阴市| 横山县| 定边县| 罗平县| 来宾市| 灌南县| 临海市| 江安县| 兰溪市| 临城县| 彭州市| 德兴市| 盈江县| 文昌市| 通化县| 增城市| 六枝特区| 大理市| 澄迈县| 五常市| 加查县| 边坝县| 郑州市| 屏东市| 日土县| 平度市| 六盘水市| 凉山| 淳安县|