查看原文
其他

因果推断在蚂蚁风控场景中的应用

唐才智 DataFunSummit
2024-09-10

导读 本文将分享蚂蚁风控场景中,对因果推断的应用,主要聚焦于纠偏的一些方法。

重点分以下几部分:

1. 因果推断的背景

2. 基于时序数据纠偏

3. 基于试验数据纠偏

4. 在蚂蚁的应用

5. 问答环节

分享嘉宾|唐才智 蚂蚁集团 算法专家 

编辑整理|朱丽云

内容校对|李瑶

出品社区|DataFun


01
因果推断的背景

1. 什么是因果效应估计

什么是因果推断?举个例子,在电商场景里面研究营销的时候,想要知道优惠券和转化率之间的关系,最直观的做法就是随机实验。随机挑选一部分人发放优惠券,另外一部分人做空白对照,最终得出这个优惠券是否有用的结论。这样的随机实验能得到整体上优惠券是否有用,但并不知道每一个人的情况。这样的数据叫试验数据,有优点也有缺点。

除了试验数据,还有一类数据叫观测数据。除了进行随机实验,也可以在线上收集生成的回流数据,这些数据可能是受过策略、推荐模型、营销模型的影响回来的数据,这些数据叫观测数据。

有了数据后,分析转化率和优惠券之间关系。一般的做法是,要把它当作一个映射关系来学习,比如用二分类模型来预测一个人拿券后其转化率是多少。但这样有一个问题,如果这个人本来就要去买商品,那么优惠券其实对转化率并没有提升的效果。我们无法得知这个优惠券对于转化率的提升有多大,也并不能很好地去刻画优惠券和转化率之间的关系。这时候我们需要用一个方法去刻画给个人发优惠券,相比不发优惠券,转化率的变化是多少,提升是多少,这就是因果效应估计。转化率是目标,也叫 outcome,发优惠券是手段,也叫 treatment。

因果推断的目的是用手段干预用户,想要知道因果推断的结果,在干预用户后得到的影响是多大。这也是因果推断和常规机器学习预测问题的区别:一个学习 x 到 y 的映射,而另一个在学习干预 D 从 0 到 1 的变化对结果产生的影响。

2. 为什么会有偏差——Confounding Bias

前面提到的两类数据,一类是随机试验生成,即发放或不发放优惠券。随机给一个人发优惠券,他可能消费,也可能不消费;不发,同样可能消费,也可能不消费。整体上能得到一个结论,发优惠券能够带来一个正向的增益。随机实验比较好的一方面是,它跟用户本身的消费是没有关系的。但是如果从历史数据里面,或者线上回流模型策略的数据,回收来的数据可能就不一定能得到这样一致性的结论。比如上图右边举了一个例子,可能得到的结论就是:发优惠券的人的转化率比不发优惠券的人的转化率还要低。

这是一个很奇怪的结论,并不符合直观,为什么会这样呢?我们对这个用户进行拆分,发现了一个比较敏感的维度,就是用户的历史支付频次,或者他的活跃度。历史支付频次高的用户,发优惠券和不发优惠券是一样的消费水平,也就是发优惠券对于这类人群没有增益,但是对于一些低活人群发优惠券带来的增益比较大。

从这个维度拆开来看,得到的结论就和随机实验的结论一致了。但是如果没有看到这个维度,得到的结论可能是相反的。这也是因果推断比较重要的一个现象,学术上叫辛普森悖论。产生这个悖论的背后原因是混杂因子,这个例子中的混杂因子是支付频次这个特征,它能够影响线上发券的策略,同时影响了转化率。从因果图可以看出,正常我们想要知道是 T(treatment)对于 Y(outcome)的影响,但是如果存在这样一个 c(confounding) 的时候,如果不把 c 消除掉,那么从 T 到 Y 就有两条路径,直接路径和通过 c 得到的路径。

经过 c 这条路径产生的 effect 叫 confounding bias,它并不是我们想要的,会对我们的结论产生干扰,甚至会导致负向结论。所以这里的纠偏很大程度上要解决的就是这一类 confounding bias 问题。

3. 怎么避免/缓解混淆因子的干扰?

前面简要介绍了 confounding bias 的概念,接下来要刻画出 confounding bias,给出一种形式化表达。简单的均值差异来计算效应的时候能够分解得到的一个 confounding bias,实际上就是这个人在不干预的情况下的转化结果,或者说不干预的情况下的 outcome 和对照组里面不干预的 outcome 之间的差值。

