R语言︱ROC曲线——分类器的性能表现评价

来源:互联网 发布:cookie统计uv存数据 编辑:程序博客网 时间:2024/05/20 20:21






笔者寄语:分类器算法最后都会有一个预测精度,而预测精度都会写一个混淆矩阵,所有的训练数据都会落入这个矩阵中,而对角线上的数字代表了预测正确的数目,即True Positive+True Nagetive。


——————————————————————————


相关内容:

1、 R语言︱ROC曲线——分类器的性能表现评价

2、机器学习中的过拟合问题

3、R语言︱机器学习模型评估方案(以随机森林算法为例)


——————————————————————————


1、TPR与TNR


同时可以相应算出TPR(真正率或称为灵敏度)和TNR(真负率或称为特异度)。我们主观上希望这两个指标越大越好,但可惜二者是一个此消彼涨的关系。除了分类器的训练参数,临界点的选择,也会大大的影响TPR和TNR。有时可以根据具体问题和需要,来选择具体的临界点。



来看看这个图就一目了然了,ROC曲线需要两个数据集,预测数据+实际数据。


如果我们选择一系列的临界点,就会得到一系列的TPR和TNR,将这些值对应的点连接起来,就构成了ROC曲线。ROC曲线可以帮助我们清楚的了解到这个分类器的性能表现,还能方便比较不同分类器的性能。在绘制ROC曲线的时候,习惯上是使用1-TNR作为横坐标,TPR作为纵坐标。下面来看看如何在R语言中绘制ROC曲线。


2、AUC值


为了更好的衡量ROC所表达结果的好坏,Area Under Curve(AUC)被提了出来,简单来说就是曲线右下角部分占正方形格子的面积比例。该比例代表着分类器预测精度。


————————————————————————————————————————————————————————


R语言中ROC曲线的绘制


参考以下的博客:转载于:http://www.r-bloggers.com/lang/chinese/1205

该博客示范了三种画出ROC曲线的方法,第一种主动自己运算、第二种ROCR包、第三种pROC包。



1、自己运算

# 做一个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)



2、ROCR包


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)


注意:其中pre是分类器预测的模型,而newdata$y是实际值。


3、pROC包


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)


——————————————————————————————————————————————

笔者在操作的时候出现以下的问题:

Error in prediction(tablebank, bank_part$y_n) : Number of cross-validation runs must be equal for predictions and labels.

网上的解决方案有:

在这种情况下预测(预测,标签,标签。 点= NULL)函数类的“预测”和“标签”变量应该列表或矩阵。


本文有两个ROC曲线绘制包,可参考。

转载于:http://www.r-bloggers.com/lang/chinese/1205


每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~

———————————————————————————

0 0
原创粉丝点击