模型评估指标-2-ROC与PR曲线对比,TPR/FPR/Precision关系,3种特殊的评估指标

导语:在进阶篇里面,将会讨论ROC和PR曲线的联系,在不平衡数据中的偏差问题,同时利用公式来说明TPR/FPR/Precision三者之间的关系,在第三部分结合业务场景将介绍了几个特殊指标,但是没有说明如果根据指标去设计和优化模型,这个又要挖几个坑,等待后续来填了。

ROC和PR曲线

直观感受:在正负样本极度不平衡时,关注PR曲线,ROC可能掩盖模型的差异

在基础篇中,抛出了一个结论在正负样本极不平衡的情况下(正样本是少数的那一类),PR曲线比ROC曲线更能反映模型的性能,而这个结论来源于论文The Relationship Between Precision-Recall and ROC Curves,深入地学习一下这篇文章,对于深刻理解指标还是挺有意义的。
首先,论文先比较了两个模型分别利用ROC和PR曲线进行评估的结果,如下图所示:
在这里插入图片描述

从图中我们可以得出两个相反的结论:

  • 从ROC曲线上,两个模型表现都很不错,在FPR比较低的情况,TPR能够快速地靠近左上角区域,这样对应的AUC会较高;
  • 从PRC曲线上,就会觉得模型性能比较差,远离了右上角区域,这意味着在召回率高的情况下,精确率差的一塌糊涂

有了上述比较直观的比较之后,我们心里会倾向于认为这两个模型都有很大的提升空间,同时我们也想弄清楚造成这一现象的原因。根据知乎网友的描点,图a中TPR=0.8时,FPR约为0.1, 由于TPR=Recall, 因此可以大约认为图b中,Recall=0.8, Precision=0.05, 同时假定数据集中仅有100个正样本, 有了上述假设,我们就可以根据公式,推导出混淆矩阵上的各个指标了:

  1. T P R = T P 真 实 正 样 本 数 目 = T P 100 = 0.8 , ⇒ T P = 80 TPR=\frac{TP}{真实正样本数目}= \frac{TP}{100} = 0.8, \Rightarrow TP=80 TPR=TP=100TP=0.8,TP=80;
  2. P r e c i s i o n = T P T P + F P = 80 80 + F P = 0.05 , ⇒ F P = 1520 Precision = \frac{TP}{TP + FP} = \frac{80}{80 + FP} = 0.05, \Rightarrow FP=1520 Precision=TP+FPTP=80+FP80=0.05,FP=1520;
  3. $FPR = \frac{FP}{真实负样本的个数} = 0.1, \Rightarrow 真实负样本的个数= 15200 $
  4. 正负样本比例可以得出:100/15200 = 0.00658

对于上述千6的正负样本比,还不是特别悬殊,我们可以再举另外一个例子(来源于Kaggle),假设真实样本中有100个正样本,(1000000-10)个负样本,设置不同的阈值,得到前100, 前2000个样本预测为正样本:
在这里插入图片描述

根据计算结果,我们可以发现:

  • 两个模型在TPR,FPR上相比差异不大,尤其是FPR上,由于负样本占主导地位,即使将预测正样本的个数从100调到2000,两者之间的差异也是很小的;
  • 而在Precision和Recall上, Precision显示出了明显的差异,0.9 VS 0.047;
  • 原因在于,Precision,Recall在计算时,是不会考虑真实负样本的个数的,而ROC曲线上,FPR在计算时考虑了真实负样本的, 当负样本占据主导时(FPR的分母很大), FPR上体现不出差异来;
  • 因此,在极度不平衡的情况下,优先要看PR曲线;

公式推导:TPR/FPR/Precision三者之间的关系

根据TPR(与Recall公式定义一致)和FPR的计算逻辑,可以很方便地从混淆矩阵中计算出各个值。假定模型为 f ( x ) f(x) f(x),样本真实标签记为 y y y,样本中的正样本占比为 η \eta η,可以从概率的角度将其描述出来:
T P R = R e c a l l = P ( f ( x ) = 1 ∣ y = 1 ) F P R = P ( f ( x ) = 1 ∣ y = 0 ) P r e c i s i o n = P ( y = 1 ∣ f ( x ) = 1 ) \begin{aligned} TPR&=Recall=P(f(x)=1| y=1) \\ FPR&=P(f(x)=1| y=0) \\ Precision &= P(y=1|f(x)=1) \end{aligned} TPRFPRPrecision=Recall=P(f(x)=1y=1)=P(f(x)=1y=0)=P(y=1f(x)=1)

