如果我们选择一系列的临界点,就会得到一系列的TPR和TNR,将这些值对应的点连接起来,就构成了ROC曲线。ROC曲线可以帮助我们清楚的了解到这个分类器的性能表现,还能方便比较不同分类器的性能。在绘制ROC曲线的时候,习惯上是使用1-TNR作为横坐标,TPR作为纵坐标。下面来看看如何在R语言中绘制ROC曲线。
# 做一个logistic回归,生成概率预测值 model1 <- glm(y~., data=newdata, family='binomial') pre <- predict(model1,type='response') # 将预测概率prob和实际结果y放在一个数据框中 data <- data.frame(prob=pre,obs=newdata$y) # 按预测概率从低到高排序 data <- data[order(data$prob),] n <- nrow(data) tpr <- fpr <- rep(0,n) # 根据不同的临界值threshold来计算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包,它不仅可以用来画图,还能计算ROC曲线下面积AUC,以评价分类器的综合性能,该数值取0-1之间,越大越好。 library(ROCR) pred <- prediction(pre,newdata$y) performance(pred,'auc')@y.values #AUC值 perf <- performance(pred,'tpr','fpr') plot(perf)
ROCR包画图函数功能比较单一,笔者比较偏好使用功能更强大的pROC包。它可以方便比较两个分类器,还能自动标注出最优的临界点,图看起来也比较漂亮。 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)
实际工作中也经常使用K-S曲线,将ROC曲线的X,Y坐标数据画成两条曲线,两条曲线的的最大距离作为模型KS值,衡量模型的区分效果。
回复删除请问newdata 在哪呢?
回复删除数据就是随便人工生成一个都可以。
删除应该谈谈为何使用ROC和AUC吧。。。
回复删除ROC貌似是检验处理不平衡数据的一种性能指标
删除这点比较同意,平衡的分类问题中,一般使用准确率来衡量。
删除楼主对AUC的解析性质有没有见解呢?很多要求最大化AUC的数据挖掘问题,感觉如果知道了它的解析性质的话更容易用一些梯度的方法什么的~
回复删除