实验组和对照组两个不同质,基础的转化率或者基础的 outcome 不一致的情况,就是存在 confounding bias。举一个例子来更直观地说明。在优惠券的例子中, confounding bias 刻画出来就是高活跃人群,其日常消费水平远高于低活跃人群的转化水平,即使是不发优惠券的时候,他们之间的转化率都有很大的差异,这个差异就是我们需要去解决掉的 confounding bias。

从两个角度来讲,一是从 outcome 来讲,干预之后只能观测到发优惠券的人在发优惠券之后的 outcome,发之前的情况并不知道,但是在干预之前是可以看得到它们之间的差异的。所以一类方法就是用干预之前它们之间的差异来刻画 confounding bias,同时在模型建模的时候以优化历史 confounding bias 的方式来降低未来的 confounding bias。

另一个角度,是从试验数据来做。因为试验数据的 treatment 是随机分配的,所以对于试验数据没有 confounding bias,一定是等于 0 的,但是试验数据在现实中往往比较少,在真实的工业界也不可能大量地去做随机实验,所以随机实验往往是少数。第二类解决方案就是用大量的实验观测数据,结合少量的实验数据,去缓解混杂因子对因果推断的干扰。

02

基于时序数据纠偏

1. 双重差分

第一类方法,双重差分,是基于时序的纠偏方法。即估计这个人的效应时不仅以干预后 outcome 的差来做 treatment 的 effect,同时还要减去干预之前的 outcome 的差来做纠偏,干预之前的 outcome 的差就认为是 confounding bias,能够把它减掉。

举一个直观的例子,我们不知道双 11 对于 GMV 的影响有多大,因为我们不知道在正常的 11 月份它的转化率或者 GMV 是多少。如果用双重差分的思想,就是拿一个其他国家 11 月份的电商 GMV 和我们国家双十一电商的 GMV 做差,同时减掉 10 月份我们两个国家的差,减掉的就是我们两个国家整体上电商 GMV 的基础水平的差异,用这种方式去消除 confounding bias。

这种方法其实已经存在了很久,其最大优点就是简单,而且能基于实例的 y 时序的特点,去解决未观测到的 confounding bias 的问题。但它的缺点也很明显,就是依赖一个很强的假设,即平行假设,并且无法估计一致性效应。即只能去估计整体的 GMV 的增长,不能知道对每一个人的差异有多大。这里的平行假设是 10 月份的 GMV 差等于 11 月份没有双十一的 GMV 差,也就是假如没有双十一存在,两个国家的 GMV 是平行的两条线,所以也叫平行假设。但这个假设是没有办法去测试的,无法验证对错。

一个改进就是把这个假设放得更弱。看过去一段时间,两个国家之间 GMV 是否平行。建立一个实验组,在全世界的国家里找到一个国家,过去一年内的 GMV 与中国 GMV 近似平行的一个国家。如果已经看到过去一年两个国家的 GMV 的趋势都是平行的,那么有理由相信随着时间的变化,未来趋势也会延续这个趋势,它们之间的 GMV 差异也是在这个范围内的。这就是一个更弱的假设,近似平行假设。先去保证在干预之前的 T-1 时刻平行,然后去假设下一个时刻会延续这样的平行趋势。

2. 双重差分树(DiDTree)

把这个假设用在建模过程中。我们选择了树模型建模,因为树在表格数据上有比较好的鲁棒性。那么如何把这个假设落到树模型的一种损失呢?这个假设的核心是强调在干预之前的一段时间,它们之间的趋势要平行,所以要设计出一种损失来衡量实验组和对照组之间的平行性,或者违反平行性的代价是多少。我们用的方式就是用一个违反平行的损失来衡量它们目前平行性的状态。

从图例来看,两条线在这段时间的差值减掉过去 T-1 时刻的差值的均值,这个值如果小到等于 0 的话,就表示这段时间是平行的。相当于在一棵树的叶子节点里是平行的,如果整棵树都按照这种方式建模,我们得到的一棵树每个叶子节点里面的一个小区域,都能保证在干预之前 T-1 和近似的平行,那么在估计效应的时候就能够在每个区域里面利用双重差分的方法,因为它近似满足了双重差分所需要的前提条件,也能够用这种方式估计相对无偏的因果效应,解决 confounding bias 的问题,同时也能克服双重差分无法解决个体效应估计的问题。因为每一个叶子节点能把空间划分得不一样,它们的效应不一样,所以可以用每个叶子节点来代表一个局部的因果效应,这样就能做到个体的因果效应。

