文章目录

  • 增益模型因果与推论(Causal Inference)
  • 增益模型的表示
    • 差分响应模型(Two-Model Approach)
      • 模型优缺点
    • 差分响应模型升级版(One-Model Approach)
    • Class Transformation Method
      • Class Transformation的两个假设
    • Modeling Uplift Directly
  • 增益模型的评估
    • uplift 柱状图
    • Qini曲线(Qini curve)
    • 累积增益曲线(Cumulative Gain curve)
  • 优惠券发放Demo
    • 差分响应模型
    • Class Transformation Method
  • 传统响应模型
    • 模型评估
  • Python Uplift Modeling工具包:Pylift
  • 总结
    • 训练样本收集
    • 多维度建模与个性化广告推送
  • Reference

增益模型因果与推论(Causal Inference)

常用的点击率预测模型,称为响应模型(response model),即预测用户看到商品后点击的概率。在智能营销的发放优惠券场景下也可以使用这种模型,即用户看到优惠券后购买商品的概率。但在这种场景下,很自然会想到,用户是本来就有购买的意愿还是因为发放了优惠券诱使用户购买?对有发放优惠券这种有成本的营销活动,我们希望模型触达的是优惠券敏感的用户,即发放的优惠券促使用户购买,而对优惠券不敏感的用户——无论是否发券都会购买——最好不要发券,节省成本。营销活动中,对用户进行干预称为treatment,例如发放优惠券是一次treatment。我们可以将用户分为以下四类:

  • persuadables不发券就不购买、发券才会购买的人群,即优惠券敏感人群
  • sure thing:无论是否发券,都会购买,自然转化
  • lost causes:无论是否发券都不会购买,这类用户实在难以触达到,直接放弃
  • sleeping dogs:与persuadables相反,对营销活动比较反感,不发券的时候会有购买行为,但发券后不会再购买。

建模时主要针对persuadables人群,并且要避免sleeping dogs人群。如果使用reponse model,则难以区分这几类人群,因为模型只预测是否购买,但人群的区分需要明确是否因为发放优惠券才导致了购买行为,这是一个因果推论问题(causal inference)。在优惠券发放Demo一节可以看到,response model(一个预测模型)可以取得很好的效果(转化率很高),但转化的用户中persuadable的比例相当少,并不是营销中的target。

营销活动中,我们要预测的是某种干预(treatment)的增量,这种模型称为增益模型(uplift model)。设GGG表示某种干预策略(如是否推送广告),X\boldsymbol{X}X表示用户特征,Y=1Y=1Y=1表示用户输出的正向结果(如下单或点击):

  • Reponse model: P(Y=1∣X)P(Y = 1 | \boldsymbol{X})P(Y=1∣X),看过广告之后购买的概率
  • uplift model: P(Y=1∣X,G)P(Y = 1 | \boldsymbol{X}, G)P(Y=1∣X,G),因为广告而购买的概率

增益模型的表示

假设有NNN个用户,Yi(1)Y_i(1)Yi​(1)表示我们对用户iii干预后的结果,比如给用户iii发放优惠券后(干预)用户下单(结果),Yi(0)Y_i(0)Yi​(0)表示没有对用户干预的情况下用户的输出结果,比如没有给用户iii发放优惠券(干预),用户下单(结果)。用户iii的因果效应(causal effect)的计算如下:

τi=Yi(1)−Yi(0)(1)\tau_i = Y_i(1) - Y_i(0) \tag{1} τi​=Yi​(1)−Yi​(0)(1)

增益模型的目标就是最大化τi\tau_iτi​,这是一个增量,即有干预策略相对于无干预策略的提升,简单讲就是干预前后结果的差值。实际使用时会取所有用户的因果效应期望的估计值来衡量整个用户群的效果,称为条件平均因果效应(Conditional Average Treatment Effect, CATE):

CATE:τ(Xi)=E[Yi(1)∣Xi]−E[Yi(0)∣Xi](2)CATE: \tau(X_i) = E\left[Y_i(1) | X_i\right] - E\left[Y_i(0) | X_i\right] \tag{2} CATE:τ(Xi​)=E[Yi​(1)∣Xi​]−E[Yi​(0)∣Xi​](2)

上式中XiX_iXi​是用户iii的特征,所谓的conditional指基于用户特征。

(2)式是理想的uplift计算形式,实际上,对用户iii我们不可能同时观察到使用策略(treatment)和未使用策略(control)的输出结果,即不可能同时得到Yi(1)Y_i(1)Yi​(1)和Yi(0)Y_i(0)Yi​(0)。因为对某个用户,我们要么发优惠券,要么不发。将(2)式修改一下:

