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é)果是這個樣子