具体来讲,在设计损失的时候,除了前面提到的平行损失之外,还会包含另外一块损失,就是除了要保证双重差分满足的假设条件,还要保证估出来的效应比较准,这里还有一部分损失,用来衡量在叶子结论里面效应的一致性,也就是 R data 这一部分。这里衡量的损失,直接用树预测的结果和它本身观测的 outcome 来计算损失。用这种方式,尽量保证效应估计的准确性。

通过追踪双重差分受到的损失包含两部分,一部分是尽量保证双重差分估计的前置条件平行损失,保证它的假设条件,另外一部分是为了达到精度做的一致性损失,把这两部分通过 trade off 得到整棵树的优化结果。

除了单棵树之外,为了得到更高的精度,我们采用了 Gradient Boosting 的方式,把单棵双重差分树进行集成。集成的损失和前面提到的一样,只不过是把单棵树里面的平行损失和一致性损失都扩展成一个可加的形式放到 Gradient boosting 框架里面来实现多棵树的集成。

整体上因果差分树就是通过这样的方式来实现纠偏,同时保证估计效应的准确性、一致性。这篇工作已被 ICML23(2023 年的国际机器学习大会)接收。

3. 实验

实验分为两部分,一部分是在仿真数据上做实验,一部分是在真实数据集上的结果。对仿真数据主要是利用自回归的方式来仿真模拟时序数据的生成。对比方法选择的是传统的 DiD 方法,以及常用的 Meta-learners、Causal forests,还有 NN 的方法。

第一块我们做了一个结果,想要去衡量数据集满足平行假设与否对于我们的方法的敏感性。这个图里面横坐标是 ρ,代表这个数据集是否满足平行假设。当 ρ 等于 1 时,是完全满足平行假设,ρ 等于 0 时是完全不满足。通过对比可以看到,我们的方法基本上一直是比较稳定的,而且随着平行假设越来越被满足,其优势愈发凸显。

我们还做了一个满足平行假设的仿真实验。控制实验组和对照组的比例,也就是实验组对照组不平衡的情况下的敏感性,用来衡量整个数据集里实验组的比例变化,从只有极端的情况下 5% 的实验组,到整体的 95% 全是实验组的情况。我们的方法相对于其他方法,依然表现出了一致的优势,尤其是当比例比较悬殊的时候,其他的方法,尤其是 NN 的方法会发散得比较快,但我们的方法整体上还是比较鲁棒的。

接下来是一个真实实验的结果。因为真实实验没有 ground truth 个体力度上的效应,所以只能评估 ATE 的结果。ATE 的结果可能只有一个值,所以这里把数据集分成两部分,分别去评估其 ATE,分割的阈值从 0 到 100% 变化。

上图下半部分的图中,横坐标就是划分数据集的阈值,按从 0 到 1 划分整理出来的结果,这是真实数据集上的结果,整体上结论与前面保持一致。

03

基于实验数据纠偏

1. Data fusion and Shrinkage Estimation

接下来介绍另外一种纠偏方法,从少量的实验数据入手。前面提到实验数据代价比较高,也比较少,但其优点是不存在 confounding bias,质量很高。当然如果我们直接用少量的数据去学一个模型,它虽然无偏,即均值是趋近于整体的,但是个体力度上方差很高,因此这样的模型其实是不可用的。而有偏的观测数据则相反,代价很低,量也非常多,但是会存在一些未观察到的混杂因子,我们直接用它去学习的模型,可能方差很低,也就是说一个点的估计可能会相对比较准,但是整体上偏差很高,它的均值、增值偏差可能会比较大。

这里要介绍的方法是融合这两类数据,得到一个更好的数据。做之前也会有一些假设,首先是实验数据和观测数据的真实效应一致。除了这个假设以外,另外两个假设都是正常因果效应里常用的假设。有了这样两类数据,怎样去做融合呢?这里融合主要应用了统计学上的 shrinkage estimation 的方式。假设有实验数据和观测数据两个数据,训练了两个模型,其参数为有偏参数和无偏参数。那能否通过一种线性融合的方式去做线性加权 w,得到一个更好的参数?在 MSE 上比二者都要好,在方差和均偏差之间做 trade off 实际上是可以的。