Yiobs=WiYi(1)+(1−Wi)Yi(0)(3)Y_i^{obs} = W_i Y_i(1) + (1-W_i)Y_i(0) \tag{3} Yiobs​=Wi​Yi​(1)+(1−Wi​)Yi​(0)(3)

其中YiobsY_i^{obs}Yiobs​是用户iii可以观察到的输出结果,WiW_iWi​是一个二值变量,如果对用户iii使用了策略,Wi=1W_i = 1Wi​=1,否则Wi=0W_i = 0Wi​=0.

在条件独立的假设下,条件平均因果效应的期望估计值是:

τ(Xi)=E[Yiobs∣Xi=x,W=1]−E[Yiobs∣Xi=x,W=0](4)\tau(X_i) = E\left[Y_i^{obs} | X_i = x, W = 1\right] - E\left[Y_i^{obs} | X_i = x, W = 0\right] \tag{4} τ(Xi​)=E[Yiobs​∣Xi​=x,W=1]−E[Yiobs​∣Xi​=x,W=0](4)

上式要满足条件独立(CIA)的条件,即用户特征与干预策略是相互独立的。

{Yi(1),Yi(0)}⊥Wi∣Xi\lbrace Y_i(1), Y_i(0) \rbrace \perp W_i | X_i {Yi​(1),Yi​(0)}⊥Wi​∣Xi​

实践上,满足CIA这样条件的样本的可以通过AB实验获取,因为时随机实验,可以保证用户(特征)与干预策略是相互独立的。

增益模型要优化τ(Xi)\tau(X_i)τ(Xi​),值越高越好。然而一个用户不能同时观察到使用干预策略和不使用干预策略的结果,因此τ(Xi)\tau(X_i)τ(Xi​)是难以直接优化的。但如果通过AB实验,可以获得使用干预策略和不使用干预策略两组人群,如果两组人群的特征分布一致,可以通过模拟两组人群的τ(Xi)\tau(X_i)τ(Xi​)得到个体用户的τ(Xi)\tau(X_i)τ(Xi​)。因此增益模型依赖AB实验的数据。

下面介绍三种增益模型建模方法。

差分响应模型(Two-Model Approach)

差分响应模型很直觉。分别对AB实验的实验组和对照组数据独立建模,预测时分别实验组模型和对照组模型预测用户的分数,两个模型预测分数相减就得到了uplift score。

实验组是使用干预策略的用户(treatment),对照组是未使用干预策略的用户(control),正样本都是下单用户。即分别使用两个模型优化E[YiT∣XiT]E\left[Y_i^T | X_i^T\right]E[YiT​∣XiT​]和E[YjC∣XjC]E\left[Y_j^C | X_j^C\right]E[YjC​∣XjC​],得到两个模型,分别是GTG_TGT​和GCG_CGC​。YiTY_i^TYiT​和XiTX_i^TXiT​分别是实验组用户iii的输出结果和特征,YjCY_j^CYjC​和XjCX_j^CXjC​类似。

分别训练好两个模型之后,计算E[YT∣XT]−E[YC∣XC]E\left[Y^T | X^T\right] - E\left[Y^C | X^C\right]E[YT∣XT]−E[YC∣XC]就得到了条件平均因果效应分数。这里因果效应分数是计算出来的而不是通过模型直接优化出来的,所以本质上,这还是传统的响应模型。

以优惠券发放为例,目标是用户是否下单。训练时取实验组的用户训练,正样本是下单用户,负样本是未下单用户,预测结果是每个用户下单的概率。类似地,对照组也可以使用另一个模型预测出每个用户下单的概率。两个组的用户下单概率求平均,即可得到E[YT∣XT]E\left[Y^T | X^T\right]E[YT∣XT]和E[YC∣XC]E\left[Y^C | X^C\right]E[YC∣XC],两者相减即得到τ(X)\tau(X)τ(X)。

预测时,对用户分别使用GTG_TGT​和GCG_CGC​预测,两个模型预测的分数相减即得到预测用户iii的τ(Xi)\tau(X_i)τ(Xi​),最后根据τ(Xi)\tau(X_i)τ(Xi​)的高低决定是否发券。

训练时流程如下图。

预测时流程如下图,每个待预测用户都分别用GTG_TGT​和GCG_CGC​预测一遍。

模型优缺点

差分响应模型简单粗暴,还很直觉。但只是模拟了τ(Xi)\tau(X_i)τ(Xi​),没有真正优化τ(Xi)\tau(X_i)τ(Xi​)。两个独立的模型分开训练容易累积误差(两个独立模型的误差会累加传递到最终的uplift score)。不过考虑到实现简单迅速,实践中可以作为baseline使用。

