一文详解 ROC/AUC

一文详解 ROC/AUC

前言

AUC(area under the curve)是机器学习领域中一种常见且重要的模型评估标注,表示ROC(receiver operator characteristic)曲线下的面积。今天我们就和大家一起来梳理一下有关ROC/AUC的基本知识。

1. 基本概念

& 混淆矩阵

首先我们从混淆矩阵谈起,混淆矩阵中横轴通常表示真实类别(1和0分别对应真、伪),纵轴表示预测类别(1和0分别对应阳、阴),对真实类别和真实类别进行组合,便形成了如下的混淆矩阵:

混淆矩阵

& 准确率

按照混淆矩阵中的符号形式,准确率的公式可以表示为:

准确率是一种非常常见的模型效能度量指标,然而当面对样本不平衡问题时,其度量效果会产生问题。比如在一个总样本中,1类样本占90%,0类样本占10%,样本严重不平衡,此时我们只需要将全部样本预测为1即可得到高达90%的准确率。

& 精准率

精准率(Precision)又称查准率,代表所有被预测为1的样本中实际为1的概率,其公式如下:

& 召回率

召回率(Recall)又称查全率,代表在所有实际为1的样本中被预测为1的概率,其公式如下:

& F1分数

通常情况下,查准率和查全率会随着阈值的变化而变化,我们希望查准率和查全率同时都非常高,然而这两个指标实际是此消彼长的关系,无法做到双高。对此,我们就需要一个新的指标 —— F1分数。F1分数同时考虑了查准率和查全率,通过选取最高的F1来确定分类阈值,F1公式如下:

3. ROC/AUC 介绍

在正式介绍ROC/AUC之前,我们还要再了解几个指标。

& 灵敏度
& 特异度
& 真阳率 (TPR)

真阳率和召回率一样,代表在所有实际为1的样本中被预测为1的概率,其公式如下:

& 假阳率 (FPR)

假阳率代表在所有实际为0的样本中被预测为1的概率,其公式如下:

& ROC/AUC

ROC曲线中的主要两个指标就是真阳率和假阳率,通过遍历不同的阈值也就得到了整条曲线,曲线下的面积也就是AUC。

ROC/AUC

3. ROC曲线的阈值问题

看完上述内容后,很多同学可能还并不是很能理解ROC曲线,下面我们通过一张图来进一步来解释一下。

ROC曲线阈值变化图

图中蓝橙两条曲线反映了1和0两类真实数据的分布情况,黑色的直线表示分类器的阈值,模型将黑线左边的样本标签预测为0,黑线右边的预测为1,因此也就产生了TP、FP、TN、FN四个值,进而我们也就可以计算真阳率和假阳率。当我们对不同的阈值进行遍历时,产生的 (假阳率, 真阳率) 坐标点也就可以连成ROC曲线,进而求得曲线下面积AUC。

4. 换一种方式理解AUC

AUC其实也可以这样理解:随机从正样本和负样本中各选一个,分类器对于该正样本打分大于该负样本打分的概率。

假设数据集一共有M个正样本,N个负样本,预测值也就是M+N个。我们将所有样本按照预测值进行从小到大排序,并排序编号由1到M+N。

对于正样本概率最大的,假设排序编号为 ,比它概率小的负样本个数 =

对于正样本概率第二大的,假设排序编号为 ,比它概率小的负样本个数 = ;

以此类推......

对于正样本概率最小的,假设排序编号为 ,比它概率小的负样本个数 =

那么在所有情况下,正样本打分大于负样本打分的个数就等于:

AUC的正式计算公式就是:

4. 多分类问题中的AUC

可以把多分类分成n个二分类来解决。比如a、b、c三分类问题可以转化为属于a和不属于a、属于b和不属于b、属于c和不属于c,三种情况。求总体评估效果的话再把他们加和求平均就可以了。

同理roc曲线你也可以画出来。另外多分类问题最好每一类分别都看看,因为有可能存在总体效果好,有一部分类别预测的很准,另外一些类别根本分不出来的情况。

5. ROC/AUC 代码

  • 二分类

def binary_class_auc(X, y, model):
    '''
    param X: 特征
    param y: 标签
    param model:  训练好的模型
    return: roc曲线图
    '''
    from sklearn import metrics
    y_score = model.predict_proba(X)
    fpr, tpr, threshold = metrics.roc_curve(y, y_score[:,1])
    roc_auc = metrics.auc(fpr, tpr)
    plt.plot(fpr, tpr, label='AUC = %0.3f' % roc_auc)
    plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', alpha=.8)
    plt.legend(loc='lower right')
    plt.show()

binary_class_auc(x_test, y_test, model)

  • 多分类

def mul_class_auc(X, y, model, class_number):
    '''
    param X: 特征
    param y: 标签
    param model:  训练好的模型
    param class_number: 分类数
    return: roc曲线图
    '''
    from sklearn import metrics
    y_score = model.predict_proba(X)
    y_one_hot = label_binarize(y, np.arange(class_number))
    fpr, tpr, threshold = metrics.roc_curve(y_one_hot.ravel(), y_score.ravel())
    roc_auc = metrics.auc(fpr, tpr)
    plt.plot(fpr, tpr, label='AUC = %0.3f' % roc_auc)
    plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', alpha=.8)
    plt.legend(loc='lower right')
    plt.show()

mul_class_auc(x_test, y_test, model, 3)

参考资料

https://www.zhihu.com/question/304639772/answer/546024842

https://zhuanlan.zhihu.com/p/92218196

https://www.zhihu.com/question/39840928/answer/241440370

  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xifenglie123321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值