怎么判断你的模型是好是坏?模型性能评估指标大全!(二)

模型性能评估指标,大家一定不陌生!很多小伙伴们都说难,但是它真的很重要很重要很重要!它会对我们的模型有很多的指导,也会给我们真正做模型的时候提供一些指导性的思想,不然我们看到别人的东西只能跟着人家的思路走,不能有自己的想法,或者说没办法去”批判“他做得好还是不好!这多憋屈呀!来!咱学!给它学得透透的!

在之前的怎么判断你的模型是好是坏?模型性能评估指标大全!中,我们已经介绍了:

性能度量(performance measure),也就是性能评价指标,其实就是指衡量模型泛化能力的性价标准。我们在对比不同模型的能力时,使用不同的性能度量,往往会导致不同的评判结果。这就意味着模型的好坏其实是相对的,什么样的模型是好的,它其实不仅取决于算法和数据,还取决于任务需求

并依次介绍了错误率(error rate)精确度(accuracy)查准率(precision,又叫准确率)查全率(recall,又叫召回率)F1分数(F1 score)、**混淆矩阵(confusion matrix)**等,并通过举例的方式尽可能对其进行通俗易懂地解释,最后以 P-R 曲线收尾。那今天,我们就以大家最最最常见的 ROC 曲线开始,继续讲解性能度量的后半部分内容!

ROC 与 AUC

想象一下你是一个医生,你正在测试一种新的诊断方法来判断患者是否患有某种疾病。那么,ROC 曲线和 AUC 一定会是你在评估这种诊断方法的性能时超级常用的工具。我们接下来就为大家详细介绍一下这两个东西是什么及它们的应用场景。

ROC 的全称是受试者工作特征(Receiver Operating Characteristic)曲线,它是一种以灵敏度True Positive Rate T P R = T P T P + F N TPR= \frac{TP}{TP+FN} TPR=TP+FNTP,即正确诊断为患病的患者数量与实际患病总数的比率,也就是真正例率)为纵轴,以 1 - 特异性False Positive Rate F P R = F P T N + F P FPR= \frac{FP}{TN+FP} FPR=TN+FPFP,即错误诊断为患病的非患病者数量与实际非患病总数的比率,也就是假正例率)为横轴的图。

在二分类问题中,模型输出的结果通常是一个概率值,表示样本属于正类(例如患病)的概率。分类**阈值(threshold)**是一个界限值,用于将概率值转换为最终的分类标签。如果概率值大于等于分类阈值,则样本被判定为正类;如果概率值小于分类阈值,则样本被判定为负类。在使用 ROC 曲线进行性能评估时,我们会尝试不同的阈值,从而在 ROC 空间中得到一系列不同的真正例率(TPR)和假正例率(FPR)组合,进而绘制 ROC 曲线。

ROC 曲线中的每个点代表在不同阈值下诊断方法的性能,阈值用于判断患者是否患病。一条良好的 ROC 曲线通常弯曲向左上角,表示在保持高的灵敏度的同时,较低的误诊率。如果 曲线几乎处于对角线附近,则说明诊断方法的效果不如预期,无法很好地区分患者和非患者。

**AUC(Area Under the Curve)**是 ROC 曲线下的面积,也就是指 ROC 曲线与 x 轴之间的区域面积,它是一个介于 0 和 1 之间的值。AUC 反映了诊断方法在各种阈值下的综合性能。AUC 值越接近 1,表示诊断方法越优秀,能够更准确地区分患者和非患者。而 AUC 值越接近 0.5,则说明诊断方法的效果接近于随机猜测,没有明显优势,这个时候 ROC 曲线接近对角线。

对于给定的 ROC 曲线,可以通过对曲线下的面积进行数值积分来计算 AUC 值。但是,通常情况下,我们使用离散的方法来近似计算 AUC,即将 ROC 曲线近似为一系列小的梯形,然后计算这些梯形的面积之和。