差分响应模型升级版(One-Model Approach)

差分响应模型的训练数据和模型都是各自独立的,可以分别在训练数据层面上打通以及在模型层面上打通,得到升级版的差分响应模型。

在实验组和对照组的用户特征中,加入与TTT有关的特征,实现数据层面的打通,即实验组和对照组合并,使用同一个模型训练。这是阿里文娱提到的一种方法,但我感觉这样无法满足用户特征样与条件策略独立的假设。

Class Transformation Method

另外一种更严谨的可以实现实验组对照组数据打通和模型打通的方法叫做class transformation method,可以直接优化τ(Xi)\tau(X_i)τ(Xi​)。

定义一个变量G∈{T,C}G \in \lbrace T, C \rbraceG∈{T,C},G=TG=TG=T表示有干预,即实验组(treatment),G=CG=CG=C表示无干预,即对照组(control)。uplift分数τ\tauτ可以表示为:

τ(X)=P(Y=1∣X,G=T)−P(Y=1∣X,G=C)=PT(Y=1∣X)−PC(Y=1∣X)(5)\begin{aligned} \tau(\boldsymbol{X}) &= P(Y=1 | \boldsymbol{X}, G=T) - P(Y=1 | \boldsymbol{X}, G=C) \\ &= P^T (Y=1 | \boldsymbol{X}) - P^C (Y=1 | \boldsymbol{X}) \end{aligned} \tag{5} τ(X)​=P(Y=1∣X,G=T)−P(Y=1∣X,G=C)=PT(Y=1∣X)−PC(Y=1∣X)​(5)

上式中X\boldsymbol{X}X表示用户特征,PTP^TPT表示用户在实验组中下单的概率(输出结果为positive),PCP^CPC表示用户在对照组中下单的概率(输出结果也为positive),uplift score就是两个概率的差值。

为了统一表示实验组和对照组都下单的情况(Y=1Y=1Y=1),再定义一个变量ZZZ,Z∈{0,1}Z \in \lbrace 0, 1 \rbraceZ∈{0,1}:

