python绘制ROC曲线图,并计算面积

1.原理及介绍

很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与
一个分类阈值(threshold) 进行比较,若大于阈值则分为正类,否则为反类。例
如,神经网络在一般情形下是对每个测试样本预测出一个 [0.0 ,1. 0] 之间的实值,
然后将这个值与 0.5 进行比较,大于 0.5 则判为正例,否则为反例。这个实值或
概率预测结果的好坏,直接决定了学习器的泛化能力。实际上根据这个实值或
概率预测结果,我们可将测试样本进行排序,“最可能"是正例的排在最前面,
“最不可能"是正例的排在最后面。这样,分类过程就相当于在这个排序中以
某个"截断点” (cut point) 将样本分为两部分,前一部分判作正例,后一部分则
判作反例。ROC 曲线则是从这个角度出发来研究学习器泛化性能的有力工具。
ROC 曲线的纵轴是"真正例率” (True Positive Rate ,简称 TPR) ,横轴是"假正例率" (False Positive Rate ,简称 FPR) 。
在这里插入图片描述
在这里插入图片描述
一个学习器的 ROC 曲线被另一个学习器的曲线完全"包住", 则可断言后者的性能优于前者;若两个学习ROC 曲线发生交叉,则难以一般性地断言两者孰优孰坏此时如果一定要进行比较,则较为合理的判据是比较 ROC 线下 的面积,即 (Area Under
ROC Curve) 。
在这里插入图片描述

2.python代码实现

'''
现实任务中通常是利用有限个测试样例来绘制 ROC ,此时仅能获得有
限个(真正例率,假正例 )坐标对,无法产生图 的光滑 ROC 曲线, 只能
绘制出所示的近似 ROC 曲线.绘图过程如下:
给定 m+ 个正例和个反例,根据学习器预测结果对样例进排序,然后把分类阔值设最大,
即把所样例均预测为反例,此时真正例率和假正例率均为 坐标
标记一个点然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例
划分为正例.设前一个标记点坐标为(x,y) ,若为真正例,则对应标记点的
坐标为 (X ,y+(1/m+)) ;当前若为假正例,则对应标记点的坐标为 (X+1/m- ,y) ,
然后用线段连接相邻点即ROC曲线
'''
import matplotlib.pyplot as plt

list=[0.8,0.9,0.2,0.1,0.4,0.6,0.7,0.3,0.8,0.25]
tf_list=[1,1,0,0,0,0,1,0,1,0]
#给定一个分类器打分的列表,给定真实的正反例,4个正例(1,2,7,9),6个反例(3,4,5,6,8,10)
#排序
#thresh=[1]
#thresh1=thresh+list
#print(thresh1)
m_true=0
m_flase=0
for i in range(len(tf_list)):
    if tf_list[i] == 1:  # 真正例
        m_true=m_true+1
    else:
        m_flase=m_flase+1
print(m_flase,m_true)        #6,4
x=[]
y=[]
xi=0
yi=0
for i in range(len(list)):
    if tf_list[i]==0:#假正例
        xi=xi+1/m_flase
        yi=yi
        x.append(xi)
        y.append(yi)
    else:#真正例
        xi=xi
        yi=yi+1/m_true
        x.append(xi)
        y.append(yi)
print(x,y)

plt.plot(x, y)

plt.xlabel('FPR')
plt.ylabel('TPR')
plt.title('ROC_picture')
plt.show()###显示
AUC=0
for i in range(len(x)-1):
    AUC=AUC+(x[i+1]-x[i])*(y[i]+y[i+1])
auc=0.5*AUC
print(auc)

在这里插入图片描述
由于分类样本较少因此曲线不是很规范,具体的分类器打分,以及真正的分类器类别,需要根据实际情况去判断。

参考:周志华 机器学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值