利用贝叶斯公式,对 P r e c i s i o n = P ( y = 1 ∣ f ( x ) = 1 ) Precision = P(y=1|f(x)=1) Precision=P(y=1f(x)=1) 进行变换:
P r e c i s i o n = P ( y = 1 ∣ f ( x ) = 1 ) = P ( y = 1 , f ( x ) = 1 ) P ( f ( x ) = 1 ) ) = P ( f ( x ) = 1 ∣ y = 1 ) P ( y = 1 ) P ( f ( x ) = 1 , y = 1 ) + P ( f ( x ) = 1 , y = 0 ) = T P R ⋅ η T P R ⋅ η + F P R ⋅ ( 1 − η ) \begin{aligned} Precision &= P(y=1|f(x)=1) \\ &= \frac{P(y=1, f(x) = 1)}{P(f(x)=1))} \\ &= \frac{P(f(x)=1|y=1)P(y=1)}{P(f(x)=1,y=1) + P(f(x)=1,y=0) } \\ &= \frac{TPR \cdot \eta}{TPR \cdot \eta + FPR \cdot (1 -\eta) } \end{aligned} Precision=P(y=1f(x)=1)=P(f(x)=1))P(y=1,f(x)=1)=P(f(x)=1,y=1)+P(f(x)=1,y=0)P(f(x)=1y=1)P(y=1)=TPRη+FPR(1η)TPRη
结合上述4个公式,可以发现:

  1. TPR和FPR跟样本比例无关,因为计算公式中不涉及$\eta $,这一点与直接使用混淆矩阵计算过程结论是一致的;
  2. Precision与正负样本比例有关,在固定了FPR/TPR之后,与 η \eta η呈现正比例关系

根据混淆矩阵 P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP + FP} Precision=TP+FPTP,结合上述Precision的计算公式,隐含的条件是:
P ( y = 1 ) = η = 评 估 数 据 中 正 样 本 的 比 例 = T P + F N 评 估 数 据 中 样 本 总 数 \begin{aligned} P(y=1) &= \eta \\ &= 评估数据中正样本的比例 \\ &= \frac{TP+FN}{评估数据中样本总数} \end{aligned} P(y=1)=η==TP+FN
根据大数定理,只有当评估的数据集样本足够多时,上述关系成立。

模型评估要同时结合应用场景和模型指标

不管是在基础篇还是上述ROC和PR曲线的对比,我们仅仅关心了模型指标,但是我们时刻要记住的一点,模型服务于业务,全局最优的模型,在实际使用时可能毫无价值而言,因为各种限制,模型影响的人群可能是小部分人群。

Precision>=0.97的Recall中,选取max(Recall)

如在客户流失预测场景中,提前挽回一个客户的成本要远低于去营销一个新用户,因此需要发现更多潜在的流失用户,对应在模型指标上,召回率Recall相比于准确率Precision更重要,我们可以通过几种做法来理解一下:

  • case1: 不使用模型,极端的情况下,我们可以不计时间和人工成本的情况下,直接对所有的存量客户预测为1,那么Recall=1,但Precision会低的离谱,因此不满足业务需求;
  • case2: 开始训练模型,得到一个AUC还不错的模型,但是受制于营销成本,仅能对部分用户进行促活,AUC太抽象,不能指导如何进行促活策略,但是我们知道需要在限定资源的情况下(仅可对部分用户进行挽回,设置的阈值不能太低),尽可能多的找到更多,因此可以设置在Precision>=0.97的Recall中,选取max(Recall)作为评估指标,这个指标在携程的一个比赛中使用,计算过程如下图所示:在这里插入图片描述

分段覆盖率:0.4 * TPR1 + 0.3 * TPR2 + 0.3 * TPR3

