視頻|分類模型評(píng)估:精確率、召回率、ROC曲線、AUC與R語言生存分析時(shí)間依賴性ROC實(shí)現(xiàn)
全文鏈接:http://tecdat.cn/?p=20650?
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
?
視頻|分類模型評(píng)估:精確率、召回率、ROC曲線、AUC與R語言生存分析時(shí)間依賴性ROC實(shí)現(xiàn)
分類模型評(píng)估精確率、召回率、ROC曲線、AUC與R語言生存分析時(shí)間依賴性ROC實(shí)現(xiàn)
本文將幫助您回答以下問題:
ROC曲線是什么?
曲線下的面積是多少?
二元分類的決策閾值是多少?
分類模型可接受的 AUC值是多少?
什么是精確召回曲線?
什么時(shí)候應(yīng)該使用精確召回和 ROC 曲線?
什么是ROC曲線?
如果你用搜索 ROC 曲線,你會(huì)得到以下答案:
“接受者操作特征曲線或 ROC 曲線是一個(gè)圖形,它說明了二元分類器系統(tǒng)在其區(qū)分閾值變化時(shí)的診斷能力。”?
這個(gè)定義不容易理解,對(duì)初學(xué)者來說可能聽起來很嚇人。
本文旨在幫助您以一種簡(jiǎn)單的語言理解 ROC 曲線,以便您可以在 ROC 曲線背后建立一些基本思想。
在我們進(jìn)入 ROC 曲線之前,我們需要記住混淆矩陣是什么。

混淆矩陣
混淆矩陣幫助我們可視化模型在區(qū)分兩個(gè)類別時(shí)是否“錯(cuò)誤”。它是一個(gè) 2x2 矩陣。行名是測(cè)試集中的實(shí)際值,列名是模型預(yù)測(cè)的。
Positive或Negative是 ML 模型預(yù)測(cè)標(biāo)簽的名稱。每當(dāng)預(yù)測(cè)錯(cuò)誤時(shí),第一個(gè)詞是False,當(dāng)預(yù)測(cè)正確時(shí),第一個(gè)詞是True。
ROC曲線基于從混淆矩陣得出的兩個(gè)指標(biāo):真正例率 (?TPR?) 和假正例率 (?FPR?)。TPR與召回率相同。它是正確預(yù)測(cè)的正樣本除以數(shù)據(jù)集中可用的所有實(shí)際正樣本的比率。
TPR 側(cè)重于實(shí)際的正類:

真正例率公式
反過來,F(xiàn)PR 是假正例預(yù)測(cè)與真負(fù)樣本總數(shù)的比率。

FPR公式
ROC 曲線是基于 TPR 和 FPR 繪制的。

ROC曲線示例
通過使用 TPR 和 FPR,ROC 曲線顯示了您的分類模型在所有分類閾值下的性能。
但是分類決策閾值是多少?
首先,你的分類 ML 模型輸出是一個(gè)概率。例如,您構(gòu)建一個(gè)分類器來根據(jù)給定人的體重預(yù)測(cè)性別(女性或男性)。假設(shè)正類是女性(1),負(fù)類是男性(0)。然后,您將 150 公斤的重量樣本傳遞給您的 ML 模型,該模型預(yù)測(cè)的概率為 0.23。
默認(rèn)情況下,您的分類閾值為 0.5。任何高于 0.5 的概率將被歸類為 1 類(正),低于 0.5 的概率將被歸為 0 類(負(fù))。給定 0.23 的概率,體重 150 公斤的人將被歸類為負(fù)類(男性)。
簡(jiǎn)而言之,您使用此閾值作為截止值,將預(yù)測(cè)結(jié)果分類為正類或負(fù)類。這是一個(gè)后處理步驟,將預(yù)測(cè)概率作為二進(jìn)制類別返回。通過更改閾值,您的 TP、TN、FP 和 FN 將發(fā)生變化,因此您可以根據(jù)要改進(jìn)的指標(biāo)對(duì)其進(jìn)行優(yōu)化。
因此,ROC 反過來會(huì)告訴您您的 ML 模型能夠在多大程度上區(qū)分不同閾值的兩個(gè)類別。
您使用稱為AUC曲線下面積來測(cè)量 ROC。您使用 AUC 來評(píng)估算法的質(zhì)量,以便在兩個(gè)類別之間進(jìn)行檢測(cè)。

