# 做一個(gè)logistic回歸,生成概率預(yù)測值
model1 <- glm(y~., data=newdata, family='binomial')
pre <- predict(model1,type='response')
# 將預(yù)測概率prob和實(shí)際結(jié)果y放在一個(gè)數(shù)據(jù)框中
data <- data.frame(prob=pre,obs=newdata$y)
# 按預(yù)測概率從低到高排序
data <- data[order(data$prob),]
n <- nrow(data)
tpr <- fpr <- rep(0,n)
# 根據(jù)不同的臨界值threshold來計(jì)算TPR和FPR,之后繪制成圖
for (i in 1:n) {
threshold <- data$prob[i]
tp <- sum(data$prob > threshold & data$obs == 1)
fp <- sum(data$prob > threshold & data$obs == 0)
tn <- sum(data$prob < threshold & data$obs == 0)
fn <- sum(data$prob < threshold & data$obs == 1)
tpr[i] <- tp/(tp+fn) # 真正率
fpr[i] <- fp/(tn+fp) # 假正率
}
plot(fpr,tpr,type='l')
abline(a=0,b=1)
R中也有專門用來繪制ROC曲線的包,例如常見的ROCR包,它不僅可以用來畫圖,還能計(jì)算ROC曲線下面積AUC,以評(píng)價(jià)分類器的綜合性能,該數(shù)值取0-1之間,越大越好。
library(ROCR)
pred <- prediction(pre,newdata$y)
performance(pred,'auc')@y.values #AUC值
perf <- performance(pred,'tpr','fpr')
plot(perf)
ROCR包畫圖函數(shù)功能比較單一,筆者比較偏好使用功能更強(qiáng)大的pROC包。它可以方便比較兩個(gè)分類器,還能自動(dòng)標(biāo)注出最優(yōu)的臨界點(diǎn),圖看起來也比較漂亮。
library(pROC)
modelroc <- roc(newdata$y,pre)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
grid.col=c("green", "red"), max.auc.polygon=TRUE,
auc.polygon.col="skyblue", print.thres=TRUE)