在交易风控,打击黑产相关的模型中,经常使用的一种指标,表示在仅尽可能少的打扰下(误杀,误伤)尽可能地识别准确,计算逻辑为:
{ T P R 1 , FPR=0.001 T P R 2 , FPR=0.005 T P R 3 , FPR=0.01 \begin{cases} TPR1, & \text{FPR=0.001} \\ TPR2, & \text{FPR=0.005} \\ TPR3, & \text{FPR=0.01} \\ \end{cases} TPR1,TPR2,TPR3,FPR=0.001FPR=0.005FPR=0.01
根据上述分段的TPR,在风控等领域,又可以叫做覆盖率,而FPR又叫做打扰率,这个很好理解,本来是一次正常的交易,却被识别为有风险,让用户交易中止,或者做二次验证,这样就打扰了用户,因此上述指标是在一定的打扰率的情况下,尽可能得到更高的覆盖率。

根据ROC曲线,这样的模型关注的是一小段曲线,而不是整体的AUC,因此可能存在一个AUC高的模型,上述分段覆盖率指标却不是最优的。
这个指标在蚂蚁支付风险识别比赛上出现:蚂蚁金服风险大脑:支付风险识别(https://dc.cloud.alipay.com/index#/topic/intro?id=12)

def tpr_weight_funtion(y_true,y_predict):
  """
  y_true:真实的类别
  y_predict:预测的类别
  """
    d = pd.DataFrame()
    d['prob'] = list(y_predict)
    d['y'] = list(y_true)
    d = d.sort_values(['prob'], ascending=[0])
    y = d.y
    PosAll = pd.Series(y).value_counts()[1]
    NegAll = pd.Series(y).value_counts()[0]
    pCumsum = d['y'].cumsum()
    nCumsum = np.arange(len(y)) - pCumsum + 1
    pCumsumPer = pCumsum / PosAll
    nCumsumPer = nCumsum / NegAll
    TR1 = pCumsumPer[abs(nCumsumPer-0.001).idxmin()]
    TR2 = pCumsumPer[abs(nCumsumPer-0.005).idxmin()]
    TR3 = pCumsumPer[abs(nCumsumPer-0.01).idxmin()]
    return 0.4 * TR1 + 0.3 * TR2 + 0.3 * TR3

检测比率与拦截比率

与上述分段覆盖率类似,这里检测比例理解为TPR(Recall), 拦截比例为预测为正样本的数量/所有样本量,这两个指标同时关注模型的性能和模型对于流量的影响,示意图如下图所示,在不同的阈值下,可以计算得到不同的检测比例和拦截比例,图中M1~M5表示5个不同的模型的比较:在这里插入图片描述

总结

  • 本文首先对比了ROC和PR曲线在样本不平衡的数据集中可能带来错误结论结论,用于说明在不平衡的情形下,要去关注PR曲线;
  • 在公式推导部分,利用贝叶斯公式得到了TPR/FPR/Precision之间的关系,用于说明FPR,TPR跟正负样本比例无关的特性,而在给定了FPR和TPR下,Precision跟正样本的占比成正比例关系;
  • 在第三部分,介绍了几种特殊的模型评估指标,用于说明模型评估需要和具体的业务场景结合,而不单纯的看AUC等这样的抽象指标

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。 PR曲线ROC曲线都是用于评估分类模型性能的常用指标。下面我将分别介绍PR曲线ROC曲线的计算方法,并给出手动绘制的步骤。 PR曲线 PR曲线表示的是Precision-Recall曲线,其中Precision表示精度,Recall表示召回率。Precision和Recall的计算公式如下: $Precision = \frac{TP}{TP+FP}$ $Recall = \frac{TP}{TP+FN}$ 其中,TP表示真正例(True Positive),即模型预测为正例且实际为正例的样本数;FP表示假正例(False Positive),即模型预测为正例但实际为负例的样本数;FN表示假负例(False Negative),即模型预测为负例但实际为正例的样本数。 计算PR曲线的步骤如下: 1. 对所有样本按照模型输出的概率值进行排序。 2. 设定一个阈值,将模型输出概率值大于等于该阈值的样本预测为正例,小于该阈值的样本预测为负例。 3. 根据上述公式计算Precision和Recall。 4. 逐步降低阈值,重复步骤2-3,直到所有样本均被预测为正例。 5. 将所有计算得到的Precision和Recall值绘制成PR曲线ROC曲线 ROC曲线表示的是Receiver Operating Characteristic曲线,其中横轴为1-Specificity,纵轴为Sensitivity。Sensitivity表示的是模型对正例的识别能力,即真正例率(True Positive Rate,TPR);Specificity表示的是模型对负例的识别能力,即真负例率(True Negative Rate,TNR),1-Specificity即为假正例率(False Positive Rate,FPR)。TPRFPR的计算公式如下: $TPR = \frac{TP}{TP+FN}$ $FPR = \frac{FP}{FP+TN}$ 其中,TN表示真负例(True Negative),即模型预测为负例且实际为负例的样本数。 计算ROC曲线的步骤如下: 1. 对所有样本按照模型输出的概率值进行排序。 2. 设定一个阈值,将模型输出概率值大于等于该阈值的样本预测为正例,小于该阈值的样本预测为负例。 3. 根据上述公式计算TPRFPR。 4. 逐步降低阈值,重复步骤2-3,直到所有样本均被预测为负例。 5. 将所有计算得到的TPRFPR值绘制成ROC曲线。 手动绘制步骤: 1. 准备数据,即计算出一系列不同阈值下的Precision、Recall、TPRFPR值。 2. 在坐标系中画出x轴和y轴,并标上对应的刻度。 3. 根据计算得到的数据点,绘制PR曲线ROC曲线。 4. 根据需要,可以在曲线上标出一些关键点,如Precision=Recall时的点、TPR=FPR时的点等。 希望这个回答能够帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值