一文详解 ROC/AUC

火山方舟向量数据库大模型

一文详解 ROC/AUC

前言

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

1. 基本概念

& 混淆矩阵

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

picture.image

混淆矩阵

& 准确率

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

准确率是一种非常常见的模型效能度量指标,然而当面对样本不平衡问题时,其度量效果会产生问题。比如在一个总样本中,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。

picture.image ROC/AUC

3. ROC曲线的阈值问题

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

picture.image 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

END

添加助手微信回复研究方向或专业即可加入我们的微信交流群或QQ交流群

picture.image

picture.image

扫码关注我们

picture.image

祝大家offer多多,秋招顺利!!!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 NoSQL 的实践与探索
随着 NoSQL 的蓬勃发展越来越多的数据存储在了 NoSQL 系统中,并且 NoSQL 和 RDBMS 的界限越来越模糊,各种不同的专用 NoSQL 系统不停涌现,各具特色,形态不一。本次主要分享字节跳动内部和火山引擎 NoSQL 的实践,希望能够给大家一定的启发。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论