导读:本文将介绍 360 数科在基于沉淀数据的尾部流量建模方法的实践。分享分为四部分,第一部分介绍尾部流量和沉淀数据的特点,第二部分介绍尾部流量在低通过率的情况下如何进行样本扩容,第三部分讨论如何根据沉淀数据时效性进行分群,第四部分介绍头部优质客户的排序优化。
具体如下:
- 尾部流量及沉淀数据的特点
- 低通过率下的样本扩容
- 沉淀数据时效性分群
- 头部优质客户排序优化
在分享以上四部分内容之前,结合过往经验,首先简单介绍风控建模的四板斧:特征挖掘、样本分群、标签优化及算法提升。如果前四种方法都不能有效地提升模型效果,第五板斧是大数据建模。当数据维度从 100 万、200 万提升到 500 万级别的时候(甚至更大级别),大数据建模可以有效地提升整个模型的效果以及稳定性,这是在业务非常成熟、流量非常大的情况下才能实现,对于尾部流量以及非常小规模的起始阶段,这种方法并不适用。
尾部流量及沉淀数据的特点
- 第一是风险过高;
- 第二是如果我们用市场上的一些多头类的数据做策略,很容易命中这类客户并拒绝掉。
- 第三是即使客户的授信通过了,实际能给到的件均也是偏低的。并且,尾部客户的人行征信数据和其他的数据缺失严重。
但是我们仍然要挖掘尾部客户的原因主要是:
- 一是流量的获取成本非常高。
- 二是我们的风控能力在不断的提升,根据之前的一些风险下探的测试跟探索,我们有信心以及有能力可以运营一部分的尾量客户。
- 三是经营一部分资质较少的新客户,以低额和较低的成本在平台上为他们增信。
- 四是对一些沉睡的老客户进行促活。
平台的尾部客户的主要来源包括:在其他产品上面的管制禁申户、低额的新户、授信的拒量、睡眠户、资金方的交易拒绝户,策略评判高风险的客群。
沉淀数据是产品中积累的历史存量数据,我们需要测算客户经营的成本和盈亏平衡点,数据成本是成本中较为重要的组成部分,因为资金成本和盈利目标是既定的,目前可以压缩的只有数据成本。在低通过率的情况下,如果调用相同的三方资信,尾量客户的数据成本会比头部客户的成本更高一些,因为调取查询十个尾部客户的资信数据可能只有一个客户能通过,十个客户的成本全都需要分摊在这一个客户上。
所以在这种情况下,我们平台刚开始的时候并没有大量的接入三方数据,主要是依靠这些客户在其他子产品上的历史数据来进行相关的策略分析以及建模工作。没有大量接入三方数据的另一个原因是平台刚启动的时候,三方资信的接入需要花费大量的时间,但是相信在未来断直连的情况下,接入速度会有较大的提升。
关于我们所用的沉淀数据,也就是历史数据,主要包括四个方向,授信阶段的数据,交易申请阶段的数据,贷中调额阶段的数据,贷后的数据。这四部分数据相关的衍生变量以及逻辑,市场上各大机构都有一套自己的方法论,关于变量的衍生以及特征挖掘,本次分享不会具体展开。
低通过率情况下的样本扩容
在尾量数据捞回较低的通过率情况下,我们有表现的样本非常少。如何通过样本的扩容来实现数量级上面的扩张,使模型的表现以及稳定性有所提升,主要有三种方法。
- 第一个方法是共生融合标签的使用
我们的平台相当于是一个子产品平台,在集团下面有其他产品,我们可以在获取同一个用户在其他产品上的风险表现,将同期的风险表现进行融合。以上图为例,一个用户进入到子产品的授信节点,发起授信申请以后,我们会看到用户在授信之后的一个月内是否发起动支申请。假设用户动支成功,会产生一张借据,我们观察用户在 3 个月加 1 个月,即四个月的表现,是否有 30 天的逾期,作为这个子产品的风险Y标签。这样的情况下,我们能够获取的样本非常的少,因为首先授信是否通过,会产生一部分损失;授信通过以后,在一个月内用户是否会发起交易,又产生一部分损失;在发起交易以后,它的交易能否被通过又是第三部分的损失。所以这一套流程下来,我们能够获取的 Y 样本非常的少。
通过融合的方法,可以将数据量扩展 3 到 4 倍。融合的具体做法是,获取用户在其他产品上面的同期的风险表现。比如在授信节点之后,以 M0 为例,再到相同的M4,我们获取他在其他产品上所有的借据每一期的 Due Time ,只要这些 Due Time 落在这个区间之内,我们都开始获取他的相关风险表现,每一期是否有逾期 30 天,只要在这个区间内有逾期 30 天,我们都认为用户在其他产品上的风险表现为命中,然后将这两个标签融合在一起,就获得了最终的用户的风险标签。
上图中的融合标签交叉情况矩阵会更清楚地显示所有可能的情况。在子产品 1 上面,用户可能会有三种状态,一个是“好人”,一个是“坏人”,一个是没有表现。在子产品 2 上面,也会有三种情况,也是“好人”、“坏人”、没有表现。上图只列举了两种产品的情况,也可以是三到四个产品不断地累加,形成一个大的矩阵。仅看这两个产品的情况下,用户会有九种情况。图中的数字 1 代表“坏人”,0 代表“好人”,三个标记为 0 的方格代表“好人”,五个标记为1的方格代表“坏人”,还有一个情况是用户都没有表现。所以实际情况下,我们可以获取这八个格子的风险表现,作为这个用户的风险表现,而舍弃最终在两边都没有风险表现的人。这种方法在扩展样本的同时也加入了拒绝推断。因为对于在子产品 1 上面没有风险表现的情况下,可以通过子产品 2 作为用户的风险表现的补充,作为有效的拒绝推断。在选择子产品的时候,如果有很多选项的情况下,还需要分析用户在其他子产品的风险表现的 Y 与用户在需要分析的这个产品的风险表现的 Y ,两者的相关性有多高。以我们的实践经验来看,大概会有 75% 的可能性是相类似的风险表现。
- 第二个方法是放松坏人定义的方法
在 0 和 1 的二分类模型中其实很难界定 29 天逾期和 30 天逾期,到底哪个定义为“好人”哪个定义为“坏人”。所以当遇到样本量非常不足的情况时,其实可以适当地放松标准,把 29 天或 28 天逾期的样本也容纳进整个样本区间内。具体的分界线在哪里也需要做相应的分析。一般我们可能比较常见滚动率在 m0、m1、m2、m3 的矩阵,其实可以也把它迁移到这个分析里面来看用户从第一天逾期到逾期 30 天以及更多更长时间的情况的滚动率。如果滚动率保持在 90 % 以上,那可以放宽相应的时间界限的标准,以获得更大的样本的容量。
- 第三个方法是长短期指标的选择
建模时常用的Y 标签是一期的、三期的、六期的风险标签。我们尝试过同时使用同样的月份样本,用一期、 三期、 六期的数据做相应的模型,输入项也相同的情况下,六期的模型在三期的风险标签上的识别度会优于以三期为 Y 建模的效果。如果我们选用 6 个月作为训练样本,以六期为风险标签的话,在 Ever 的口径下,六期的坏的样本会比三期的更多一些。
沉淀数据时效性分群
可以从客户经营的角度和数据的角度来理解数据沉淀数据时效性分群。
从客户经营的角度来说,是对活跃户和非活跃户的分群建模。从数据的角度来说,是对数据的时效性进行分群。我们的客群是在其他产品有过授信或者交易申请记录的客群,所以我们会以 T0,相当于是在我们客群进行授信申请的时间节点,再往前倒推 30 天,看用户在其他产品上面是否有相关的授信或者是交易申请的操作。如果有的话我们认为他是比较活跃的用户,用户的数据在 T0 节点和往前推 30 天的节点获取的数据是比较新的,我们把它命名为 Trade 1。在 30 天到 90 天内的用户,命名为 Trade 2 ,到 90 天以上的是 Trade3。Trade1、Trade 2 和 Trade3 一般是在贷中环节进行区分,就是距离首笔交易的时间间隔的概念,我们相当于是借用了这个概念。
我们为什么要这么做呢?上图是我们在整体样本上面建的 Benchmark Model,Trade 1、Trade 2、 Trade 3 样本上这些模型和整体样本之间其实并没有非常明显的区分,较难分辨模型在哪一些子客群上的表现效果更好。而且如果仔细观察,会发现 Trade 2 的效果反而会比 Trade3 更好,并且好于 Trade 1,明明 Trade 1 是最新的数据,反而它的效果是更差的。所以这就是我们为什么希望通过时效性维度来进行划分客群。
当我们以时效性分群以后,我们再来评估模型的表现。以 Trade 1 模型为例,就是在 30 天内在其他产品上有操作过的客群数据来搭建的模型。下图中的左图是仅仅在 Trade 1 客群上面进行建模的效果比较,红色线是我们新建的此客群的模型,蓝色的三条线是在全部样本上面建的几个 Benchmark Model,效果上会有比较明显的提升。但是这个提升其实并不能说明问题,因为这可能是因为这个模型是采用活跃样本搭建的,样本数据的时效性更近,所以模型的效果会更好。
这个提升到底有多少是来自于模型自身的提升,有多少是来自于样本的分群,不能很明确的分析出来。当我们用同样的模型在排除了 Trade 1 样本的数据上验证发现,即将 Trade 2 和 Trade 3 样本合在一起打分以后再进行比较,会发现模型即使用的输入项是比较旧的数据,但是它的效果依然可以超过其他的三个 Benchmark Models,这说明这样的分群建模是非常有效的,而且可以间接地理解为这个 效果提升 是来自于模型的提升(见下图中的右图)。
低通过率头部优质客户排序优化
头部优质客户的排序优化对我们来说是最具有挑战性的问题。因为建模样本与最终策略使用的通过样本相比可能有一个非常大的差距,特别是在一个实际通过率可能只有 10% 到 20% 的低通过率的产品上。
对前 10% 的客群,排序性的优化是非常重要的。因为经常会出现一个问题,模型在建模的样本上面效果非常的好,一旦在策略上使用之后,实际上线的效果会有非常大幅度的下降。这是因为原先建模样本可能是百分百通过,但是模型在实际上线之后,整个通过率大概只有 10% 到 20% 的区间。传统的KS 评估或者AUC评估其实相当于是仅对10档中的前 2 档进行了评估,在这种情况下,模型的表现下降也是可以理解的,因为我们并没有针对前几档进行相关的优化,所以后续我们开始研究如何对 Top Capture Rate 进行优化,除了传统指标 KS、AUC 外,还会看前两档最好的客群的 Bad Rate 以及一些相关的指标来优化它相关的排序性。
下面介绍几种比较常用的方法。
- 第一种方法是头部样本的叠加模型
首先对全样本进行建模,获得 Model1,作为基础模型。基础模型产生样本排序,颜色从深到浅(见下图),我们以这个模型的排序进行取样,取我们业务关注的那一部分的样本,比如说前 20% 或者前 30%。取样之后,再在子样本上面搭建 Model 2, 再把 Model 1 和 Model 2 进行融合,获得最终的模型。这种方法比较简单直观。模型 1 的全局最优,并不一定是 Top 20 或者 Top 30 的样本的局部最优,所以我们在局部样本上再找一个最优,两个进行合并,获得结果。但是这个方法在不同场景下,模型的效果不同(不一定能带来正向增益),仍然需要在具体的问题上面去具体分析,做相关的试验。
- 第二种方法是权重法
这种方法不仅仅用于头部客群的一个排序优化,其实在很多场景里面都可以使用。第一步同样是对全量样本建模,Model1,获得排序。排序之后,对关注的特定的排序区间的客群进行增加权重,增加权重的方法很多。首先是直接在样本里面复制这一部分客群,将复制的客群加入样本,至于增加几倍,需要通过测试获取最好的效果,然后在调整后的样本上面再进行训练,获取 Model2。
这个方法还有一种适用场景,在授信客群上面建模,客群会有一定的漂移情况。比如用六个月的数据,前四个月与最近两个月的数据相比,可能发现最近两个月的样本会有比较明显的偏移。如果整体进行建模的话,我们会发现模型可能在前四个月的效果上面效果很好。但是在最近两个月的样本上面,它的效果并不是特别好。在这种情况下,我们可以适当的对最近两个月的客群样本进行加权,使得模型偏向于着重学习最近两个月的样本,同时又能保证足够的样本,使得模型在长期来看比较稳定。因为在实际的操作中会发现有的时候客群的偏移只是暂时的,可能两三个月之后客群又回来了,整个模型的效果 KS、AUC 又上升了。
- 最后一种方法是修改算法的目标函数和评价函数,对模型打分头部错判坏样本加大惩罚。这里共有三个公式。
公式一是 a-balanced 交叉熵,在普通的交叉熵的基础上加入 Alpha 增加相应的权重,来调整好坏样本的不平衡。其实可以完全仅使用这一条公式来对目标函数和评价函数进行修改。我们试验发现这个公式可以对头部 5% 的客群有很明显的风险的压降。
公式二是 Focal Loss,不仅能够对好坏样本进行平衡,还能对容易学习和不容易学习的样本进行权重的修改。如果模型预测的概率偏向于 0.5 时,说明是比较难学习的样本,通过调整 Gamma 系数,公式会对此样本加重学习的权重。如果模型预测的概率是 0.95,说明它是倾向于 1 的命中的样本,那么公式会降低对它的学习力度。
公式三是将公式一和公式二融合起来,形成更为复杂的 Focal Loss 函数。
我们需要对 Alpha 系数和 Gamma 系数进行整体的分析,而不能单纯地说 Alpha 系数是用来平衡好坏样本,Gamma 系数是平衡容易学习和不容易学习的样本的参数,应该把它们作为一个整体进行超参的分析和调参的工作,这种方法可以对模型的排序性有较大的调整和提升。
问答环节
Q1:请问除了直接复制样本量,还有没有其他的方法增加样品权重?
A1:增加样本权重的方法还挺多的。一是 XGB 模型里面有 scale_pos_weight系数可以进行调整。二是在整理样本的时候,可以在样本的 Matrix 中增加一列,对每一个样本赋予相应的权重。三是修改损失函数,比如说对头部 20% 的样本增加权重。
Q2:关于共生融合风险标签,用户样本扩容相当于是对比如说某子产品在授信 30 天内,发生支用的新客在 mob 4 上三十天逾期扩充成了某子产品授信后,该用户在所有产品上均视为逾期 30 天,这样理解对吗?
A2:可以这么理解,但是在的时候可能需要做一些前期的分析工作,并不是盲目的把不同的产品合并在一起。首先需要分析产品的结构是否是类似的,还需要分析在这个子产品上历史的数据。比如用户在子产品 1 上的表现变坏了,那么在其它子产品上同期变坏的重合度有多高,我们之前的分析是大概 75% 左右的重合度,如果用户在这个子产品上的表现变坏,在另外一个产品上的同期表现也很有可能变坏,我们就觉得这个产品可以进行融合。
Q3:请问在分群建模后还有必要融合吗?
A3:如果按时效性分群的话,还是可以进行 Y 标签的融合,因为这是两个维度。如果是普通分群的情况的话,需要进行斟酌,因为分群本来就是为了让样本更加的纯洁,引入的噪声更少。
Q4:对于客群偏移还有没有什么方法来进行处理。
A4:我们首先会做客群偏移的分析。从模型的角度来说,第一最直观的就是模型分的偏移,还有特征输入项的偏移,我们会做相应的监控。然后通过客群偏移的监控如果确实论证发现客群产生偏移,我们会加重偏移后的客群在整个建模样本里面的权重,以增加算法对他的学习能力。
第二,因为客群的偏移是时间的维度,它是不可复制也不可预测的。所以在这种情况下,有一种方法是比如产品时间比较长,那我们可以把偏移后的客群跟历史的客群进行分析,找到历史上类似的时间段进行扩容。
Q5:尾部客群在实际的业务当中的贡献能够占到多少?在未来的预期当中,这部分客群贡献的占比会持续扩大吗?
A5:所谓的尾部客群并不一定说风险非常高。对公司来说,经营头部的产品通过调额就可以提升整体的 GMV,所以它并没有花很大的时间来精耕尾部客群,但是我们其实是可以将尾部客群的风险控制在相对较低的水平,甚至跟整体大盘持平的情况。而且在当前流量昂贵的情况下,我们需要挖掘历史沉淀数据,尽少的增加成本的支出来获得 GMV,增加公司的整体收入。且与其说是尾部客群经营,实际上更可以说是我们在对自己风控整体能力的一个压力测试(经济下行)。并且未来可以反哺给主流量运营。