A?rea?U?under?the?Curve:?AUC?
讓我們通過圖形示例來回顧 ROC。
假設(shè)我們正在建立一個(gè)模型來預(yù)測(cè):申請(qǐng)人是償還貸款還是壞帳。
在下圖中,藍(lán)線是正類預(yù)測(cè)概率的分布,表示申請(qǐng)者拒付(未能償還),紅線是負(fù)類預(yù)測(cè)概率分布,表示申請(qǐng)者將償還。
在以下情況下,AUC 為 0.70。這意味著該模型能夠正確區(qū)分正類和負(fù)類之間的 70%。

AUC=0.7
顯然,我們離理想的情況還很遠(yuǎn)。曲線將重疊,這意味著我們的 ML 模型會(huì)犯錯(cuò)誤,我們將其視為誤報(bào)。

理想分類器示例
上述案例說明了當(dāng)我們的 ML 模型正確預(yù)測(cè)兩個(gè)類時(shí)的理想情況。分布之間沒有重疊。該模型可以完美區(qū)分正類和負(fù)類,是一個(gè)理想的分類器。
可能存在 AUC 為 0.5 的情況。這意味著我們的 ML 模型無法區(qū)分正類和負(fù)類。它實(shí)際上是一個(gè)隨機(jī)分類器。

AUC = 0.5
有時(shí) AUC 為 0。這意味著模型反向預(yù)測(cè)類別。該模型認(rèn)為負(fù)類是正類,反之亦然。

AUC = 0
總而言之,合理的 AUC 超過 0.5(隨機(jī)分類器),而好的分類模型的 AUC > 0.9。然而,這個(gè)值高度依賴于它的應(yīng)用。
R語言中生存分析模型與時(shí)間依賴性ROC曲線可視化
視頻:R語言生存分析原理與晚期肺癌患者分析案例
R語言生存分析Survival analysis原理與晚期肺癌患者分析案例
人們通常使用接收者操作特征曲線(ROC)進(jìn)行二元結(jié)果邏輯回歸。但是,流行病學(xué)研究中感興趣的結(jié)果通常是事件發(fā)生時(shí)間。使用隨時(shí)間變化的時(shí)間依賴性ROC可以更全面地描述這種情況下的預(yù)測(cè)模型。
時(shí)間依賴性ROC定義
令 Mi為用于死亡率預(yù)測(cè)的基線(時(shí)間0)標(biāo)量標(biāo)記。?當(dāng)隨時(shí)間推移觀察到結(jié)果時(shí),其預(yù)測(cè)性能取決于評(píng)估時(shí)間?t。直觀地說,在零時(shí)間測(cè)量的標(biāo)記值應(yīng)該變得不那么相關(guān)。因此,ROC測(cè)得的預(yù)測(cè)性能(區(qū)分)是時(shí)間t的函數(shù)?。?
累積病例
累積病例/動(dòng)態(tài)ROC定義了在時(shí)間t?處的閾值c處的?靈敏度和特異性,??如下所示。

累積靈敏度將在時(shí)間t之前死亡的視為分母(疾?。鴮?biāo)記值高于?c?的作為真實(shí)陽性(疾病陽性)。動(dòng)態(tài)特異性將在時(shí)間t仍然活著作為分母(健康),并將標(biāo)記值小于或等于?c?的那些作為真實(shí)陰性(健康中的陰性)。將閾值?c?從最小值更改為最大值會(huì)在時(shí)間t處顯示整個(gè)ROC曲線?。
新發(fā)病例
新發(fā)病例ROC1在時(shí)間t?處以閾值?c定義靈敏度和特異性,??如下所示。

