日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ROC曲线及如何计算AUC

發(fā)布時(shí)間:2024/3/26 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROC曲线及如何计算AUC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AUC的全名是Area Under Curve,就是ROC曲線下的面積。因此,在介紹AUC之前,先介紹下ROC。

ROC

ROC的全稱是”受試者工作特征“(Receiver? Operating Characteristic)曲線。要了解ROC,需要先了解混淆矩陣。

混淆矩陣

對于二分類問題,可以把樣例根據(jù)其真實(shí)類別與模型預(yù)測的類別的組合,劃分為如下幾種:

  • 真正例:真實(shí)值是positive,模型認(rèn)為是positive的數(shù)量(True Positive=TP)
  • 假負(fù)例:真實(shí)值是positive,模型認(rèn)為是negative的數(shù)量(False Negative=FN)
  • 假正例:真實(shí)值是negative,模型認(rèn)為是positive的數(shù)量(False Positive=FP)
  • 真負(fù)例:真實(shí)值是negative,模型認(rèn)為是negative的數(shù)量(True Negative=TN)

將這四個(gè)指標(biāo)一起呈現(xiàn)在表格中,就能得到如下這樣一個(gè)矩陣,我們稱它為混淆矩陣

真實(shí)情況預(yù)測結(jié)果
正例(Positive)負(fù)例(Negative)
正例(Positive)TP(真正例)FN(假負(fù)例)
負(fù)例(Negative)FP(假正例)TN(真負(fù)例)

ROC曲線

先了解兩個(gè)指標(biāo):

  • 真正例率(True Positive Rate,簡稱TPR):表示當(dāng)前預(yù)測為正樣本的數(shù)據(jù)中,真實(shí)的正樣本占所有正樣本的比例

? ? ? ? ? ? ? TPR = TP / (TP + FN)

  • 假正例率(False?Positive Rate,簡稱FPR):表示當(dāng)前被分到正樣本的數(shù)據(jù)中,真實(shí)的負(fù)樣本占所有負(fù)樣本的比例。

? ? ? ? ? ? ? FPR = FP / (TN + FP)

我們根據(jù)模型的預(yù)測結(jié)果對樣本進(jìn)行排序,按順序逐個(gè)把樣本作為正樣本進(jìn)行預(yù)測,每次計(jì)算出TPR和FPT,分別以FPR為橫坐標(biāo)、以TPR為縱坐標(biāo)作圖,就得到了ROC曲線。ROC曲線示意圖如下:

如何畫ROC曲線

畫ROC曲線,在西瓜書上有描述,摘抄如下:

給定P個(gè)正例和N個(gè)負(fù)例,根據(jù)模型的預(yù)測結(jié)果(比如,對二分類來說,預(yù)測樣本為正例的概率)對樣本進(jìn)行排序,然后把分類閾值設(shè)為最大,即把所有樣本都預(yù)測為負(fù)例,此時(shí)TPR和FPR都是0,在坐標(biāo)(0,0)處標(biāo)記一個(gè)點(diǎn)。然后,將分類閾值依次設(shè)置為每個(gè)樣本的預(yù)測值,即依次將每個(gè)樣本劃分為正例。設(shè)前一個(gè)標(biāo)記點(diǎn)坐標(biāo)為(x,y),當(dāng)前若為真正例,則對應(yīng)標(biāo)記點(diǎn)的坐標(biāo)為(x,y + 1/P);當(dāng)前若為假正例,則對應(yīng)的標(biāo)記點(diǎn)的坐標(biāo)為(x + 1/N,y),然后用線段連接相鄰點(diǎn)即可畫出ROC曲線。

這種方法得到的ROC曲線是一個(gè)一個(gè)的小矩形堆積起來的。

以上方法,可能有個(gè)假設(shè),模型為每個(gè)樣本預(yù)測的分?jǐn)?shù)都不同,實(shí)際可能的情況是,對不同的樣本,模型預(yù)測的分?jǐn)?shù)都一樣。也就是說,一個(gè)分?jǐn)?shù)對應(yīng)多個(gè)樣本,則此時(shí)標(biāo)記點(diǎn)應(yīng)該是(x + neg_num/N, y? + pos_num/P)。