Z={1if G=Tand Y=11if G=Cand Y=00otherwise\begin{aligned} Z = \begin{cases} 1 & \text{if $G = T$ and $Y = 1$} \\ 1 & \text{if $G = C$ and $Y = 0$} \\ 0 & \text{otherwise} \end{cases} \end{aligned} Z=⎩⎪⎨⎪⎧​110​if G=T and Y=1if G=C and Y=0otherwise​​

下面证明优化(5)式相当于优化P(Z=1∣X)P (Z=1 | \boldsymbol{X})P(Z=1∣X)。

假设干预策略GGG与用户相互独立,即GGG独立于X\boldsymbol{X}X:P(G∣X)=P(G)P(G | \boldsymbol{X}) = P(G)P(G∣X)=P(G),(5)式可以转写为:

P(Z=1∣X)=P(Z=1∣X,G=T)P(G=T∣X)+P(Z=1∣X,G=C)P(G=C∣X)=P(Y=1∣X,G=T)P(G=T∣X)+P(Y=0∣X,G=C)P(G=C∣X)=PT(Y=1∣X)P(G=T)+PC(Y=0∣X)P(G=C)(6)\begin{aligned} P (Z=1 | \boldsymbol{X}) &= P(Z=1 | \boldsymbol{X}, G = T) P(G=T | \boldsymbol{X}) + P(Z=1 | \boldsymbol{X}, G = C) P(G=C | \boldsymbol{X}) \\ &= P(Y=1 | \boldsymbol{X}, G = T) P(G=T | \boldsymbol{X}) + P(Y=0 | \boldsymbol{X}, G = C) P(G=C | \boldsymbol{X}) \\ &= P^T(Y=1 | \boldsymbol{X}) P(G=T) + P^C(Y=0 | \boldsymbol{X}) P(G=C) \end{aligned} \tag{6} P(Z=1∣X)​=P(Z=1∣X,G=T)P(G=T∣X)+P(Z=1∣X,G=C)P(G=C∣X)=P(Y=1∣X,G=T)P(G=T∣X)+P(Y=0∣X,G=C)P(G=C∣X)=PT(Y=1∣X)P(G=T)+PC(Y=0∣X)P(G=C)​(6)

注意到P(G=T)P(G=T)P(G=T)和P(G=C)P(G=C)P(G=C)是可以通过AB实验控制的,在随机化实验中,如果实验组和对照组的人数是相等的,那么P(G=T)=P(G=C)=12P(G=T) = P(G=C) = \frac{1}{2}P(G=T)=P(G=C)=21​ ,即一个用户被分在实验组(有干预策略)和被分在对照组(无干预策略)的概率是相等的。 在该假设下,(6)式可以改写为:

2P(Z=1∣X)=PT(Y=1∣X)+PC(Y=0∣X)=PT(Y=1∣X)+1−PC(Y=1∣X)(7)\begin{aligned} 2P(Z=1|\boldsymbol{X}) &= P^T(Y=1 | \boldsymbol{X}) + P^C(Y=0 | \boldsymbol{X}) \\ &= P^T(Y=1 | \boldsymbol{X}) + 1 - P^C(Y=1 | \boldsymbol{X}) \end{aligned} \tag{7} 2P(Z=1∣X)​=PT(Y=1∣X)+PC(Y=0∣X)=PT(Y=1∣X)+1−PC(Y=1∣X)​(7)

由(7)式可得:

τ(X)=PT(Y=1∣X)−PC(Y=1∣X)=2P(Z=1∣X)−1(8)\begin{aligned} \tau(\boldsymbol{X}) &= P^T(Y=1 | \boldsymbol{X}) - P^C(Y=1 | \boldsymbol{X}) \\ &= 2P(Z=1|\boldsymbol{X}) -1 \end{aligned} \tag{8} τ(X)​=PT(Y=1∣X)−PC(Y=1∣X)=2P(Z=1∣X)−1​(8)

(8)式就是要计算的uplift score,此时只有ZZZ一个变量,可以直接对Z=1Z=1Z=1这建模,相当于优化P(Z=1∣X)P(Z=1|\boldsymbol{X})P(Z=1∣X),而不需要分别对实验组(PTP^TPT)和对照组(PCP^CPC)单独建模。而P(Z=1∣X)P(Z=1|\boldsymbol{X})P(Z=1∣X)可以通过任何分类模型得到,所以这个方法称为Class Transformation Method. 实际上,Z=1Z=1Z=1就是实验组中下单的用户和对照组中未下单的用户,因此可以直接将实验组和对照组用户合并,使用一个模型建模,实现了数据层面和模型层面的打通。预测时,模型预测的结果就是uplift score,这点与差分响应模型不同。

Class Transformation的两个假设

注意到该方法有两个假设,

  • GGG与X\boldsymbol{X}X相互独立
  • P(G=T)=P(G=C)=12P(G=T) = P(G=C) = \frac{1}{2}P(G=T)=P(G=C)=21​

第一个假设很好理解,实践中保证用户特征与干预策略无关即可。第二个假设过于严格,难以在实践中每次都满足。但是可以通过重采样使得数据满足该假设,即使不满足(经常会有对照组数量远远小于实验组的情况),根据(6)式,训练数据的不平衡影响的只是P(G=T)P(G=T)P(G=T)和P(G=C)P(G=C)P(G=C)的权重(原来的权重是1:1),如果模型结果有意义,并且如果在测试集和线上表现良好,那么也不一定非要满足P(G=T)=P(G=C)=12P(G=T) = P(G=C) = \frac{1}{2}P(G=T)=P(G=C)=21​的假设,实践中都是结果导向。

Modeling Uplift Directly

除了Class Transformation可以直接对uplift建模外,还有另外一种直接优化uplift的方法,主要用于树模型,该方法直接修改树模型的特征分裂计算方法。常用的特征分裂指标是信息增益(information gain):Δgain=infoafter(D)−infobefor(D)\Delta_{gain} = info_{after}(D) - info_{befor}(D)Δgain​=infoafter​(D)−infobefor​(D),可以直接改为:Δgain=Dafter(PT,PC)−Dbefor(PT,PC)\Delta_{gain} = D_{after}(P^T, P^C) - D_{befor}(P^T, P^C)Δgain​=Dafter​(PT,PC)−Dbefor​(PT,PC)。

其中Dbefor(PT,PC)D_{befor}(P^T, P^C)Dbefor​(PT,PC)和Dafter(PT,PC)D_{after}(P^T, P^C)Dafter​(PT,PC)分别是分裂前后treatment和control样本的分布,可以用KL散度(KL divergence)、欧氏距离或者卡方距离来刻画这样的分布。

该方法可以直接对uplift建模,理论上精度会很高,但实际应用上除了修改分裂规则外,还需修改loss函数、剪枝算法等,成本较高。

增益模型的评估

响应模型可以通过一个测试数据集来计算precision,recall和AUC,但因为增益模型中不可能同时观察到同一用户在不同干预策略下的响应,因此无法直接计算上述评价指标。增益模型通常都是通过划分十分位数(decile)来对齐实验组和对照组数据,间接评估,而不是在一个测试集上直接评估。

uplift 柱状图

测试集上,实验组和对照组的用户分别按照uplift由高到低排序,划分为十等份,即十分位(decile),分别是top 10%用户,top 20%用户……top 100%用户。分别对实验组和对照组中每个十分位内的用户求E[YT∣XT]E\left[Y^T | X^T\right]E[YT∣XT]和E[YC∣XC]E\left[Y^C | X^C\right]E[YC∣XC],即预测分数的均值,然后相减,作为这个十分位bin内的uplift,绘制柱状图,如下图(这个图是由低到高排序,排序反了):


这种方法只能定性分析,无法计算出一个具体的值来整体评价模型的好坏。

Qini曲线(Qini curve)

可以在uplift bars的基础上绘制曲线,类似AUC来评价模型的表现,这条曲线称为Qini curve,计算每个百分比的Qini系数,最后将这些Qini系数连接起来,得到一条曲线。Qini系数计算如下:

Q(ϕ)=nt,y=1(ϕ)Nt−nc,y=1(ϕ)Nc(9)Q(\phi) = \frac{n_{t,y=1}(\phi)}{N_t} - \frac{n_{c,y=1}(\phi)}{N_c} \tag{9} Q(ϕ)=Nt​nt,y=1​(ϕ)​−Nc​nc,y=1​(ϕ)​(9)

ϕ\phiϕ是按照uplift score由高到低排序的用户数量占实验组或对照组用户数量的比例,如ϕ=0.1\phi = 0.1ϕ=0.1,表示实验组或对照组中前10%的用户。nt,y=1(ϕ)n_{t,y=1}(\phi)nt,y=1​(ϕ)表示在ϕ\phiϕ下,实验组中输出结果为1(下单)的用户数量,类似地,nc,y=1(ϕ)n_{c,y=1}(\phi)nc,y=1​(ϕ)表示在同样的百分数下,对照组中输出结果为1(下单)的用户数量。NtN_tNt​和NcN_cNc​分别表示实验组和对照组的总用户数。

如上图,横轴等于0.2时,对应的纵轴大概是0.0032(uplift score),表示当uplift score等于0.0032时,可以覆盖前20%的用户数量,从图上看,这部分用户就是persuadable用户。

图中虚线是随机的base曲线,Qini曲线与随机random曲线之间的面积作为评价模型的指标,面积越大越好,面积越大,表示模型结果远超过随机选择的结果,与AUC类似,这个指标称为AUUC(Area Under Uplift Curve)

Qini系数分母是实验组和对照组的全体用户数,如果两组用户数量差别比较大,结果容易失真。另一种累积增益曲线可以避免这个问题。

累积增益曲线(Cumulative Gain curve)

累积增益曲线计算如下:

G(ϕ)=(nt,1(ϕ)nt(ϕ)−nt,1(ϕ)nt(ϕ))(nt(ϕ)+nc(ϕ))(10)G(\phi) = \left( \frac{n_{t, 1}(\phi)}{n_t(\phi)} - \frac{n_{t, 1}(\phi)}{n_t(\phi)} \right) \left(n_t(\phi) + n_c(\phi) \right) \tag{10} G(ϕ)=(nt​(ϕ)nt,1​(ϕ)​−nt​(ϕ)nt,1​(ϕ)​)(nt​(ϕ)+nc​(ϕ))(10)

各符号含义与Qini系数符号含义相同。其中nt(ϕ)n_t(\phi)nt​(ϕ)表示在ϕ\phiϕ百分比下,实验组(treatment)的用户数量,nc(ϕ)n_c(\phi)nc​(ϕ)是在ϕ\phiϕ百分比下,对照组(control)的用户数量。与Qini系数相比,累积增益的分母是百分比ϕ\phiϕ下的实验组或对照组人数,并乘以nt(ϕ)+nc(ϕ)n_t(\phi) + n_c(\phi)nt​(ϕ)+nc​(ϕ)作为全局调整系数,避免实验组和对照组用户数量不平衡导致的指标失真问题。

可以将累积增益曲线与random line之间的面积作为评价模型表现的指标。

优惠券发放Demo

这里有一个优惠券发放的例子 。这是一次优惠券发放活动,对用户以短信方式发放5折优惠券,本次活动实验组(treatement,短信方式发送5折优惠券),对照组(不发券)37701名用户,注意到实验组和对照组不满足P(T)=P(C)=12P(T) = P(C) = \frac{1}{2}P(T)=P(C)=21​的条件。

这个例子还有一点特别,这其实是在一个预测模型上再做一次uplift modeling。本身实验组和对照组的数据是通过一个XGB模型预测出来的用户,该模型预测用户领取优惠券后是否会下单。根据模型预测结果,筛选一批高于某个阈值的用户,分成实验组和对照组。因此这次AB结果本身可以看出这个预测模型的uplift score。

这个预测模型的AB实验中,实验组转化率是2.69%,对照组转化率是2.28%,两组的转化率远高于以往运营随机筛选或根据条件筛选用户的转化率。但是,注意到这个预测模型的uplift score只有0.0041(2.69%-2.28%)。说明预测模型筛选出来的用户本身就有下单意愿,并不一定是因为发放优惠券而下单,所以实验组中的用户persuadable的比例应该不是很高。

在一个预测模型上再做uplift modeling相当于是在下单意愿高的用户中再筛选persuadable用户,其实实践上没有太大必要。但是作为一个例子,数据还是比较完美的,而且实验组和对照都通过同一个预测模型筛选而来,然后再随机分组,是满足uplift modeling条件的。

差分响应模型

实验组和对照组分别建模,使用lightGBM模型,分别取80%数据为训练集,20%数据为测试集。两个模型在测试集上的表现如下(未调参):

模型 类别 Precision Recall f1-score support
GTG_TGT​ 0 0.98 0.97 0.98 7785
GTG_TGT​ 1 0.16 0.20 0.18 215
GCG_CGC​ 0 0.98 0.99 0.98 8737
GCG_CGC​ 1 0.13 0.07 0.09 190

方便起见,将实验组和对照组20%的测试数据合并作为整个uplift model的测试集,流程如下。使用的数据集是经过了response model预测后的结果,相当于先筛选了一批下单概率高的用户,因为实验组和对照组用户都来自于同一个response model,可以认为两组用户特征分布式相同的。实际应用时,要注意实验组和对照组的用户特征分布是否一致。


对uplift分数τ^(X)\hat{\tau}(X)τ^(X)排序,得到uplift bar,如下图所示。横轴是测试集中每个用户uplift的十分位数(decile),共10个bin;纵轴是每个bin的uplift均值。由于uplift排序是从低到高,因此这个uplift bar看起来是反的(正常应该是从高到底排)。

Class Transformation Method

训练和测试过程如下图所示。从实验组和对照组筛选出Z=1Z=1Z=1的用户作为正样本,其余的作为负样本。同样使用lightGBM模型(未调参)。

传统响应模型

为了对比,这里生成了一份传统响应模型的结果。注意这个对比其实没有什么意义,因为这些数据本身就是一个响应模型预测的结果,再预测一次的意义不大。

响应模型使用LightGBM,正样本是下单用户,负样本是未下单用户,处理流程如下。将实验组(treatment group)切分为训练集和测试集,训练集用于训练预测模型,之后用该模型预测实验组的测试集作为PTP^TPT,预测整个对照组的数据作为PCP^CPC,然后计算uplift score。注意到这里实验组的测试集数量是远远少于对照组数量的,所以两边的数据量不均衡。这种方法计算出来的uplift score是模拟分数。

模型评估

Qini曲线图如下。

Adjusted Qini曲线如下。

Adjusted Qini是为了避免实验组和对照组数据不均衡而导致Qini系数失真而设计的。计算方式如下:

AQini=nt,1(ϕ)Nt−nc,1(ϕ)nt(ϕ)nc(ϕ)NtAQini = \frac{n_{t,1}(\phi)}{N_t} - \frac{n_{c,1}(\phi) n_t(\phi)}{n_c(\phi)N_t} AQini=Nt​nt,1​(ϕ)​−nc​(ϕ)Nt​nc,1​(ϕ)nt​(ϕ)​

累积增益曲线如下:

在Qini曲线下,差分响应模型的总体效果要好一些。而在累积增益曲线下,Class Transformation模型的总体效果要好一些。实验组和对照组数据不平衡的情况下,Qini系数可能有偏差,但本次对比的实验数据两组用户数量是接近的,这个问题还在研究中。

Python Uplift Modeling工具包:Pylift

Pylift是uplift建模的Python工具包。Pylift在sklearn的基础上针对uplift modeling对各模型做了一些优化,同时集成了一套uplift评价指标体系。所以Pylift内核还是sklearn,在sklearn外面封装了一套API,针对树模型做了uplift优化,可以通过Pylift实现直接的uplift modeling.

官网的示例代码如下。

from pylift import TransformedOutcome
up = TransformedOutcome(df1, col_treatment='Treatment', col_outcome='Converted')up.randomized_search() # 对所有参数grid search,十分耗时,使用时注意限制参数searching的数量
up.fit(**up.rand_search_.best_params_)up.plot(plot_type='aqini', show_theoretical_max=True) # 绘制aqini曲线
print(up.test_results_.Q_aqini)

所有模型的实现都通过类TransformedOutcome操作,通过传参来指定模型。默认的模型是XGBRegressor. 如果使用其他模型,通过参数sklearn_model指定,如下:

up = TransformedOutcome(df, col_treatment='Treatment', col_outcome='Converted', sklearn_model=RandomForestRegressor)

参数col_treatment是指数据集df中区分是否是treatment group的字段,通过0/1二值区分,col_treatment相当于label字段,如有转化是1,无转化是0.

Pylift另一个方便之处是提供了计算uplift评价指标的函数。如果是使用TransformedOutcome生成的结果,直接输入up.plot(plot_type='qini')即可绘制qini曲线。如果是自己的数据,可以通过下述方式来绘制曲线:

from pylift.eval import UpliftEval
upev = UpliftEval(treatment, outcome, predictions)
upev.plot(plot_type='aqini')

其中treatment标识是否treatment group,list格式;outcome相当于label,list格式;predictions是预测的uplift score分数,注意这是uplift score,如果不是uplift score需要自己先将uplift score计算好。上一小节模型评估中的图均是通过UpliftEval绘制的。

plot_type参数是绘制曲线的类型,可以绘制以下六种曲线:

  • qini:qini曲线
  • aqini:修正后的qini曲线,更适应treatment group和control group数据不均衡的数据
  • cuplift:累积uplift曲线
  • uplift:uplift曲线,不累积
  • cgains:累积gain曲线
  • balance:每个百分比下,实验组目标人数除以所有人数

通过以下方式计算曲线面积:

upev.Q_aqini # aqini曲线与random line之间的面积
upev.q1_qini # qini曲线与理想曲线之间的面积
upev.q2_cgains # cgains曲线与最佳实践曲线之间的面积

理想曲线与最佳实践曲线可以参考Pylift官网。

Pylift用于实验很方便,但因为还是基于sklearn,当达到千万量级的数据量时,还是需要考虑分布式。

总结

个人理解,增益模型实际上是一大类模型框架,本质上可以用传统响应模型或其他机器学习模型嵌入增益模型的框架,但是预测结果并不是一个概率,模型评价方式也有变化。

训练样本收集

增益模型建模强依赖于AB实验,数据要求很高。建模时要求实验组和对照组样本数量一样(实践中不一定有这个严格要求)。而且实验组和对照组的样本特征分布要一致,例如,训练数据不能是实验组预测后的结果、对照组随机选择的结果这样的组合,因为这样不满足干预策略与用户特征相互独立的假设(P(G∣X)=P(G)P(G | \boldsymbol{X}) = P(G)P(G∣X)=P(G))。故实验组中还需要预留一部分随机选择的用户,与对照组中的用户作为模型迭代的数据,或者实验组与对照组都先经过某个策略或模型的筛选。

多维度建模与个性化广告推送

上述所有模型都是针对G=TG=TG=T或者G=CG=CG=C,即干预策略只有一种,对于发券,相当于一个treatment只有一种折扣,对于广告push,一个treatment也只能有一种内容。而treatment可以用多种维度,如不同渠道发放不同折扣的优惠券,不同场景推送不同内容的push。传统的response model以转化为多分类问题解决,但uplift modeling难以简单转化为多分类问题。

此外,个性化广告推送也依赖长期和短期的用户行为特征构建。不同营销场景下的用户特征可以共用,可以构建统一的线上线下特征平台。

Reference

  • Causal Inference and Uplift Modeling: A review of the literature
  • Uplift modeling for clinical trial data
  • https://pylift.readthedocs.io/en/latest/introduction.html
  • Pylift: A Fast Python Package for Uplift Modeling
  • 阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践

智能营销增益模型(Uplift Modeling)的原理与实践相关推荐

  1. 智能营销增益(Uplift Modeling)模型——模型介绍(一)

    文章目录 1 Uplift Modeling与reponse model模型的差异 1.1 增益模型与响应模型的差异 1.2 增益模型与响应模型的混淆 1.3 业务疑问与需求 1.3.1 多维度建模 ...

  2. 美团智能搜索推荐模型预估框架的建设与实践

    在过去十年,机器学习在学术界取得了众多的突破,在工业界也有很多应用落地.美团很早就开始探索不同的机器学习模型在搜索场景下的应用,从最开始的线性模型.树模型,再到近两年的深度神经网络.BERT.DQN等 ...

  3. 【转】增益模型营销逻辑再理解

    如何用增益模型,探讨精准营销的底层逻辑?(营销逻辑)-正经科普 借助Canvas黑魔法,实现营销增益模型Uplift Model | 人人都是产品经理 随着移动互联网的普及以及人工智能技术的不断发展, ...

  4. auuc 评估指标_广告中增益模型理解

    由于工作的需要,广告增益越来越进入到我们的视野当中,收益永远是广告主评价广告投放的重要标准,但是这种收益也慢慢被认为有两种. 一种是广告投放所带来的直接收益,比如用户A广告投放后的cvr为3%,用户B ...

  5. “抢占心智”水土不服,智能营销3.0破局车市营销?

    文|曾响铃 来源|科技向令说(xiangling0815) 占领用户心智--定位大师特劳特推崇的营销理念,时至今日颇受市场的欢迎,以各电视台.分众传媒等为代表,广告公司.咨询公司.企业主纷纷参与实践, ...

  6. 入门学习因果推断在智能营销/权益应用的通用框架

    废话文学一下:入门学习因果推断三周,总算是入了个门- 就着智能权益方面的两个问题(给什么人发券?+ 发什么券?)简单总结一下两个问题的通用框架 (借一张哈罗顺风车的图,如上) 可以从很多已经落地工程化 ...

  7. 金融领域下的数据挖掘算法应用:智能推荐算法模型

    摩天,用友旗下社会化的企业数智化学习认证社区,提供数智营销.智慧医疗.数智金融.智能制造.项目管理等精品课程,数智化人才上摩天!https://mot.yonyou.com/ 你将会学到: 智能推荐系 ...

  8. 网络营销理论研究:网络营销信息传递原理及其实践价值

    网络营销信息传递原理"在<网络营销基础与实践>第2版中首次提出,旨在用信息论的基本原理解释网络营销信息传递中的一般规律,并将其应用于指导网络营销策略的制定和实施.本文简要介绍了在 ...

  9. 直播报名 | 零基础 零代码 AI智能营销应用现场教学

    如今,AI已经在各行各业落地应用.其中,CTR(广告点击率)预估.精准营销称得上是应用广泛.成熟度较高的场景.随着AI技术的普及和应用门槛的降低,现在,开发者和业务人员也可以简单快速地搭建效果出色的C ...

最新文章

  1. WPF and Silverlight 学习笔记(十八):WPF样式(Style)与模板(Template)
  2. 易捷win10系统电脑卡在“正在关机”界面怎么处理?
  3. docker pip 换源_Docker 部署 jupyterlab 3.0.3
  4. PCMCIA接口采集卡系列
  5. modbus4-232 485 单机 多机
  6. matlab运行就是编译么,matlab编译运行c文件
  7. 还不明白可空类型原理? 我可要挖到底了
  8. chrome vue插件_VS Code 前端常用插件推荐
  9. 重磅 | 数据库自治服务DAS论文入选全球顶会SIGMOD,领航“数据库自动驾驶”新时代
  10. 全新拟态个人主页/引导页源码
  11. Rootkit之ntrootkit的配置使用
  12. Python——python3的requests模块的导入
  13. 香港理工大学ASSIST2011会议(2011-09-30)
  14. python统计excel数据总行数_python 统计excel行数据库
  15. 基于SSM框架的网上购物商城及电商后台管理系统
  16. linux统计文件大小大于100k,Centos / Linux设置logrotate为所有日志的最大文件大小
  17. gitbub基本操作
  18. 404报错:The origin server did not find a current representation for the target resource解决的两种办法
  19. ios游戏比Android贵,为什么苹果商店充值比安卓的要贵?
  20. 爱马仕官方网站官方网站

热门文章

  1. Last_Errno: 1755 Last_Error: Cannot execute the current event group in the parallel mode错误解决
  2. 提交第一个spark作业到集群运行
  3. VC++ 鼠标添加到状态栏
  4. Java实验二 计算机 1501 王奕开 18
  5. HashMap Hashtable区别
  6. magic_quotes_gpc与magic_quotes_runtime区别
  7. Subversion服务器搭建 (安装步骤)
  8. nginx优化(经典)
  9. 基于OHCI的USB主机 —— UFI查询代码
  10. Java 14 新功能介绍!