上图中右下角是一个简单的演示,橙色的是一个无偏估计的参数,它的均值是准的,均值是无偏的,这个轴线就是 ground truth(基准真实值),可以看到它的均值就是 ground truth,但是它很扁,方差很大。而蓝色的是有偏的部分,均值的部分是有偏差,但是整体上它的方差很低,很尖锐。我们通过一个系数融合,得到右边绿色的部分,它能在均值方差之间做 trade off,至少从 MSE 的角度去衡量是有着更低的损失的,这就是我们的一个最基础的版本融合。

怎么将此方法用在建模过程中呢?我们在建模时依然选择树的方法。前面提到 shrinkage estimation 的方式是通过一个线性加权。这个线性权重的 w,实际上是通过分解 MSE 的损失,得到的一个二次的解析式。二次的解析式的形式实际上是有最优权重的,而且这个解析形式涉及到三个部分:有偏数据估计器的方差和无偏估计器的方差,以及一个偏差。而这个形式里面只需要去关注无偏估计器的偏差,因为实际上估计器的方差和样本的量级成反比,而这样的设定里面,无偏估计的样本是远远小于有偏估计样本的,所以这个无偏估计的方差远远大于有偏估计的方差,因此这个有偏估计的方差可以被去掉。这个最优的形式可以近似成去掉有偏估计的方差。

有了这样的推导过程,我们能够去解在一个常量效应的权链下的最优权重。这样的方式对应一个叶子节点 local 的条件下的效应,可以直接套用左边的解析过程。

因为在一个叶子节点里去估计它的效应,虽然叶子节点里是一个常量,整棵树是非线性的,但是在一个叶子节点它是局部的常量值,所以对每一个叶子节点我们都可以去解出来一个最优的权重,但不同的叶子节点的权重也是不一样的,所以这个权重整体上也是一个非线性的函数。

实际上做因果的时候,效应是没有 ground-truth 的,无法直接用监督学习的方式去拟合损失?我们这里采用的是常用的 outcome transformation 的方式。一个伪 outcome 的方式,有一个特点就是它的均值实际上是等于 effect 的,同时这样去做,在叶子节点我们也能估计出来它的方差,无偏估计器的方差也是通过样本能很容易算出来它的方差和偏差。这样,在一个叶子节点里面,我们也能估计出基于 shrinkage estimation 方式的一个最优效应以及对应的权重。

这样就可以在任意一个因果树里面的叶子节点,通过这种方式将有偏估计的数据和无偏估计的数据做融合,直接产出一个最优效应的结果。这一方法称为 Shrinkage Causal Tree,作为我们基线 1.0 的方法。

这个方法不仅可以应用于叶子节点估计效应,还可以用在树的分裂。这个时候我们需要去修改树的损失函数。前面提到,一般我们可以按照 MSE 的损失去计算左右指数的 MSE 的损失的和,里面的估计参数换成前面按照 Shrinkage Estimation 得到的最优结果,同时这个损失也可以经过变换得到更简洁的只依赖于无偏数据的方差的形式。

有了这样的形式,整棵因果树在建模的时候,以最小化左右指数的形式的损失来构建这样的一个因果树,这个因果树叫 Fused and Accurate Shrinkage Tree 的 FAST 版本。在此基础上我们自然地去做一个 Ensemble,这里 Ensemble 采用的是 forest 的形式来去做融合。这个版本叫做 RF 的 FAST 版本。

2. Experiments

接下来介绍实验的结果。实验分两部分,一部分是仿真实验,另一部分是真实数据的实验。我们采用了两部分的 baseline,一部分是因果树本身去做消融实验的 baseline,另一部分是其他一些数据融合的方法。

HT 是正常的 honest 因果树,只用无偏数据来训练;SF 是任何一个因果树直接把有偏数据和无偏数据合到一起,直接去训练的版本;ST 是在估计叶子节点的时候,用 Shrinkage Estimation 的方式去融合,但分裂的准则并不改变。最后的 FAST 是去改变分裂准则,同时叶子节点估计也用 Shrinkage Estimation 的方式。

右边图的横坐标表示的是整个数据集有偏数据的偏差程度,越往右边有偏数据集的偏差越大。从结果中可以看出,SF 不做任何处理,把两份数据有偏数据无偏数据合到一起,随着有偏数据的 bias 增加,直接就会发散。但相比之下,两个 shrinkage 方法表现相对稳定,FAST 表现最优。

这一部分的实验,左边是用 FAST 方法的消融实验,不同的模块组件去做相同实验,然后去跟其他数据融合方式进行对比;右边是在真实数据上做了一个数值实验。这两项实验的结果表现是一致的。FAST RF 整体上表现出了最稳定的状态。

04

