StatQuest學習筆記|用R繪制ROC和AUC

ROC(Receiver Operating Characteristic),在同一模型中找到最適合的閾值

AUC(Area Under Curve),比較不同模型

ROC和AUC的橫坐標為1-specificities,縱坐標為sensitivities。

一個模型可接受sensitivities和specificities根據(jù)實例的不同而不同,比如預測是否患埃博拉病毒,這個模型對sensitivities要求比較高,希望盡可能得提高true positivitive,所以可接受的false positivitive程度也就比較高

specificities和sensitivities因閾值改變而不同,所以可以通過ROC來找到合適的閾值

AUC是ROC曲線下面積,數(shù)值越大,預測效果越好

在本例中,先隨機生成一組體重和肥胖程度的數(shù)據(jù)用來模擬分析,然后分別用Logistic Regression和Random Forest根據(jù)體重對是否肥胖進行預測,從而找到預測更好的模型



#加載pROC和randomForest包

library(pROC)

library(randomForest)

#生成數(shù)據(jù)

#設置隨機數(shù)

set.seed(420)

#設定樣本容量

num.samples <- 100

#生成100個平均數(shù)為172,標準差為29的數(shù)據(jù),并且排序

weight <- sort(rnorm(n=num.samples,mean=172, sd=29 ))

#生成肥胖程度的數(shù)據(jù)

????#rank(weight)返回的是數(shù)字排位,即最小的為1,最大的為100,rank(weight)/100得到0.1, 0.2, ..., 100

????#test=(runif(n=num.samples) 生成0~1范圍內(nèi)的100個隨機數(shù)

? ? #ifelse為判斷函數(shù),若生成的隨機數(shù)(test)小于rank(weight)/100,則值為1,否則為0,所以obese數(shù)值特征為共100個數(shù)字,前半段大多數(shù)為0,后半段大多數(shù)為1,即體重輕的大多不肥胖,體重重的大多肥胖。

obese <- ifelse(test=(runif(n=num.samples) < (rank(weight)/100)), yes=1, no=0)

#繪制散點圖看weight和obese的分布

plot(x=weight, y=obese)

#Logistic Regression?估計體重與肥胖之間的關系

#使用glm包,做邏輯回歸 響應變量服從二項分布

glm.fit=glm(obese ~ weight, family=biominal)

#顯示邏輯回歸曲線

lines(weight, glm.fit$fitted.values)

###通過計算ROC和AUC來評價logistic regression model

#首先限定圖像是正方形的(為了好看)

par(pty = "s")

#繪制roc曲線

? ? #roc曲線默認的橫坐標是specificity,縱坐標是sensitivity

? ? #通過legacy.axes=TRUE將縱坐標改為(1- specificity)

? ? #percent=TRUE將坐標設置為百分數(shù)

? ? #xlab="False Positive Percentage", ylab="True Postive Percentage"設置橫縱坐標名稱

? ? #col="#377eb8"設置曲線顏色, 具體顏色代碼可以在colorbrewer website上找到

? ? #lwd=4設置roc曲線的粗細

roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE,

? ? xlab="False Positive Percentage", ylab="True Postive Percentage",

? ? col="#377eb8", lwd=4)

#查看roc信息,roc.df第一列為sensitiviities,第二列為1 - specificities,第三列為對應閾值

roc.info <- roc(obese, glm.fit$fitted.values, legacy.axes=TRUE)

roc.df <- data.frame(tpp=roc.info$sensitiviities*100, fpp=(1 - roc.info$specificities)*100, thresholds=roc.info$thresholds)

#添加AUC信息

#print.auc=TRUE

#print.auc.x=45 AUC圖標在圖片上的位置

roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE,

? ? xlab="False Positive Percentage", ylab="True Postive Percentage",

? ? col="#377eb8", lwd=4,?

????print.auc=TRUE, print.auc.x=45)

#也可單獨顯示部分ROC線下圖形

????#partial.auc=c(100,90) 當specificities取值在0-0.1的時候

????#auc.polygon = TRUE顯示出曲線包圍的圖形

????#auc.polygon.col = "#377eb822"設置所取區(qū)域AUC的顏色

roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE,

? ? xlab="False Positive Percentage", ylab="True Postive Percentage",

? ? col="#377eb8", lwd=4,?

????print.auc=TRUE, print.auc.x=45,

? ? partial.auc=c(100,90), auc.polygon = TRUE, auc.polygon.col = "#377eb822")

#利用隨機森林估計體重與肥胖之間的關系

rf.model <- randomForest(factor(obese) ~ weight)

#先繪制logistic regression的曲線

roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE,

? ? xlab="False Positive Percentage", ylab="True Postive Percentage",

? ? col="#377eb8", lwd=4, print.auc=TRUE)

#然后利用add=TRUE將隨即森林的ROC曲線和logistic regression的ROC曲線上顯示在一張圖,記得設置不同的顏色,并且把AUC的圖標隔開

plot.roc(obese. rf.model$votes[,1],percent=TRUE,

? ? ? ? col="#4da4a", lwd=1, print.auc=TRUE, add=TRUE, print.auc.y=40)

#重新設置畫布大小,即將畫布設置為盡可能地不留空白

par(pty = "m")




最終結(jié)果是這個樣子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容