<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
AUC(Area Under Curve)被定義為ROC曲線下與座標軸圍成的面積,顯然這個面積的數值不會大於1。又由於ROC曲線一般都處於y=x這條直線的上方,所以AUC的取值範圍在0.5和1之間。AUC越接近1.0,檢測方法真實性越高;等於0.5時,則真實性最低,無應用價值。
auc計算方式:參考Python實現計算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)) # 下面實現的是方法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正樣本個數 negative_len = len(y_true) - postive_len # N負樣本個數 total_case = postive_len * negative_len # M * N樣本對數 pos_histogram = [0 for _ in range(n_bins)] # 儲存每一個概率值下的正樣本個數 neg_histogram = [0 for _ in range(n_bins)] # 儲存每一個概率值下的負樣本個數 bin_width = 1.0 / n_bins for i in range(len(y_true)): nth_bin = int(y_pred[i] / bin_width) # 概率值轉化為整數下標 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)) # 下面實現的是方法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正樣本個數 negative_len = len(y_true) - postive_len # N負樣本個數 total_case = postive_len * negative_len # M * N樣本對數 prob_rank = [0 for _ in range(n_bins)] # 儲存每一個概率值的rank prob_num = [0 for _ in range(n_bins)] # 儲存每一個概率值出現的次數 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) # 概率值轉化為整數下標 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) # 概率值轉化為整數下標 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)) # 根據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的方法中,沒有遍歷資料的預測概率作為分類閾值,而是對[0,1]區間等分得到一系列閾值。
# 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. # 準備資料 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]))] # 檢查資料 # print("pred_prob:n", pred_prob) # print("labels:n", labels) # 方法一,面積加和 roc_point = [] for i in range(num): i = pred_prob[i] TP = 0 # 真陽樣本數 FP = 0 # 假陽樣本數 TP_rate = 0. # 真陽率 FP_rate = 0. # 假陽率 pos_num = 0 # 預測真樣本數 # 計數過程 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關於排列概率的定義計算 auc2 = 0 P_ind = [] # 正樣本下標 F_ind = [] # 負樣本下標 P_F = 0 # 正樣本分數高於負樣本的數量 F_P = 0 # 負樣本分數高於正樣本的數量 # 計數過程 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) # 方法三,方法二的改進,簡化了計算,降低了時間複雜度 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)
執行結果
到此這篇關於Python實現計算AUC的三種方式總結的文章就介紹到這了,更多相關Python計算AUC內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45