?

畫ROC曲線,可能下面的方法更合適:

1. 統(tǒng)計(jì)正樣本、負(fù)樣本個(gè)數(shù)

2. 根據(jù)模型預(yù)測分?jǐn)?shù),對樣本進(jìn)行排序

3. 對每個(gè)分?jǐn)?shù),分別計(jì)算TPR、FPR。根據(jù)TPR及FPR公式,TPR = 當(dāng)前累積正樣本數(shù) / 總正樣本數(shù),FPR = 當(dāng)前累積負(fù)樣本數(shù) / 總負(fù)樣本數(shù)

4. 根據(jù)坐標(biāo)點(diǎn),畫出ROC曲線

假如數(shù)據(jù)輸入為:正樣本數(shù)、負(fù)樣本數(shù)、模型打分,數(shù)據(jù)以 \t 分割

程序如下:?

import sys import numpy as np import matplotlib.pyplot as pltdb = [] #[score,nonclk,clk] pos, neg = 0, 0 with open(sys.argv[1], 'r') as fs:for line in fs:clk, nonclk, score = line.strip().split('\t')clk = int(clk)nonclk = int(nonclk)score = float(score)db.append([score, nonclk, clk])pos += clkneg += nonclkdb = sorted(db, key=lambda x:x[0], reverse=True)xy_arr = [] tp, fp = 0., 0. for i in range(len(db)):tp += db[i][2]fp += db[i][1]xy_arr.append([fp / neg, tp / pos]) #坐標(biāo)x為fpr,坐標(biāo)y為tprauc = 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 #梯形法計(jì)算aucprev_x = xprev_y = yx = [v[0] for v in xy_arr] y = [v[1] for v in xy_arr] plt.title("ROC curve (AUC = %.4f)" % (auc,)) plt.xlabel("False Positive Rate") plt.ylabel("True Positive Rate") plt.plot(x, y) plt.show()
正樣本數(shù)負(fù)樣本數(shù)模型打分
100.86605524
100.77184237
100.69956942
010.65163829
100.62392949
100.60180098
100.5874279
310.5754674
100.56437262
100.55511045
100.54749859
200.54068382
100.53447174
010.52879996
100.52353805
110.51891224
100.51481348
110.51068467
100.50696007
110.50303299

以上數(shù)據(jù)的ROC曲線為:

?

?

計(jì)算AUC

目前了解有幾種方法:

1. 梯形法:計(jì)算ROC曲線下梯形的面積。梯形面積為 (上底 + 下底) * 高 / 2,及 (x2 - x1) * (y1 + y2) / 2。

上面的程序已給出根據(jù)梯形計(jì)算AUC的方法,這里只摘一部分:

#xy_arr里存儲的坐標(biāo)點(diǎn) 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 ? #梯形法計(jì)算aucprev_x = xprev_y = y

2.?Wilcoxon-Mann-Witney Test:AUC最普遍的定義是 ROC 曲線下的面積。但其實(shí)另一種定義更常用,分別隨機(jī)從正負(fù)樣本集中抽取一個(gè)正樣本,一個(gè)負(fù)樣本,正樣本的預(yù)測值大于負(fù)樣本的預(yù)測值。即Wilcoxon-Mann-Witney Test。

在有M個(gè)正樣本,N個(gè)負(fù)樣本的數(shù)據(jù)集里。一共有M*N對樣本(一對樣本即,一個(gè)正樣本與一個(gè)負(fù)樣本)。統(tǒng)計(jì)這M*N對樣本里,正樣本的預(yù)測概率大于負(fù)樣本的預(yù)測概率的個(gè)數(shù)。

即:

其中

舉個(gè)例子:

IDlabelscore
A00.1
B00.4
C10.35
D10.8

假設(shè)有4個(gè)樣本,如上,2個(gè)正樣本,兩個(gè)負(fù)樣本。總共有4個(gè)樣本對,分別為:

(D,B),(D,A),(C,B),(C,A)

