机器学习中的ROC曲线和AUC指标

ROC曲线的概念及绘制

关于混淆矩阵中TN,FP,FN,TP的计算可以参考我之前的文章
链接: 机器学习模型评估的重要指标:精确率、召回率、F1Score.

ROC曲线反应了TPR和FPR之间的关系。
在这里插入图片描述
真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例

在这里插入图片描述
负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。

我们来举个例子看如何计算TPR和FPR。
在这里插入图片描述
当我们阈值设置为0.9时,即认为socre要大于等于0.9才会判断为P时,对应的TPR = 1 / ( 1 + 9) = 10%,FPR = 0 / (0 + 10) = 0%

当我们阈值设置为0.5时,即认为socre要大于等于0.5才会判断为P时,对应的TPR = 6 / ( 4 + 6) = 60%,FPR = 4 / (4 + 6) = 40%

如果把每个socre都当做一个阈值来算出TPR和FPR,最后画出的图像如下图所示。
在这里插入图片描述

使用sklearn绘制ROC曲线

from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression,LogisticRegression
from sklearn.model_selection import train_test_split

digits = datasets.load_digits()
X = digits.data
y = digits.target.copy()
y[digits.target == 9] = 1
y[digits.target != 9] = 0
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=666)

log_reg = LogisticRegression() #构建逻辑回归模型
log_reg.fit(X_train,y_train) #使用训练数据集训练模型
y_predict = log_reg.predict(X_test) #将测试数据传入训练好的模型中,让模型预测测试数据的结果
decision_scores = log_reg.decision_function(X_test)

sklearn中roc_curve输入样本真实值和对应模型输出的分数,可以直接返回fpr,tpr和对应的阈值。

from sklearn.metrics import roc_curve
fprs, tprs, thresholds = roc_curve(y_test,decision_scores)
plt.plot(fprs,tprs)
plt.xlabel("fpr")
plt.ylabel('tprs')
plt.show()

图像如下图所示:
在这里插入图片描述

利用ROC曲线评价模型性能

模型评价的关键指标——AUC。AUC表示ROC曲线下的面积,主要用于衡量模型的泛化性能,即分类效果的好坏。

一般在分类模型中,预测结果都是以概率的形式表现,如果要计算准确率,通常都会手动设置一个阈值来将对应的概率转化成类别,这个阈值也就很大程度上影响了模型准确率的计算。

AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

由此可见,Auc作为数值可以直观的评价分类器的好坏,值越大越好。

AUC值对模型性能的判断标准:

AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

sklearn求AUC值

使用roc_auc_score方法(area under curve),传入的和上面画roc曲线所传入的参数一致。

from sklearn.metrics import roc_auc_score
roc_auc_score(y_test,decision_scores)

ROC VS PR

关于PR曲线可以参考我上篇文章链接: 机器学习模型评估——精确率召回率和PR曲线.

在ROC空间,ROC曲线越凸向左上方向效果越好。与ROC曲线左上凸不同的是,PR曲线是右上凸效果越好。

ROC和PR曲线都被用于评估机器学习算法对一个给定数据集的分类性能,每个数据集都包含固定数目的正样本和负样本。而ROC曲线和PR曲线之间有着很深的关系。

当正负样本差距不大的情况下,ROC和PR的趋势是差不多的,但是当负样本很多的时候,两者就截然不同了,ROC效果依然看似很好,但是PR上反映效果一般。解释起来也简单,假设就1个正例,100个负例,TPR只能是100%或者0。
下面举个网上经常看到的图,(a)(b)分别为正负样本1:1时的ROC曲线和PR曲线,二者比较接近。而©(d)的正负样本比例为1:10,这时ROC曲线效果依然很好,但是PR曲线则表现的比较差。这就说明PR曲线在正负样本比例悬殊较大时更能反映分类的性能。
在这里插入图片描述
最红总结一下:

  1. ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例。
  2. 如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合。
  3. 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。
  4. 类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。
  5. 最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1 score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型

参考文献:
https://www.jianshu.com/p/2ca96fce7e81
链接: 关于ROC曲线的理解.
链接: ROC曲线学习总结.
链接: ROC和PR曲线.

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值