• 【机器学习Q&A】准确率、精确率、召回率、ROC和AUC



    评价指标是针对将相同的数据,输入不同的算法模型,或者输入不同参数的同一种算法模型,而给出这个算法或者参数好坏的定量指标

    在模型评估过程中,往往需要使用多种不同的指标进行评估,在诸多的评价指标中,大部分指标只能片面的反应模型的一部分性能,如果不能合理的运用评估指标,不仅不能发现模型本身的问题,而且会得出错误的结论。

    本文将详细介绍机器学习分类任务的常用评价指标:准确率(Accuracy)精确率(Precision)召回率(Recall)P-R曲线(Precision-Recall Curve)F1 Score、混淆矩阵(Confuse Matrix)ROCAUC

    问题1:准确率的局限性

    准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷。比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率。所以,当不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素

    准确率的定义:准确率是指分类正确的样本占总样本个数的比例,即 A c c u r a c y = n c o r r e c t n t o t a l Accuracy=\frac{n_{correct}}{n_{total}} Accuracy=ntotalncorrect,其中 n c o r r e c c t n_{correcct} ncorrecct为正确分类的样本个数, n t o t a l n_{total} ntotal为总样本的个数 。

    为了解决这个问题,可以使用**平均准确率(每个类别下的样本准确率的算术平均)**作为模型评估的指标;

    模型的好坏,标准答案其实也不限于指标的选择,即使评估指标选择对了,仍会存在模型过拟合或欠拟合、测试集和训练集划为不合理、线下评估与线上测试的样本分布存在差异等一系列问题,但评估指标的选择是最容易被发现,也是最可能影响评估结果的因素。

    问题2:精确率与召回率的权衡

    首先明确两个概念:精确率和召回率。

    • 精确率:是指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。 比如,推荐了10篇新闻,其中8篇是应该推荐的;
    • 召回率:是指分类正确的正样本个数占真正的正样本个数的比例。

    在排序问题中,通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用Top N返回结果的Precision值和Recall值来衡量排序模型的性能,即认为模型返回的TopN的结果就是模型判定的正样本,然后计算前N个位置上的准确率Precision@N和前N个位置上的召回率Recall@N。
    在模型评估时,是否应该同时关注Precision值和Recall值?进一步而言,是否应该选取不同的Top N的结果进行观察呢?是否应该选取更高阶的评估指标来更全面地反映模型的Precision值和Recall值两方面的表现?
    肯定的,为了综合评估一个排序模型的好坏,最好还好绘制P-R(Precision-Recall)曲线。
    P-R曲线的横轴是召回率,纵轴是精确率。对于一个排序模型来说,其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到底移动而生成的。原点附近代表当阈值最大时模型的精确率和召回率。

    除此之外,F1 score 和ROC曲线也能综合地反映一个排序模型的性能。F1 score是精确率和召回率的调和平均值,它定义为:
    F 1 = 2 × p r e c i s i o n × r e c a l l p r e c i s i o n + r e c a l l F1=\frac{2 \times precision \times recall}{precision+ recall} F1=precision+recall2×precision×recall

    问题3:平方根误差的“意外”

    MSE(Mean Square Error)均方误差(L2损失):是真实值与预测值的差值的平方,然后求和平均,是最常用的回归损失函数。
    M S E = 1 m ∑ i = 1 m ( y i − f ( x i ) ) 2 MSE=\frac{1}{m}\sum_{i=1}^m {(y_i-f(x_i))^2} MSE=m1i=1m(yif(xi))2

    RMSE(Root Mean Square Error)均方根误差:是预测值与真实值偏差的平方与观测次数N比值的平方根。
    R M S E = 1 N ∑ i = 1 n ( y i − f ( x i ) ) 2 RMSE=\sqrt {\frac{1}{N}\sum_{i=1}^n (y_i-f(x_i))^2} RMSE=N1i=1n(yif(xi))2

    MAE(Mean Absolute Error)平均绝对误差,也称L1损失,是另一种用于回归模型的损失函数,是目标值和预测值之差的绝对值之和的平均值,能更好地反映预测值误差的实际情况。MAE只衡量了预测值误差的平均模长,而不考虑方向,取值范围也是从0到正无穷(如果考虑方向,则是残差/误差的总和——平均偏差(MBE))
    M A E = 1 m ∑ i = 1 m ∣ y i − y i ^ ∣ MAE=\frac{1}{m}\sum_{i=1}^m |y_i-\hat{y_i}| MAE=m1i=1myiyi^

    RMSE与标准差的区别:标准差是用来衡量一组数自身的离散程度,而均方根误差是用来衡量观测值同真实值之间的偏差,它们的研究对象和研究目的不同,尽管计算过程类似。

    RMSE和MAE的区别:RMSE相当于L2范数,MAE相当于L1范数。次数越高,计算结果就越与较大的值有关,而忽略较小的值,用RMSE计算损失的模型会以牺牲了其他样本的误差为代价,朝着减小异常点误差的方向更新,这就会降低模型的整体性能。另外对于神经网络来说,MAE存在一个严重的问题:更新的梯度始终相同。为了解决这个问题使用变化的学习率。

    RMSE经常被用来衡量回归模型的好坏,正如上面公式所述, y i y_i yi是第i个样本点的真实值, f ( x i ) f(x_i) f(xi)是第i个样本点的预测值,N是样本点的个数。
    一般情况下,RMSE能够很好反映回归模型预测值和真实值的偏离程度,但是实际中,如果存在个别偏离程度大的离群点时,即使离群点数量非常少,也会让RMSE指标变得很差。

    针对这个问题,可以从三个角度来思考:

    1. 如果认定这些离群点是“噪声点”,就需要在数据预处理的阶段把这些噪声点过滤掉。
    2. 如果不认为这些离群点是“噪声点”,就需要提高模型的预测能力,将离群点产生的机制建模进去。
    3. 找一个更合适的指标来评估该模型。例如平均绝对百分比误差(Mean Absolute Percent Error, MAPE),它定义为:
      M A P E = ∑ i = 1 n ∣ y i − y i ^ y i ∣ × 100 n MAPE=\sum_{i=1}^n |\frac{y_i-\hat{y_i}}{y_i}|\times \frac{100}{n} MAPE=i=1nyiyiyi^×n100
      相比RMSE,MAPE相当于把每个点的误差进行了归一化,降低了个别离群点带来的绝对误差的影响。

    根据不同情况选择损失函数

    • 如果异常点代表在商业中很重要的异常情况,并且需要被检测出来,则应选用MSE损失函数。
    • 相反,如果只把异常值当作受损数据,则应选用MAE损失函数。

    总而言之,处理异常点时,L1损失函数更稳定,但它的导数不连续,因此求解效率较低。L2损失函数对异常点更敏感,但通过令其导数为0,可以得到更稳定的封闭解。

    二者兼有的问题是:在某些情况下,上述两种损失函数都不能满足需求。例如,若数据中90%的样本对应的目标值为150,剩下10%在0到30之间。那么使用MAE作为损失函数的模型可能会忽视10%的异常点,而对所有样本的预测值都为150。这是因为模型会按中位数来预测。而使用MSE的模型则会给出很多介于0到30的预测值,因为模型会向异常点偏移。上述两种结果在许多商业场景中都是不可取的。

    这些情况下应该怎么办呢?最简单的办法是对目标变量进行变换。而另一种办法则是换一个损失函数。如Huber损失Log-Cosh损失分位数损失。也有些时候可以将利用MAE与MSE训练出的模型进行融合。


    问题4:ROC曲线

    ROC曲线经常作为评估二值分类器最重要的指标之一。全称是Receiver Operating Characteristic Curve的简称,ROC曲线的横坐标为假阳性率(False Positive Rate, FPR);纵坐标为真阳性率(True Positive Rate, TPR)。计算公式为:
    F P R = F P N FPR=\frac{FP}{N} FPR=NFP
    T P R = T P P TPR=\frac{TP}{P} TPR=PTP
    其中,P是真实的正样本的数量,N是真实的负样本的数量,TP是P个正样本中被分类器预测为正样本的个数,FP是N个负样本中被分类器预测为正样本的个数。

    如何绘制ROC曲线?
    事实上,ROC曲线是通过不断移动分类器的“截断点“来生成曲线上的一组关键点的。”截断点“指的就是区分正负预测结果的阈值。

    通过动态地调整截断点,从最高的得分开始(实际上是从正无穷开始,对应着ROC曲线的零点),逐渐调整到最低得分,每一个截断点都会对应一个FPR和TPR,在ROC图上绘制出每个截断点对应的位置,再连接所有点就得到最终的ROC曲线。

    其实,还有一种更直观地绘制ROC曲线的方法。

    • 首先,根据样本标签统计出正负样本的数量,假设正样本数量为P,负样本数量为N
    • 接下来,把横轴的刻度 间隔设置为1/N,纵轴的刻度间隔设置为1/P;
    • 然后,根据模型输出的预测概率对样本进行排序(从高到低);
    • 依次遍历样本,同时从零点开始绘制ROC曲线,
      • 每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,
      • 每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线
    • 直到遍历完所有样本,
    • 曲线最终停在(1,1)这个点,整个ROC曲线绘制完成。

    这 ROC 曲线到底有什么用呢?简单来说,ROC 曲线是用来评估不同二分类算法的性能的。那该如何评估某两个分类算法的优劣呢?这就要用到另一个概念 AUC 了。
    AUC 是 Area Under Curve 的简称,顾名思义,它表示的是“曲线下的面积”。这里的“曲线”就是前面提到的 ROC 曲线。AUC就是ROC曲线下的面积总和,该值能够量化反映分类算法的性能

    如何计算AUC?
    计算 AUC 的值并不复杂,只需要沿着ROC曲线的横轴做积分(或累加求和)即可。通常,ROC曲线都位于 y = x y=x y=x这条线的上方(如果不是这样的,只需要把模型预测概率 P 反转成 1-P 能得到一个更好的分类器)。因此,AUC 的取值范围一般是 0.5 ~ 1 0.5~1 0.51。通常来说,AUC 越大表明分类器性能越好,因为它可以把真正的正类样本排在前面,降低误判率

    问题5: ROC曲线相比P-R曲线有什么特点?

    相比P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能

    那么这有什么实际意义呢? 在很多实际问题中,正负样本数量往往很不均衡。比如,计算广告领域经常涉及转化率模型,正样本的数量往往是负样本数量的1/1000 甚至1/10000。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。
    当然,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。

    参考资料

    1. 《百面机器学习》
    2. 【机器学习】一文读懂分类算法常用评价指标
    3. 性能度量 | 模型评估指标的局限性
    4. 评价指标的局限性、ROC曲线、余弦距离、A/B测试、模型评估的方法、超参数调优、过拟合与欠拟合
    5. MSE与MAE的区别与选择
  • 相关阅读:
    LeetCode 2886.改变数据类型
    测试开发——进阶篇2
    我的高考往事
    怎样用python爬虫实现自动监测百度是否收录域名
    # Maven错误Error executing Maven
    新一代EV电池即将量产,还能续航1000公里?谁说电车不能跑长途
    笔训day1
    OSPF路由协议
    Shell 正则表达式
    windows 使用docker构建镜像
  • 原文地址:https://blog.csdn.net/ARPOSPF/article/details/122917667