在蚂蚁的应用

在蚂蚁,因果推断的应用场景非常多。比如做提额/降价的时候,要先去估计提额能增加多少用户消费,降价是不是会降低用户消费水平,或者增加用户风险。我们需要去估计提额/降价可能对目标带来的影响。这种情况很难去做随机实验,因为这样的数据做随机实验,代价是非常高的。而我们拿到了大部分数据,都是观测数据,即历史和策略,或者各种模型做出来的数据,数据偏差往往比较大,所以也非常有必要去做一个纠偏环境。前面提到的两类方法,在蚂蚁的风控场景都有广泛应用。

05

问答环节

Q1:是否可以理解 DiDTree 就是在因果森林的基础上增加平行的约束项?

A1:DiDTree 用的不是森林,而是 Boosting 的方式。另外,如果从单棵树来看,它相对于传统的因果树,差异有两点:一点是它分裂的时候损失除了一般我们想要去估计效应的一致性损失之外,还会加一个平行性损失,而这个平行性损失实际上是为我们第二点去做保证的。第二点就是在估计效应的时候,采用双重差分的估计器,而不是传统的因果树效应。因果树直接就拿落在一个叶子迭代的样本的均值差来估计效应,这样会带来偏差。而我们实际上是用双重差分的方式去估计的。

Q2:在做 uplift 模型的时候,按模型分排序以后,实验组的增益没有单调性,应该怎么样调整?

A2:这也是我们经常遇到的问题。我理解没有单调性,指的是按照 uplift 分排序之后,比如分五桶,分了之后它的每一桶之间的效应,不是单调递减的。这样的问题,做的过程确实会存在,它很大程度上是由于你的效应估计的相对关系不太准。一般在这种情况下,可能需要去提升模型估计效应的准确性。除了换不同的方法和加数据之外,还可以按照经验去加一些约束,因为不加约束,估计出来的效应有很多和实际是不符的。以电商为例,给用户发优惠券,理论上它的效应不应该是负的,但是正常情况下你会发现估计出来的效应有的人甚至是负的,这个是不合理的。这个时候可以修改模型,保证它估出来的效应是非负的,满足经验上的假设,或者你知道一个用户的消费水平和他的自用频率是正相关的,那也可以去保证估计出来的效应和一些经专家知识得到的特征,是一个单调的关系,做这样的一些约束会对模型排序结果带来一定的提升。

Q3:对于 DidTree 的单棵树来说,哪些平行假设比较不符合叶子节点,还是同样用双重差分估计?

A3:谢谢这位同学,问了一个很致命的问题。我再重新讲一下整体的思想:双重差分树的设定就是整个数据集本身是不平行的,但是树的核心是对空间进行划分,所以这棵因果 DidTree 的核心思路,就是找到一个合适的划分,使得每个叶子节点里面整体的平行性达到最优。所以有可能会存在你说的局部的某一些节点平行性并不那么好,但用的时候还是得用双轮差分去估计,所有的都得去用双重差分估计。当然分裂的目标还是使得所有的叶子节点尽量地平行,通过调整空间划分的方式。
以上就是本次分享的内容,谢谢大家。


分享嘉宾

INTRODUCTION


唐才智

蚂蚁集团

算法专家

硕士毕业于东南大学,目前任职于蚂蚁集团的智能引擎事业部。主要研究方向包括因果推断,可解释等方向,工作内容是将其应用于蚂蚁推荐,营销以及风控等场景以解决实际的业务问题,目前在这些场景均取得显著的业务效果。本次分享的主题“在蚂蚁风控场景上的因果纠偏方法”,里面我们提出的方法也被 NeurIPS'22/23,ICML'23,SIGIR'23 等多个机器学习会议接收。

直播推荐



往期推荐


大数据分析平台之 OLAP 架构的最佳实践

大模型的高效训练和部署技术卷出新高度!

数据分析及指标中台核心能力建设实践

腾讯TRS之元学习与跨域推荐的工业实战

小米数据中台建设实践赋能业务增长!

360跨模态视频开放式标签挖掘技术实践分享

当因果推断遇上了医学研究

第三代指标平台:真正实现“管、研、用”一体化

大模型在知乎舰桥平台的应用和实践

企业如何构建指标平台并实现智能分析?

业务理解和逻辑推理是金融大模型运转的动力

度小满金融大模型技术创新与应用探索

大模型在新能源汽车行业的应用与最佳实践


点个在看你最好看
继续滑动看下一个
DataFunSummit
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存