累積靈敏度將在時(shí)間t處死亡的人??視為分母(疾?。?,而將標(biāo)記值高于???的人視為真實(shí)陽性(疾病陽性)。
數(shù)據(jù)準(zhǔn)備
我們以數(shù)據(jù)?包中的dataset3survival
為例。事件發(fā)生的時(shí)間就是死亡的時(shí)間。Kaplan-Meier圖如下。
## 變成data_frame
data <- as_data_frame(data)
## 繪圖
plot(survfit(Surv(futime, fustat) ~ 1,
data = data)
可視化結(jié)果:

在數(shù)據(jù)集中超過720天沒有發(fā)生任何事件。
## 擬合cox模型
coxph(formula = Surv(futime, fustat) ~ pspline(age, df = 4) +
##獲得線性預(yù)測(cè)值
predict(coxph1, type = "lp")

累積病例
實(shí)現(xiàn)了累積病例
## 定義一個(gè)輔助函數(shù),以在不同的時(shí)間進(jìn)行評(píng)估
ROC_hlp <- function(t) {
survivalROC(Stime
status
marker
predict.time = t,
method ? ? ? = "NNE",
span = 0.25 * nrow(ovarian)^(-0.20))
}
## 每180天評(píng)估一次
ROC_data <- data_frame(t = 180 * c(1,2,3,4,5,6)) %>%
mutate(survivalROC = map(t, survivalROC_helper),
## 提取AUC
auc = map_dbl(survivalROC, magrittr::extract2, "AUC"),
## 在data_frame中放相關(guān)的值
df_survivalROC = map(survivalROC, function(obj) {
## 繪圖
ggplot(mapping = aes(x = FP, y = TP)) +
geom_point() +
geom_line() +
facet_wrap( ~ t) +

可視化結(jié)果:

180天的ROC看起來是最好的。因?yàn)榈酱丝虨橹箮缀鯖]有事件。在最后觀察到的事件(t≥720)之后,AUC穩(wěn)定在0.856。這種表現(xiàn)并沒有衰退,因?yàn)楦唢L(fēng)險(xiǎn)分?jǐn)?shù)的人死了。
新發(fā)病例
實(shí)現(xiàn)新發(fā)病例
## 定義一個(gè)輔助函數(shù),以在不同的時(shí)間進(jìn)行評(píng)估
## 每180天評(píng)估一次
## 提取AUC
auc = map_dbl(risksetROC, magrittr::extract2, "AUC"),
## 在data_frame中放相關(guān)的值
df_risksetROC = map(risksetROC, function(obj) {
## 標(biāo)記欄
marker <- c(-Inf, obj[["marker"]], Inf)
## 繪圖
ggplot(mapping = aes(x = FP, y = TP)) +
geom_point() +
geom_line() +
geom_label(data = risksetROC_data %>% dplyr::select(t,auc) %>% unique,
facet_wrap( ~ t) +

可視化結(jié)果:

這種差異在后期更為明顯。最值得注意的是,只有在每個(gè)時(shí)間點(diǎn)處于風(fēng)險(xiǎn)集中的個(gè)體才能提供數(shù)據(jù)。所以數(shù)據(jù)點(diǎn)少了。表現(xiàn)的衰退更為明顯,也許是因?yàn)樵谀切┐婊顣r(shí)間足夠長(zhǎng)的人中,時(shí)間零點(diǎn)的風(fēng)險(xiǎn)分沒有那么重要。一旦沒有事件,ROC基本上就會(huì)趨于平緩。
結(jié)論
總之,我們研究了時(shí)間依賴的ROC及其R實(shí)現(xiàn)。累積病例ROC可能與風(fēng)險(xiǎn)?(累積發(fā)生率)預(yù)測(cè)模型的概念更兼容?。新發(fā)病例ROC可用于檢查時(shí)間零標(biāo)記在預(yù)測(cè)后續(xù)事件時(shí)的相關(guān)性。
參考
Heagerty,Patrick J. and Zheng,Yingye,??Survival Model Predictive Accuracy and ROC Curves,Biometrics,61(1),92-105(2005).?doi:10.1111 / j.0006-341X.2005.030814.x.