【机器学习】POC & AUC

ROC曲线的来源:

在不同任务下,用来评价一个二值学习器泛化性能的好坏。

  • TPRate的意义是所有真实类别为1的样本中,预测类别为1的比例。
  • FPRate的意义是所有真实类别为0的样本中,预测类别为1的比例。 

ROC曲线越接近左上角,该分类器的性能越好。

为什么使用ROC曲线

为什么还要使用ROC和AUC呢?已经有那么多的衡量指标啦!因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

在上图中,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。

ROC曲线的绘图过程:

给定m+个正例和m-个反例,根据学习器预测结果对样例进行排序,然后把分类阈值设为最大,即把所有样例均预测为反例,此时真正例率和假正例率均为0,在坐标(0,0)处标记一个点。然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为(x,y),当前若为真正例,则对应标记点的坐标为(x,y+1/m+);(emmm就是纵轴真正例率up)当前若为假正例,则对应标记点的坐标(x+1/m-,y),(emmm就是横轴假正例率up),然后用线段连接相邻点即得。

AUC的引出:

若两个学习器的ROC曲线发生交叉,则需要判别ROC曲线下的面积即AUC,来决定哪个model更好。(模型选择)

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

AUC计算:

AUC意味着什么?

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

为什么使用ROC曲线?

一个分类模型的分类结果的好坏取决于以下两个部分:

  • 分类模型的排序能力(能否把概率高的排前面,概率低的排后面)
  • threshold的选择

AUC用得比较多的一个重要原因是,实际环境中正负样本极不均衡,PR曲线无法很好反映出分类器性能,而ROC受此影响小。

使用AUC来衡量分类模型的好坏,可以忽略由于threshold的选择所带来的影响,因为实际应用中,这个threshold常常由先验概率或是人为决定的。


关于手撕AUC

AUC计算公式及python代码_只会git clone的程序员的博客-CSDN博客_python计算auc的代码

计算原理:

遍历正负样本对
正样本的概率大于负样本,auc += 1
正样本的概率等于负样本,auc += 0.5
正样本的概率小于负样本,auc += 0
遍历完毕,auc = auc / 正负样本对数
举个例子:

label = [1, 0, 0,]
pre = [0.9, 0.8, 0.3]

第一个是正样本,后面两个是负样本。

正负样本对有:(label[0],label[1]),(label[0],label[2])。
因为pre[0]>pre[1],因为正样本的概率大于负样本,所以auc += 1,
因为pre[0]>pre[2],因为正样本的概率大于负样本,所以auc += 1,
总对数为2:
所以auc = (1 + 1)/2 = 1。

# auc:遍历正负样本对
"""
1、正的概率大于负的,auc加1
2、正的概率等于负的,auc加0.5
3、正的概率小于负的,auc加0

"""

def AUC(label, pre):
    pos = []
    neg = []
    auc = 0
    for index,l in enumerate(label):
        if l == 0:
            neg.append(index)
        else:
            pos.append(index)
    for i in pos:
        for j in neg:
            # 遍历预测分数,所以是pre
            if pre[i] > pre[j]: 
                auc += 1
            elif pre[i] == pre[j]:
                auc += 0.5
    return auc * 1.0 / (len(pos)*len(neg))

if __name__ == '__main__':
    label = [1, 0, 0, 0, 1, 0, 1, 0]
    pre = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]
    print(AUC(label, pre))

    from sklearn import metrics
    auc = metrics.roc_auc_score(label, pre)
    print('sklearn',auc)

参考:

如何理解机器学习和统计中的AUC?

ROC AUC的原理详解

《机器学习西瓜书》

原 分类模型评估之ROC-AUC曲线和PRC曲线

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值