导读:因果推断在智能营销场景有着广泛的应用。在哈啰出行酒店营销业务中,自研Tree-based因果推断模型通过修改分裂准则,使得模型目标和业务目标的一致性更高,在智能补贴模块中取得了较好的效果。
本文的主要内容包括:
背景介绍,简单介绍智能补贴及其中的一些问题;
因果推断的应用,主要是Uplift建模,即增量预估;
因果推断在哈啰智能补贴场景的应用,包括一些创新;
问题的思考和未来的规划。
背景介绍
天降红包场景
哈啰出行的基本业务是两轮共享出行业务,包括单车和助力车。同时,也有针对用户需求而推出的服务和产品,例如酒店业务。
文章图片
以酒店业务促销为例,这一业务的目标是使总效用最大化。想要提高总效用,通常会给用户以发优惠券的形式做补贴,从而促使用户转化。
文章图片
智能补贴
从用户层面进行下钻分析。左图按照经典的营销人群四象限,从“是否发券”和“是否购买”两个维度,将用户分为了四类人群。其中:
- 营销敏感人群指对价格比较敏感,没有优惠就不会购买、有优惠才会购买的人群;
- 自然转化人群是指无论是否有优惠都会购买的人群;
- 无动于衷人群是指无论是否有优惠都不会购买的人群;
- 反作用人群是指没有优惠活动触达时会购买,但有优惠活动触达时反而不会购买,对营销活动比较反感的人群。
文章图片
用户对价格的接受程度是不一样的,并且在用户量庞大的情况下,是不可能给所有用户都发放优惠券的。
以往是依照运营的经验,根据用户的需求来制定发放策略。后来有了算法的介入,使用机器学习算法来预估用户的购买概率。最初使用的是CTR预估模型,也就是Response模型的相关性模型,虽然模型策略相对运营策略而言有一定的提升,但也存在一些问题。
文章图片
从具体case来看,左表中假设现在有两个用户。通过Response模型的预估,我们得到了在发券情况下两个用户的购买概率,同时我们也知道他们在不发券情况下的购买概率。可以看到,发券之后两个用户的购买概率都是提升的,并且用户2的购买概率(1.5%)要高于用户1的购买概率(1.3%)。如果按照这种结果,我们是否可以决策应该给用户2发放优惠券?
前面我们也提到过,我们的目标是提升补贴效用,所以需要再从效率的角度再来计算一下。右图中,假设用户1和用户2各有一万人,商品的原价是10元,优惠券的金额是2元,那么如何发券会使效率最大化呢?我们可以计算一下效率的期望。以总人数乘以购买概率,再乘以价格,就可以得到如下的效率情况:
- 都不发券时,总效用是2200;
- 都发券时,总效用是2240;
- 用户1不发券,用户2发券时,总效用是2000;
- 用户1发券,用户2不发券时,总效用是2400。
文章图片
我们再来看一下用户1和用户2在发券后的购买概率变化的差值,也就是新增的这一列Uplift的值。可以看到发券后用户1的购买概率提升了0.5%,用户2的购买概率提升了0.1%,可以看出发券对用户的影响效果大小是不一样的。它可以预测用户的购买概率,但是它无法告诉我们用户是否因为发放优惠券而产生购买,也就无法识别出营销敏感人群。
表格中显示了Response模型和因果推断的关系。从发券到购买是有因果关系的,此时就要用到因果推断技术。
相关性模型是基于观测结果得到的,比如观测到了什么、购买概率是怎样的,主要用应用在搜索广告推荐等场景。然而补贴场景中的发券动作,可以看作是对用户的一次干预行为,有无法观测到的异常,我们称之为反事实。也就是说在有干预存在的情况下,相对于没干预的情况下,它是什么情况?比如说如果我当时没有给用户发券,它的结果会是怎样?这是因果推断所研究的问题。
在营销领域的应用主要是增量预估,也就是我们所说的Uplift建模,可以通过增量的大小来识别出营销敏感人群。
因果推断 接下来我们看一下Uplift建模,这部分主要会讲一些常用的建模方法,还包括一些离线评估的方法。
文章图片
通过前面部分的介绍我们已经知道相关性和因果性是不一样的,我们这里再举一个例子。在数据统计网站中有很多有趣的相关性的统计,其中有一个是尼古拉斯凯奇参演电影数量和当年度泳池溺水身亡人数的相关性统计,这两条曲线的重合度非常高,是不是可以得出结论——因为尼古拉斯凯奇演电影导致人溺水呢?显然不是。还有很多这样的例子,主要为了说明相关性和因果性并不一样的问题。
文章图片
因果推断
回到正题,Response模型和Uplift模型主要的区别可以用这两个公式来描述。Response模型主要是预估用户的购买概率,Uplift模型主要预估因为某种干预后用户购买的概率。因果推断技术在营销场景的主要应用,就是基于Uplift建模来预测营销干预带来的增益。
文章图片
因果效应
那么Uplift模型是如何做到增量预估的呢?我们在这里介绍因果效应的概念。假设有n个用户,Yi1表示对用户i进行干预的结果,Yi0表示对用户i无干预的结果,那么用户i的因果效应就可以表示为Yi1减Yi0。在我们的场景中,Y1和Y0就分别代表了发券和不发券。但是要注意的是存在反事实的问题,因为对同一个用户,我们不可能既得到他发券的结果,又得到他不发券的结果。后面我们会讲到反事实问题目前的解决思路,Uplift建模的目标因果效应,也即应用场景中发券带来的增量收益。
文章图片
Uplift建模方法
接下来介绍Uplift建模的常用方法。这里建模用到的数据都是包含有干预的数据和无干预的数据的。
T-Learner,其中T代表two的意思,也即用两个模型。它的主要思想是对干预数据和无干预数据分别进行建模,预估时数据进入两个模型,用两个模型的预测结果做差值,来得到预估的增量。该方法的优点是原理比较简单直观,可以快速实现。但缺点是,因为两个模型的精度不一定非常高,所以两个模型的误差会有叠加,并且因为有差分的操作,这是间接计算的增量。
S-Learner,其中S代表single,也即用一个模型。它的主要思想是把干预作为特征输入模型,在预测时,同样是用有干预的结果和无干预的结果做差,得到预估增量。和Response模型比较像,就相当于特征里面有“是否干预”这样的特征,它的优点是,相比T-Learner减少了误差的累积,但缺点同样是间接的计算增量。
X-Learner,它的思想是先分别对有干预、无干预数据进行建模,再用两个模型来交叉预测,得到干预数据和无干预数据分别的反事实结果。因为这是训练数据,它是有真实label的,再用真实label和刚才预测的反事实结果做差,得到增量;把增量再作为label,再针对增量进行建模。同时对有无干预进行建模,得到干预的倾向分,并在预测增量的时候引入倾向分权重。方法的优点在于,可以对前面我们预测出来的增量建模时加入先验知识进行优化,来提高预测的准确性,另外还引入了倾向分权重来减少预测的误差。但它的缺点也是多模型的误差,可能会有累积,并且归根结底也是间接得到预测增量。
上面这几种方法都是间接得到预测增量,当然,也有直接对增量进行建模的方法,比如基于决策树的模型Tree-based Model。近几年也有一些深度学习的方法,比如DragonNet。时间关系,这里不详细介绍。
文章图片
评估方法
那么Uplift模型应该如何评估呢?这里我们可以看到,因为有反事实问题的存在,我们是没有真实的增量标签的,传统算法的评估方法,如AUC、准确率、RMSE等都是依赖真实标签的评估方法,在该场景中无法使用。Uplift模型的离线评估使用的指标是AUUC,它的含义是Uplift曲线下的面积。可以看一下右上角图中蓝色Uplift的曲线,AUUC的指标对曲线做积分,求它曲线下的面积。问题又来了,Uplift曲线是如何得到的呢?我们可以看一下公式。这里我还列了一下AUUC的计算流程,帮助大家理解。
第一步,测试集进入模型,输出Uplift Score;
第二步,所有测试样本根据Uplift Score做降序排序;
第三步,进行分桶,每个桶的序号记为t;
第四步,计算每个t的累计增益。其中,Y表示分组的正例的数量,T代表是有干预,C代表无干预,YT表示有干预组的正例的数量,再除以NT有干预组总的样本数量。假设label是“是否转化”,我们就可以看到YT除以NT是干预组的转化率。同样,YC除以NC是无干预组的转化率。可以看到公式左边是干预组相对无干预组的转化率的增量,右边是样本的总数量,公式计算了收益,也即干预组相对无干预组提升了多少转化。
第五步,求积分,计算曲线下的面积。
Uplift Score 越准,第一步对样本的排序越准,排序越靠前的桶实验组和对照组的指标的差值会越大。这表现为曲线的拱形。所以AUUC相对越高,就说明相对而言模型越好。
因果推断在哈啰的应用 接下来介绍一下因果推断在哈啰是如何应用的,主要是Tree-based模型。这部分会详细讲解Tree-based模型和一些创新应用。还有离线和线上的效果的展示。
文章图片
红包补贴
这部分应用主要是在酒店营销场景中的红包补贴模块,属于整个算法链路中的一环。前面已经提到过,我们的目标是使补贴效用最大化。主要看的指标是人均效用,即总效用除以人群的人数。
我们的模型是基于Tree-based的Uplift模型做了一些改进。
文章图片
Tree-based Model
我们把基于决策树的Uplift模型和普通分类决策树放在一起做个比较,这样方便理解。
二者主要不同在分裂的准则和目标。普通的决策树的分裂准则是信息增益,这样使得叶子节点的信息熵最少、类别的不确定性最小,以达到分类的目的;而基于决策树的Uplift模型的分类准则是分布散度,比如常用的有kl散度、卡方散度,这样可以使叶子节点中干预组和无干预组的分布差异最大,来达到提升增益的目的。
从右边的示意图可以看出基于决策树的Uplift的模型是如何做到区分营销敏感人群的,每个叶子节点的图标表示的是叶子节点中占绝大多数的人群。这样我们就可以比较容易地区分出营销敏感人群。
那么我们为什么要选择基于决策树的模型呢?主要有两点考虑:
① 树模型解释性比较强,这点对业务的应用比较有帮助。
② 直接对增量建模的准确性更高,对业务的提升是我们最关心的事情。
接下来看一下我们是如何改进基于树的Uplift模型的,从而实现以增量收益最大化为目标的Treelift模型。刚才已经提到,树模型最重要的点是分裂准则和目标的一致性。我们可以通过修改分裂准则,来使得模型的目标和业务目标一致性更高。
目前业界主流的用法还是在用户转化上,也就是说样本的label为0或者1,因此就可以使用kl散度作为节点的分裂准则。而我们的目标是人均效用,用kl散度并不太合适,因为kl散度是衡量概率分布的,因此我们改进了分裂准则来匹配业务目标。
文章图片
以增量效用为目标的TreeCausal
这里我们是以效用作为样本的label,那么以干预组和无干预组的人均效用的差值的平方作为节点的分裂准则,这里的目标是最大化人均效用差值的平方。
算法流程:
第一步,假设分裂前的数据集为theta,那么计算分裂前发券组和无券组样本人均效用的差异。这里我们效用的差异是这样定义的。G是每一个用户的label。我们对有干预组的每个人的效用做求和,再除以干预组的样本数,得到人均效用,再减去无干预组。这个差值做平方,这样可以计算出分裂前的效用差异。
第二步,根据某个特征f将数据集theta分成左右两个子集theta1和theta2,计算分裂后的人均效用差异,可以看一下右边的示意图。如果特征的值等于f,就可以分到左子集,如果不等于f,可以得到右子集。接着对每一个子集都计算人均效用的差异,再根据每一个子集的样本比例作为权重,加权求和,最终得到计算差异。
第三步,计算增益。分裂后的人均效用差异减去分裂前的人均效用差异,得到增益。
第四步,遍历数据集theta中所有的特征值,重复进行第二步、第三步,我们会得到很多对应不同特征值的增益。我们取增益最大时对应的特征值,作为节点的分裂值,将数据集分为左子集和右子集。
第五步,递归调用,对左子集和右子集再重复上述步骤,生成Treelift模型。
文章图片
随机试验
接下来是关于训练数据的。
前面我们提到过,由于反事实的存在,我们无法同时观测到同一用户发券和不发券的结果。那么如何让模型学习到发券带来的增益呢?如果说我们站在人群的角度上来考虑群体增益,那么只要保证是否发券与用户的特征相互独立,就可以分析发券的群体相对不发券的群体带来的增益。
这里很容易就可以想到,可以通过随机实验来获得满足需求的数据,但随机实验的成本比较高。当然也还有一些其他的解决方法,比如说倾向性得分的匹配,这也是目前研究比较多的点。但是根据需求考虑到,我们需要验证因果推断方法的业务效果,最终还是选择了小流量随机实验来获取符合要求的数据。如右图所示,我们通过分流平台做了两次分流,第一次分流是切除随机实验用的小流量,第二次分流则是随机将用户分到实验组(发券组)和对照组(不发券组)。
文章图片
实时决策
接下来是红包补贴模块的核心部分,分为离线和线上两部分。
线上部分,依然是通过流量分配时请求进入算法组、运营组或者是随机补贴组。其中:
运营组是人工策略;
随机补贴组是前面提到的小流量随机实验,从小流量随机实验得到的训练数据用来建模,可以得到Treelift模型,进行一键评估,最后部署到线上;
算法组的流量由模型来决策发券。
模型的离线评估部分测试了不同的模型,最后得到的结果是我们经过改进后的Treelift模型的AUUC是最优的。可以看一下右上角不同模型之间的对比,我们对比了T-model、S-model,还有Treelift模型,以及我们在正则方面的一些尝试的模型对比。从线上效果来看,Treelift模型相比人工策略有4.7%的提升,相对于我们之前用过的Response模型也有2.3%的提升。从结果来看,优势是非常明显的,Uplift模型在智能补贴场景的应用前景还是比较广阔的。
以上是因果推断技术在哈啰应用案例的介绍,希望能给大家一些启发。
未来规划 最后是我在应用过程中遇到的一些问题和思考,以及未来的规划。
首先是训练数据的问题。前面我们也提到了,是通过小流量随机实验来得到训练数据的,但是这种方法的成本确实很高。如何充分利用观测数据是一个难题,我们也会去尝试业界的先进经验,比如说倾向性得分匹配法等。
另外是树模型本身的问题,训练速度偏慢。另外像剪枝、正则目前我们还没有特别的优化。这部分未来是也是可以深入研究的。目前已经有了一些深度学习的方法,也是后续尝试的方向。
业务方面,因为我们是将补贴金额算到了样本的label中,从而简化了成本问题。但实际上很多场景中成本是需要单独考虑的,因此券金额的分配也将是问题。这里可以通过整数规划来求解全局最优,我们未来可以也会在其他的场景上进行一些尝试。
提问环节 问题:为什么AUUC能反映反事实转化效果?
文章图片
我们可以看一下Uplift曲线是怎么计算的。首先它的变量是t,t是根据Uplift Score降序排序之后,进行分桶得到的。以图为例,0.2就代表20%,根据排序之后,我们取前20%的数据,取出来这样的数据,来计算后面的公式。左边因子这部分YT除以NT这一部分是代表的是实验组(发券组)的转化率,YC除以NC代表的是对照组(不发券组)的转化率,差值是发券相对不发券带来的转化率的提升的幅度差值,再乘上总的样本数量,就比较清楚了。假设所有人都发券,和所有人都不发券相比,额外提升的幅度就是对于增量的预估。
【因果推断在哈啰出行的实践探索】
文章图片
推荐阅读
- leecode题解|「代码随想录」968.监控二叉树【贪心算法】力扣详解!
- C语言与C++编程|二叉树操作详解
- 链表|关于链表的经典OJ题
- 算法|不会有人2022年还不懂栈吧()
- 算法|【算法】【C语言进阶】C语言字符串操作宝藏级别汇总 strtok函数 strstr函数该怎么用(【超详细的使用解释和模拟实现】)
- 人工智能|PPF(Point Pair Features)原理及实战技巧
- 手撕|应对嵌入式校招面试手撕之——链表
- 算法|软件工程师 算法工程师_采访100多位软件工程师后的建议
- python|硬件工程师需要数学功底吗_您不需要数学就可以成为软件工程师