在(D,B)樣本對中,正樣本D預(yù)測的概率大于負(fù)樣本B預(yù)測的概率(也就是D的得分比B高),記為1;(D, A)和(C, A)也是1;而對于(C,B),正樣本C預(yù)測的概率小于負(fù)樣本C預(yù)測的概率,記為0。

AUC =(1 + 1 + 1 + 0) / (2 * 2) = 0.75

假如有得分一致的樣本:

IDlabelscore
A00.1
B00.4
C10.4
D10.8

(D, B) = 1,

(D, A) = 1,

(C, B) = 0.5

(C, A) = 1

AUC = (1 + 1 + 1 + 0.5) / (2 * 2) = 0.875

代碼如下:

import sys#score, pos, neg score_arr = [ [0.866055238,1,0], [0.771842369,1,0], [0.699569423,1,0], [0.651638287,0,1], [0.623929487,1,0], [0.601800985,1,0], [0.587427901,1,0], [0.575467402,3,1], [0.564372623,1,0], [0.555110448,1,0], [0.547498587,1,0], [0.540683823,1,1], [0.534471741,1,0], [0.528799962,0,1], [0.523538048,1,0], [0.518912239,1,1], [0.514813483,1,0], [0.510684669,1,1], [0.506960069,1,0], [0.503032986,1,1] ]pos_num, neg_num = 0, 0 for item in score_arr:score, pos, neg = itemif pos > 0:pos_num += 1if neg > 0:neg_num += 1score_arr = sorted(score_arr, key=lambda x:x[0])neg_sum = 0 pos_gt_neg = 0 for item in score_arr:score, pos, neg = itemif pos > 0 and neg > 0:pos_gt_neg += 0.5 * posneg_sum += negelif pos > 0:pos_gt_neg += neg_sum #該正樣本比之前的負(fù)樣本score都大else:neg_sum += negauc = 1.0 * pos_gt_neg / pos_num / neg_num print auc

與方法1輸入的數(shù)據(jù)相同,該方法計(jì)算的AUC為0.536。數(shù)據(jù)量增加,兩種方法計(jì)算的AUC應(yīng)該接近。

3. 正樣本Rank:

(1)?首先對score從大到小排序,

(2) 然后令最大score對應(yīng)的sample 的rank為n,第二大score對應(yīng)sample的rank為n-1,以此類推。

(3) 然后把所有的正類樣本的rank相加,再減去M-1種兩個(gè)正樣本組合的情況。得到的就是所有的樣本中有多少對正類樣本的score大于負(fù)類樣本的score。然后再除以M×N。

第一個(gè)正樣本的分?jǐn)?shù)為score_p1,rank為n。排在他下面的n?- 1個(gè)樣本的預(yù)測分?jǐn)?shù)都小于score_p1,其中包含M - 1個(gè)正樣本,rank為n的正樣本與M - 1個(gè)正樣本的組合不在統(tǒng)計(jì)范圍內(nèi),不符合要求的有M個(gè)?所以要減掉。同理,排在n-1位的,有M - 1不符合要求,依此類推,得到如下公式:

舉例來說:

IDlabelscore
A00.1
B00.4
C10.35
D10.8

按score排序,正樣本D、C的rank值為4、2,則AUC為:

AUC = ((4 + 2) - 2 * (2 + 1) / 2)) / 2 * 2 = 3 / 4 = 0.75

假如出現(xiàn)得分一致的情況,

IDlabelscore
A00.1
B00.4
C10.4
D10.8

?

原則是相等得分的rank取平均值。
先排序:

IDlabelscorerank
A00.11
B00.42
C10.43
D10.84

D的rank為4,C的rank為(2+3)/2 = 2.5,則AUC為:

AUC = (4 + 2.5 - 2 * 3 / 2) / (2 * 2) = 3.5 / 4 = 0.875。

?

參考文獻(xiàn):

https://www.cnblogs.com/zhizhan/p/6000190.html

https://zhuanlan.zhihu.com/p/37576578

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

總結(jié)

以上是生活随笔為你收集整理的ROC曲线及如何计算AUC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。