导语:在进阶篇里面,将会讨论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个正样本, 有了上述假设,我们就可以根据公式,推导出混淆矩阵上的各个指标了:
- 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;
- 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;
- $FPR = \frac{FP}{真实负样本的个数} = 0.1, \Rightarrow 真实负样本的个数= 15200 $
- 正负样本比例可以得出: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)=1∣y=1)=P(f(x)=1∣y=0)=P(y=1∣f(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=1∣f(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=1∣f(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)=1∣y=1)P(y=1)=TPR⋅η+FPR⋅(1−η)TPR⋅η
结合上述4个公式,可以发现:
- TPR和FPR跟样本比例无关,因为计算公式中不涉及$\eta $,这一点与直接使用混淆矩阵计算过程结论是一致的;
- 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等这样的抽象指标