這裡介紹一下如題所述的四個概念以及相應的使用python繪制曲線:
參考部落格:http://kubicode.me/2016/09/19/Machine%20Learning/AUC-Calculation-by-Python/?utm_source=tuicool&utm_medium=referral
一般我們在評判一個分類模型的好壞時,一般使用MAP值來衡量,MAP越接近1,模型效果越好;

更詳細的可參考:http://www.cnblogs.com/pinard/p/5993450.html
準确率pr就是找得對,召回率rc就是找得全。
大概就是你問問一個模型,這堆東西是不是某個類的時候,準确率就是 它說是,這東西就确實是的機率吧,召回率就是, 它說是,但它漏說了(1-召回率)這麼多。
(這裡的P=FN+TP;N=TN+FP;而這裡recall=tp rate;上述連結裡的特異性其實就是fp rate)
AUC和AP分别是ROC和PR曲線下面積,map就是每個類的ap的平均值;python代碼(IDE是jupyter notebook):
#繪制二分類ROC曲線
importpylab as pl%matplotlib inlinefrom math importlog,exp,sqrt
evaluate_result= "D:/python_sth/1.txt"db=[]
pos , neg=0 , 0
with open(evaluate_result ,'r') as fs:for line infs:
nonclk , clk , score= line.strip().split('\t')
nonclk=int(nonclk)
clk=int(clk)
score=float(score)
db.append([score , nonclk , clk])
pos+=clk
neg+=nonclk
db= sorted(db , key = lambda x:x[0] , reverse = True) #降序
#計算ROC坐标點
xy_arr =[]
tp , fp=0. , 0.for i inrange(len(db)):
tp+= db[i][2]
fp+= db[i][1]
xy_arr.append([tp/neg , fp/pos])#計算曲線下面積即AUC
auc =0.
prev_x=0for x ,y inxy_arr:if x !=prev_x:
auc+= (x - prev_x) *y
prev_x=xprint "the auc is %s."%auc
x= [_v[0] for _v inxy_arr]
y= [_v[1] for _v inxy_arr]
pl.title("ROC curve of %s (AUC = %.4f)" % ('svm', auc))
pl.ylabel("False Positive Rate")
pl.plot(x ,y)
pl.show()
結果:(注意:ROC曲線中縱坐标是TP,橫坐标是FP,下面的圖有誤!)
這裡的.txt檔案格式如:http://kubicode.me/img/AUC-Calculation-by-Python/evaluate_result.txt
形式為:
PS:該txt檔案表示的意思是,比如對于第一行就是說:有一個樣本得分為0.86...,并被預測為負樣本;倒數第一行就是說,這麼多測試樣本中,有一個樣本得分為0.45...,并被預測為正樣本;
注意:繪制ROC和PR曲線時都是設定不同的門檻值來獲得對應的坐标,進而畫出曲線
代碼中:
nonclick:未點選的資料,可以看做負樣本的數量
clk:點選的數量,可以看做正樣本的數量
score:預測的分數,以該分數為group進行正負樣本的預統計可以減少AUC的計算量
代碼中首先使用
db = sorted(db , key = lambda x:x[0] , reverse = True) 進行降序排序,然後将每一個從小到大的得分值作為門檻值,每次得到一個fpr和tpr(因為最後得分大于門檻值,就認為它是正樣本,是以若.txt中得分為某一個門檻值時nonclk為非0的數,而clk是0,則認為nonclk的值大小的樣本是fp樣本),最後畫出曲線;
對于PR曲線也一樣,隻不過橫坐标換成
,縱坐标換成
,AP是其曲線下面積;
上面的python代碼針對二分類模型,但針對多分類模型時一樣,即對于每個類都将其看做正樣本,其他類看成負樣本來畫曲線,這樣有多少類就畫多少條相應的曲線,MAp值即為各類ap值的平均值;
PR曲線的繪制:
這裡我們用一張圖檔作為例子,多張圖檔道理一樣。假設一張圖檔有N個需要檢測的目标,分别是object1,object2,object3共分為三類,使用檢測器得到了M個Bounding Box(BB),每個BB裡包含BB所在的位置以及object1,object2,object3對應的分數confidence。
我把計算目标檢測評價名額歸為一下幾步:
1,對每一類i進行如下操作:
對M個BB中每一個BB,計算其與N個GroundTruth(GT)的IoU值,且取其中的最大值MaxIoU。設定一個門檻值thresh,一般設定thresh為0.5。當MaxIoU < thresh的時候,記錄其類别i的分數confidencei以及fpi = 1,當MaxIoU>=thresh分為以下倆種情況:
當MaxIoU對應的GT類别為i的時候,記錄其類别i的分數以及tpi = 1。
當MaxIoU對應的GT類别不為i的時候,記錄其類别i的分數以及fpi = 1。
2,由步驟1我們可以得到3M個分數與tp/fp的元祖,形如(confidencei,tp或者fp),對這3M個元祖按照confidence進行排序(從大到小)。
3,按照順序1,2,3,4。。。M截取,計算每次截取所獲得的recall和precision
recall = tp/N
precision = tp/tp+fp
這樣得到M個recall和precision點,便畫出PR曲線了~
計算AP值:
由上面得到了PR曲線,即得到了n個(P,R)坐标點,利用這些坐标點我們便可以計算出AP(average precision):
方法一:11點法,此處參考的是PASCAL VOC CHALLENGE的計算方法。首先設定一組門檻值,[0, 0.1, 0.2, …, 1]。然後對于recall大于每一個門檻值(比如recall>0.3),我們都會得到一個對應的最大precision。這樣,我們就計算出了11個precision。AP即為這11個precision的平均值。這種方法英文叫做11-point interpolated average precision。;
方法二:當然PASCAL VOC CHALLENGE自2010年後就換了另一種計算方法。新的計算方法假設這N個樣本中有M個正例,那麼我們會得到M個recall值(1/M, 2/M, …, M/M),對于每個recall值r,我們可以計算出對應(r’ > r)的最大precision,然後對這M個precision值取平均即得到最後的AP值。
下面給出個例子友善更加形象的了解:
假設從測試集中共檢測出20個例子,而測試集中共有6個正例,則PR表如下:
相應的Precision-Recall曲線(這條曲線是單調遞減的)如下:
我看網上關于如何使用該代碼并沒有做出解釋,我這裡用voc中的幾張圖檔計算了一下map(自己算法的測試結果,比如說對voc中的cat類,就建立一個cat.txt,其中存儲“圖檔名 矩形框坐标”格式的資訊),具體檔案在連結:https://pan.baidu.com/s/1336g7ccc4gZ2EKNu9PNndQ 提取碼:57yd 中,大家有需要的可以按照這個裡面的格式來操作該代碼計算map。
AUC和MAP之間的聯系:
AUC主要考察模型對正樣本以及負樣本的覆寫能力(即“找的全”),而MAP主要考察模型對正樣本的覆寫能力以及識别能力(即對正樣本的“找的全”和“找的對”)