ROC
ROC的定義
比方說(shuō)在一個(gè)10000個(gè)人的數(shù)據(jù)集中队伟,有100個(gè)人得了某種病癥蚂蕴,你的任務(wù)是來(lái)預(yù)測(cè)哪些人得了這種病癥。你預(yù)測(cè)出了200人得了癌癥诊县,其中: * TN,True Negative:沒有得癌癥并且你也預(yù)測(cè)對(duì)沒有得癌癥的有9760人 * TP措左,True Positive:得了癌癥而且你也預(yù)測(cè)出來(lái)的病人有60人 * FN依痊,F(xiàn)alse Negative:得了癌癥但是你沒有預(yù)測(cè)出來(lái)的病人有40人 * FP,F(xiàn)alse Positive:沒有的癌癥但是你預(yù)測(cè)得了癌癥的有140人
- True Positive Rate(TPR): 60/(60+40)=0.6
- False Positive Rate(FPR): 140/(9760+140)=0.0141
- accuracy: (9760+60)/10000=0.982
- precision: 60/(60+140)=0.3
- recall: 60/100=0.6
預(yù)測(cè) \ 實(shí)際 | Positive 陽(yáng) 100 | Negative 陰 9900 |
---|---|---|
Positive 陽(yáng) 200 | True Positive怎披,真陽(yáng)性胸嘁,TP 60 | False Positive瓶摆,假陽(yáng)性,F(xiàn)P 140 |
Negative 陰 9800 | False Negative缴渊,假陰性赏壹,F(xiàn)N 40 | True Negative,真陰性衔沼,TN 9760 |
- 在所有實(shí)際為陰性的樣本中,被錯(cuò)誤地判斷為陽(yáng)性之比率昔瞧。 FPR = FP rate = FP / ( FP + TN )
- 在所有實(shí)際為陽(yáng)性的樣本中指蚁,被正確地判斷為陽(yáng)性之比率。TPR = TP rate = TP / (TP + FN)
- precision = TP / (TP + FP)
- recall = TPR = TP / (TP + FN)
- accuracy = ( TP + TN ) / ALL
- F-measure = 2 / (1/precision + 1 /recall)
放在具體領(lǐng)域來(lái)理解上述兩個(gè)指標(biāo)自晰。如在醫(yī)學(xué)診斷中凝化,判斷有病的樣本。那么盡量把有病的揪出來(lái)是主要任務(wù)酬荞,也就是第一個(gè)指標(biāo)TPR搓劫,要越高越好。而把沒病的樣本誤診為有病的混巧,也就是第二個(gè)指標(biāo)FPR枪向,要越低越好。不難發(fā)現(xiàn)咧党,這兩個(gè)指標(biāo)之間是相互制約的秘蛔。如果某個(gè)醫(yī)生對(duì)于有病的癥狀比較敏感,稍微的小癥狀都判斷為有病傍衡,那么他的第一個(gè)指標(biāo)應(yīng)該會(huì)很高深员,但是第二個(gè)指標(biāo)也就相應(yīng)地變高。最極端的情況下蛙埂,他把所有的樣本都看做有病倦畅,那么第一個(gè)指標(biāo)達(dá)到1,第二個(gè)指標(biāo)也為1绣的。
在上述癌癥檢測(cè)中(正反例極度不平衡的情況下)叠赐,
- accuracy意義不大,從結(jié)果中可看出被辑,因?yàn)檎容^少燎悍,所以檢測(cè)再不怎么準(zhǔn)確,其accuracy值都很高盼理。
- recall則是相對(duì)于真實(shí)情況而言的谈山,你正確檢測(cè)了60例癌癥病人,總癌癥病人有100例宏怔,那么recall則為60%奏路。
- precision則是相對(duì)于模型預(yù)測(cè)情況而言的畴椰,你預(yù)測(cè)了200例癌癥病人,其中預(yù)測(cè)準(zhǔn)確的有60例鸽粉,那么precision則為30%斜脂;
- 所以我們是希望能看到模型的recall和precision都很高,但是一般兩者難以同時(shí)達(dá)到最優(yōu)值触机,需要做一個(gè)權(quán)衡
有時(shí)我們還會(huì)見到sensitivity和specificity兩個(gè)概念:
- sensitivity = recall = True Positive Rate
- specificity = 1- False Positive Rate
也就是說(shuō)想要sensitivity高一點(diǎn)相當(dāng)于要True Positive Rate高一點(diǎn)帚戳,要specificity高一點(diǎn)相當(dāng)于False Positive Rate低一點(diǎn)/。為了權(quán)衡recall和precision儡首,對(duì)于評(píng)判二分類器的優(yōu)劣片任,可以使用ROC(Receiver Operating Characteristic)曲線以及AUC(Area Under roc Curve)指標(biāo)。
ROC的圖形化與計(jì)算
ROC曲線的幾個(gè)概念:
- 橫坐標(biāo)是FPR蔬胯,縱坐標(biāo)是TPR
- 圖中每個(gè)點(diǎn)則是不同"截?cái)帱c(diǎn)/閾值"下計(jì)算的FPR和TPR对供,截?cái)帱c(diǎn)/閾值 相當(dāng)于模型對(duì)于樣本的概率輸出,也可以說(shuō)是打分score
以醫(yī)生診斷為例氛濒,我們可以看出:
- 左上角的點(diǎn)(TPR=1产场,F(xiàn)PR=0),為完美分類舞竿,也就是這個(gè)醫(yī)生醫(yī)術(shù)高明京景,診斷全對(duì);
- 點(diǎn)A(TPR>FPR)炬灭,醫(yī)生A的判斷大體是正確的醋粟;
- 中線上的點(diǎn)代表醫(yī)生給的結(jié)果與隨機(jī)按照一定比例報(bào)告病人患病的結(jié)果是一樣的,從左下角到右上角分別代表隨機(jī)的比例是0%到100%重归,隨機(jī)比例是50%時(shí)才代表一半對(duì)一半錯(cuò)米愿,即圖像中正中間的那個(gè)點(diǎn)。當(dāng)圖中點(diǎn)B位于0.5的位置時(shí)(TPR=FPR)鼻吮,也就是醫(yī)生B全都是蒙的育苟,蒙對(duì)一半,蒙錯(cuò)一半椎木;
- 下半平面的點(diǎn)C(TPR<FPR)违柏,這個(gè)醫(yī)生說(shuō)你有病,那么你很可能沒有病香椎,醫(yī)生C的話我們要反著聽漱竖,為真庸醫(yī)。
上圖中一個(gè)閾值畜伐,得到一個(gè)點(diǎn)♀扇牵現(xiàn)在我們需要一個(gè)獨(dú)立于閾值的評(píng)價(jià)指標(biāo)來(lái)衡量這個(gè)醫(yī)生的醫(yī)術(shù)如何,也就是遍歷所有的閾值,得到ROC曲線万矾。還是一開始的那幅圖悼吱,假設(shè)如下就是某個(gè)醫(yī)生的診斷統(tǒng)計(jì)圖,直線代表閾值良狈。我們遍歷所有的閾值后添,能夠在ROC平面上得到如下的ROC曲線。
以一個(gè)簡(jiǎn)單的模擬數(shù)據(jù)來(lái)計(jì)算下ROC曲線每個(gè)點(diǎn)的值
- 先有一組真實(shí)分類薪丁,比如0,1,0,1,即正例為2個(gè)遇西,反例為2個(gè);然后一組模型預(yù)測(cè)的打分(概率)严嗜,比如:0.2,0.3,0.5,0.8
- 依據(jù)上述打分依次計(jì)算每個(gè)樣本輸出概率下的FPR和TPR
- 首先截?cái)帱c(diǎn)為0.2努溃,即設(shè)定閾值為0.2,當(dāng)概率大于等于0.2時(shí)阻问,則預(yù)測(cè)為正例,因此4個(gè)樣本均為正例沦疾,此時(shí) TP = 2, FN = 0, FP = 2,TN = 0; FPR= FP / ( FP + TN ) = 2 / (2+0) = 1称近,TPR=TP / (TP + FN) = 2 / (2+0) = 1
- 接著截?cái)帱c(diǎn)為0.3,即設(shè)定閾值為0.23哮塞,因此當(dāng)概率大于等于0.3時(shí)預(yù)測(cè)為正例刨秆,因此樣本1預(yù)測(cè)為反例,樣本2-4為正例忆畅,這時(shí)的此時(shí) TP = 2, FN = 0, FP = 1,TN = 1; FPR= FP / ( FP + TN ) = 1 / (1+1) = 0.5衡未,TPR=TP / (TP + FN) = 2 / (2+0) = 1
- 計(jì)算截?cái)帱c(diǎn)0.5,即設(shè)定閾值為0.5時(shí)家凯,F(xiàn)PR=0.5缓醋,TPR=0.5;
- 計(jì)算截?cái)帱c(diǎn)0.8绊诲,即設(shè)定閾值為0.8時(shí)送粱,F(xiàn)PR=0,TPR=0.5掂之;
Python可以用sklearn抗俄,R可以用ROCR包或者pROC包,這里以ROCR包來(lái)檢驗(yàn)下上述計(jì)算結(jié)果:
library(ROCR)
y <- c(0,1,0,1)
p <- c(0.2,0.3,0.5,0.8)
pred <- prediction(p, y)
perf <- performance(pred, "tpr", "fpr")
> perf
An object of class "performance"
Slot "x.name":
[1] "False positive rate"
Slot "y.name":
[1] "True positive rate"
Slot "alpha.name":
[1] "Cutoff"
Slot "x.values":
[[1]]
[1] 0.0 0.0 0.5 0.5 1.0
Slot "y.values":
[[1]]
[1] 0.0 0.5 0.5 1.0 1.0
Slot "alpha.values":
[[1]]
[1] Inf 0.8 0.5 0.3 0.2
x.values對(duì)應(yīng)FPR世舰,y.values對(duì)應(yīng)TPR, alpha.values對(duì)應(yīng)預(yù)測(cè)打分cutoff动雹,結(jié)果跟上面完全一致,然后簡(jiǎn)單做個(gè)ROC圖跟压。
library(pROC)
modelroc <- roc(y,p)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE)
AUC
AUC的定義
AUC值就相當(dāng)于ROC曲線的所覆蓋的面積胰蝠,可以從ROC曲線看出AUC值越大,其分類效果越好。
- AUC = 1姊氓,是完美分類器丐怯,采用這個(gè)預(yù)測(cè)模型時(shí),不管設(shè)定什么閾值都能得出完美預(yù)測(cè)翔横。絕大多數(shù)預(yù)測(cè)的場(chǎng)合读跷,不存在完美分類器。
- 0.5 < AUC < 1禾唁,優(yōu)于隨機(jī)猜測(cè)效览。這個(gè)分類器(模型)妥善設(shè)定閾值的話,能有預(yù)測(cè)價(jià)值荡短。
- AUC = 0.5丐枉,跟隨機(jī)猜測(cè)一樣(例:丟銅板),模型沒有預(yù)測(cè)價(jià)值掘托。
- AUC < 0.5瘦锹,比隨機(jī)猜測(cè)還差;但只要總是反預(yù)測(cè)而行闪盔,就優(yōu)于隨機(jī)猜測(cè)弯院。
如何計(jì)算AUC
- 方法一:從早期的計(jì)算ROC曲線下的面積
- 方法二:通過(guò)計(jì)算正例score大于反例score的概率:
仍是上面的例子,真實(shí)分類:0,1,0,1泪掀,即正例為2個(gè)听绳,記為M個(gè),反例為2個(gè)异赫,記為N個(gè)椅挣;模型預(yù)測(cè)的打分:0.2,0.3,0.5,0.8。
正例有2個(gè)(0.3和0.8)塔拳,反例有2個(gè)(0.2和0.5)鼠证,那么總共有2*2=4對(duì)([0.3,0.2],[0.8,0.2],[0.3,0.5],[0.8,0.5])正反樣本對(duì)。
通過(guò)其模型預(yù)測(cè)的score可看出正例的score大于反例的有3對(duì)([0.3,0.2],[0.8,0.2],[0.8,0.5])(此處理解應(yīng)為[0.3,0.2],0.3為正例蝙斜,0.2為反例名惩,0.3>0.2),因此AUC則為3/4=0.75 - 方法三:當(dāng)樣本比較多時(shí)孕荠,上述算法的復(fù)雜度過(guò)高O(N*M)娩鹉,有人提出一個(gè)簡(jiǎn)單的算法:對(duì)score從到小排序,最大的score排序索引為n稚伍,最小的則為1弯予;然后將正例的索引求和,減去正例-正例這種組合的個(gè)數(shù)M*(M+1)/2个曙;最后除以M*N锈嫩。
以上述為例:(0.2,0.3,0.5,0.8) →(1受楼,2,3呼寸,4)艳汽,正例的排序索引為2和4,M和N都為2对雪,因此AUC=(2+4-2*(2+1)/2)/(2*2)=0.75