A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 ) AUC=\frac {1}{2} \quad \sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1}) AUC=21i=1m1(xi+1xi)(yi+yi+1)

形式化地看,AUC 其实考虑的是样本预测的排序质量,所以它与排序误差有紧密联系。由此我们可以引入一个概念 —— 排序损失(Ranking Loss),它是用于衡量模型预测排序的一个指标。

假设我们有一个二分类任务,有一组样本数据,每个样本有一个真实的标签(1 表示正例,0 表示负例),同时我们的模型输出了一个预测概率值,表示样本属于正例的可能性。

现在,我们希望模型的预测概率能够正确地排序,即将真实的正例排在预测概率最高的位置,将真实的负例排在预测概率最低的位置。排序损失就是用来衡量这种排序质量的指标。

假设我们有 N 个样本,用 y i y_i yi 表示第 i 个样本的真实标签(0 或 1),用 p i p_i pi 表示模型对第 i 个样本的预测概率。为了衡量排序的质量,我们可以定义一个排序损失函数。

一种常用的排序损失函数是 Ranking Loss,也称为 Hinge Loss。

公式如下(经典教材西瓜书上不是这个式子,个人认为这个更直观,有助于大家理解,就采用这个来解释啦,其实表达的含义都大差不差,不用担心!):
R a n k i n g L o s s = 1 N ( N − 1 ) ∑ i = 1 N ∑ j ≠ i L ( y i , y j , p i , p j ) {Ranking Loss} = \frac{1}{N(N-1)} \sum_{i=1}^{N} \sum_{j \neq i} L(y_i, y_j, p_i, p_j) RankingLoss=N(N1)1i=1Nj=iL(yi,yj,pi,pj)

其中, L ( y i , y j , p i , p j ) L(y_i, y_j, p_i, p_j) L(yi,yj,pi,pj)是一个损失函数,它的计算方式如下:

L ( y i , y j , p i , p j ) = { 1 , if  y i = 1 , y j = 0 , p i < p j 0 , otherwise L(y_i, y_j, p_i, p_j) = \begin{cases} 1, & \text{if } y_i = 1, y_j = 0, p_i < p_j \\ 0, & \text{otherwise} \end{cases} L(yi,yj,pi,pj)={1,0,if yi=1,yj=0,pi<pjotherwise

这个损失函数的含义是,如果第 i 个样本是正例( y i = 1 y_i = 1 yi=1),而第 j 个样本是负例( y j = 0 y_j = 0 yj=0),并且模型对它们的预测概率满足 p i < p j p_i < p_j pi<pj,即第 i 个样本的预测概率比第 j 个样本的预测概率低,那么就会产生一个损失值 1。否则,如果模型的排序是正确的,损失值为 0。

直观地解释,如果排名损失为 0,意味着模型正确地将所有的正例排在了负例前面,没有出现错误的排序。而如果排名损失大于 0,说明模型的排序出现了错误,正例没有排在负例前面。

通过最小化排序损失,我们希望模型能够更好地学习样本的排序,也就是更准确地将真实的正例排在预测概率较高的位置,将真实的负例排在预测概率较低的位置。这有助于提升模型的性能和泛化能力,特别在排序相关的任务中,如推荐系统、搜索引擎排序等。

我们可以按照模型的预测概率值将样本进行排序,然后通过不同的截断点(cut point,也就是前面提到的分类阈值)对排序进行截断,从而得到不同的真正例率和假正例率。从上面的介绍中我们可以知道,排序损失可以用于评估模型排序的质量,也就是指它可以帮助我们判断模型是否能够将正例排在负例前面

所以,当你评估这个新的诊断方法时,通过观察 ROC 曲线的形状和计算 AUC 值,你就可以得出关于该方法性能的直观和定量的判断。更靠近左上角的曲线和较高的 AUC 值意味着这个诊断方法可能是一个很有希望的候选,而接近对角线和较低的 AUC 值则提示需要进一步改进或者尝试其他方法。

我们可以再举个形象的例子来帮助大家更好地理解 AUC!

想象你是一个竞赛选手,你需要在一群人中区分谁是领导者(正例)谁是追随者(负例)。你的任务是根据人们的身高(模型的输出概率值)来排名他们,你希望将领导者排在追随者前面。AUC 就是评估你排名的好坏。如果你完美地把领导者都排在了追随者前面,那么你的AUC 值就是 1。如果你的排名是随机的,无法分辨谁是领导者谁是追随者,那么你的AUC值就是 0.5。如果你的排名比随机好一点但仍然有错误,那么你的 AUC 值会介于 0.5 和 1 之间。所以 AUC 值越高,你的排名就越好,模型的性能就越优秀。

代价敏感错误率与代价曲线

在二分类任务中,**代价矩阵(cost matrix)**是一种考虑不同分类错误所带来不同代价的工具。在现实世界的很多场景中,不同类型的分类错误可能会导致不同的后果或代价。例如,在医学诊断中,将一个患者误诊为健康可能会导致严重后果,而将一个健康人误诊为患者可能只需要重新检查。为了在模型训练过程中更好地应对不同错误代价,我们可以引入代价矩阵来指定不同类型错误的相对权重。

想象你是一个士兵,需要用机器学习模型来判断一个区域是否含有敌人。但是,你知道在这个任务中,有两种错误类型:一种是“误判敌人”,你认为是敌人,实际上是友军,这会导致友军受伤;另一种是“误判友军”,你认为是友军,实际上是敌人,这可能导致你被敌军攻击。为了降低这些错误造成的代价,你决定使用代价矩阵来调整模型的学习策略。

代价矩阵:
代价矩阵是一个 2x2 的矩阵,表示不同类型错误的代价。一般来说,它的形式如下:

[ c 00 c 01 c 10 c 11 ] \begin{bmatrix} c_{00} & c_{01} \\ c_{10} & c_{11} \end{bmatrix} [c00c10c01c11]

其中:

  • c 00 c_{00} c00 代表将负例(例如友军)判定为负例(正确分类)的代价(或损失);
  • c 01 c_{01} c01 代表将负例(例如友军)判定为正例(错误分类)的代价;
  • c 10 c_{10} c10 代表将正例(例如敌人)判定为负例(错误分类)的代价;
  • c 11 c_{11} c11 代表将正例(例如敌人)判定为正例(正确分类)的代价。

在考虑了代价矩阵的情况下,我们需要重新定义错误率。由此引入代价敏感(cost-sensitive)错误率,它是一种根据代价矩阵计算的错误率。它不仅考虑了错误的数量,还考虑了不同类型错误的代价。

我们将上述代价矩阵中的第 0 类作为正例,第 1 类作为反类,使 D + D^+ D+ D − D^- D 分别代表样本集 D D D 的正例子集和反例子集,则代价敏感错误率公式如下:

E ( f ; D ; c o s t ) = 1 m ( Σ x i ∈ D + ∥ ( f ( x i ) ≠ y i ) × c 01 + Σ x i ∈ D − ∥ ( f ( x i ) ≠ y i ) × c 10 ) E(f;D;cost)=\frac1{m}({\underset{x_i\in D^+}{\Sigma}}\parallel(f(x_i)\ne y_i)\times c_{01}+{\underset{x_i\in D^-}{\Sigma}}\parallel(f(x_i)\ne y_i)\times c_{10}) E(f;D;cost)=m1(xiD+Σ(f(xi)=yi)×c01+xiDΣ(f(xi)=yi)×c10)

通过代价敏感错误率,我们可以更全面地衡量模型在考虑不同错误代价下的性能。在实际应用中,如果不同类型错误代价差异较大,代价敏感错误率将会是更合适的性能度量指标。

在非均等代价(unequal cost)下,ROC 曲线不能直接反映出模型的期望总体代价,而**代价曲线(cost curve)**就可以帮助我们达到这个目的。

关于代价曲线,书中介绍的超级简单,个人感觉没那么容易理解透彻,那我们在这边就给大家掰扯掰扯!

我们先来看下代价曲线图的基本构成。

横轴:归一化的正概率代价期望

P ( + ) = p × c o s t 01 p × c o s t 01 + ( 1 − p ) × c o s t 10 P(+)=\frac {p\times cost_{01}}{p \times cost_{01} + (1-p) \times cost_{10}} P(+)=p×cost01+(1p)×cost10p×cost01

其中 p 是样本为正例的概率。

纵轴:归一化的总体代价期望

c o s t n o r m = FNR × p × c o s t 01 + FPR × ( 1 − p ) × c o s t 10 p × c o s t 01 + ( 1 − p ) × c o s t 10 cost_{norm}=\frac{\text{FNR} \times p \times cost_{01} + \text{FPR} \times (1-p) \times cost_{10}}{p \times cost_{01} + (1-p) \times cost_{10}} costnorm=p×cost01+(1p)×cost10FNR×p×cost01+FPR×(1p)×cost10

其中 FPR 是假正例率,FNR = 1 - TPR 是假反例率。

看起来是不是很吓人!不要慌!你先不要慌!听我慢慢道来!

代价曲线的基本思路其实就是,我们将分类阈值从 0 逐渐增大到 1 的范围内进行变化,每次选取一个不同的分类阈值,计算模型在这个阈值下的分类结果对应的代价。代价可以是分类错误导致的代价,也可以是由于误判造成的代价,具体取决于任务的实际情况。

我们可以将分类阈值想象成是一个移动的“决策边界”,在样本的特征空间中逐渐调整这个边界的位置。对于每个“决策边界”,我们观察模型对样本的分类情况,然后计算相应的代价。当阈值是 0 时,所有样本都被判定为正类,而当阈值是 1 时,所有样本都被判定为负类,这是两个极端情况。

通过在不同分类阈值下计算代价,我们可以得到一系列的“代价-阈值”对,这些数据点就可以构成代价曲线。代价曲线能够帮助我们直观地理解模型在不同代价权衡下的性能表现。

现在咱们对代价曲线是不是有了浅浅的认识啦,想要深入了解的同学们建议去下面这里!

代价曲线的理解:https://www.zhihu.com/question/63492375

文末碎碎念

那今天的分享就到这里啦!我们下期再见哟!

最后顺便给自己推荐一下嘿嘿嘿!

如果我的分享对你有用的话,欢迎关注点赞在看转发分享阿巴阿巴阿巴阿巴巴巴!这可是我的第一原动力!

蟹蟹你们的喜欢和支持!!!

啊对!如果小伙伴们有需求的话,也可以加入我们的交流群:一定要知道 | 永久免费的生信交流群终于来啦!

还有兴趣的话,也可以看看我掏心掏肺的干货满满 | 给生信小白的入门小建议 | 掏心掏肺版!绝对干货满满!

如果有小伙伴对付费分析有需求的话,可以看看这里:你要的个性化生信分析服务今天正式开启啦!定制你的专属解决方案!全程1v1答疑!

入群链接后续可能会不定期更新,主要是因为群满换码或是其他原因,如果小伙伴点开它之后发现,咦,怎么失效啦!不要慌!咱们辛苦一下动动小手去主页的要咨询那里,点击进交流群即可入群!

参考资料
  1. 周志华. 机器学习[M]. 北京:清华大学出版社. 2016.01.
  2. https://www.bilibili.com/video/BV17J411C7zZ
  3. https://www.zhihu.com/question/63492375
  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

生信小白要知道

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

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

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

打赏作者

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

抵扣说明:

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

余额充值