對于很多從事Python的人來說,有很多的人想要去進階的,比如學習跟多的一些知識,比如,我們在工作中會遇到,使用Python計算AUC的三種方式,下面給大家做出一個解答。
介紹
AUC(Area Under Curve),其實就是ROC曲線圍成的和下坐標軸圍成的一個面積,這個面積的數值一般是不會大于1的。
當然,ROC曲線基本上都在y=x,這條直線上面的一個正上方,因此AUC的正確值應該在在0.5和1之間。AUC越接近1,它檢測出來的值就是越真實的;等于0.5時,它的真實性是最低了,當然也沒有任何的相關參考價值。
實現代碼
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的方法中,沒有遍歷數據的預測概率作為分類閾值,而是對[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. #準備數據 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的三種方式就為大家介紹到這里了,希望能夠各位讀者帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/127814.html
小編寫這篇文章的主要目的,是用來給大家介紹關于Python中代碼的相關實例,比如教大家怎么用Python計算AUC代碼,具體代碼內容,下面給大家一一列舉出來。 AUC是人工智能中常用的評級判定手段,它的具體意義是什么呢?看下圖: 下面的表格給大家做出了具體的解釋 表中列代表預測分類,行代表實際分類: 實際1,預測1:真正類(tp) 實際1,預測0:假負類(fn) 實際0,預測1:假...
摘要:精準率代表對正樣本結果中的預測準確程度,而準確率則代表整體的預測準確程度,既包括正樣本,也包括負樣本。分數同時考慮了查準率和查全率,讓二者同時達到最高,取一個平衡。接受者操作特征曲線曲線,又稱接受 作者:xiaoyu 微信公眾號:Python數據科學 知乎:python數據分析師 ROC/AUC作為機器學習的評估指標非常重要,也是面試中經常出現的問題(80%都會問到)。其實,理解它并...
摘要:精準率代表對正樣本結果中的預測準確程度,而準確率則代表整體的預測準確程度,既包括正樣本,也包括負樣本。分數同時考慮了查準率和查全率,讓二者同時達到最高,取一個平衡。接受者操作特征曲線曲線,又稱接受 作者:xiaoyu 微信公眾號:Python數據科學 知乎:python數據分析師 ROC/AUC作為機器學習的評估指標非常重要,也是面試中經常出現的問題(80%都會問到)。其實,理解它并...
摘要:問題是什么能拿來干什么如何求解深入理解是什么混淆矩陣混淆矩陣是理解大多數評價指標的基礎,毫無疑問也是理解的基礎。內容的召回往往是根據的排序而決定的。 問題: AUC是什么 AUC能拿來干什么 AUC如何求解(深入理解AUC) AUC是什么 混淆矩陣(Confusion matrix) 混淆矩陣是理解大多數評價指標的基礎,毫無疑問也是理解AUC的基礎。豐富的資料介紹著混淆矩陣的概念,...
閱讀 919·2023-01-14 11:38
閱讀 891·2023-01-14 11:04
閱讀 750·2023-01-14 10:48
閱讀 2039·2023-01-14 10:34
閱讀 956·2023-01-14 10:24
閱讀 835·2023-01-14 10:18
閱讀 506·2023-01-14 10:09
閱讀 583·2023-01-14 10:02