智能营销模型-Uplift Model详解及Python使用

智能营销模型-Uplift Model详解及Python使用1 背景概览在营销场景中 通过给用户营销动作 从而带来用户动支率的提升 如在给用户发送广告邮件或优惠券等 但营销客户可分为 4 类 分别为 surething 自然转化 persuadables 营销敏感 lostcauses 无动于衷和 sleepingdogs 营销反作用 如下图所示 参考链接 而除营销敏感以外人群进行营销都会增加运营成本 因此挖掘出对营销敏感的人群是非常有必要的 2 方法介绍 2 1T Learner 论文地址 lt gt T Learner TwoModel 是将对照

1. 背景概览

  在营销场景中,需要给不同的用户给出不同的营销动作,从而提升收益,如触达方式、广告投放或发放优惠券等。但往往我们无法同一时间观察实施不同动作下能带来的收益。Uplift Model是因果推断(Causal Inference)的一种应用,是根据A/B实验,对相似用户在不同营销动作下的增益,作为用户在不同营销动作下的增益,就如在不同的平行世界观察观察对不同营销动作的反应。

2. 方法介绍

2.1 T-Learner

论文地址:https://arxiv.org/pdf/1706.03461.pdf
  T-Learner (Two Model)是将对照组和实验组分开建模,然后实验组模型与对照组模型响应概率的差即为提升值。以下是单Treatment场景的具体流程:

  步骤1: 使用对照组数据X和对应标签Y,训练模型
μ 0 ( x ) = E [ Y ( 0 ) ∣ X = x ] \mu _{0}(x)=\mathbb{E} [Y(0)|X=x] μ0(x)=E[Y(0)X=x]
  步骤2: 使用实验组数据X和对应标签Y,训练模型
μ 1 ( x ) = E [ Y ( 1 ) ∣ X = x ] \mu _{1}(x)=\mathbb{E} [Y(1)|X=x] μ1(x)=E[Y(1)X=x]
  步骤3: 计算样本x的动作带来的Uplift Score
τ ^ T = μ ^ 1 ( x ) − μ ^ 0 ( x ) \hat{\tau}_{T}=\hat{\mu}_{1}(x)-\hat{\mu}_{0}(x) τ^T=μ^1(x)μ^0(x)










T-Learner Python使用

from xgboost.sklearn import XGBClassifier from causalml.inference.meta import BaseTClassifier from causalml.dataset import make_uplift_classification from sklearn.model_selection import train_test_split df, x_names = make_uplift_classification(treatment_name=['control', 'treatment']) df_train, df_test = train_test_split(df, test_size=0.2, random_state=111) base_model = XGBClassifier() clf = BaseTClassifier(learner=base_model,control_name='control') clf.fit(df_train[x_names].values, treatment=df_train['treatment_group_key'].values, y=df_train['conversion'].values) y_pred = clf.predict(df_test[x_names].values) 

2.2 S-Learner

论文地址:https://arxiv.org/pdf/1706.03461.pdf
  S-Learner是指单一模型,把对照组和实验组放在一起建模,把营销动作作为一个特征(如将对照组),特征加入训练特征,如下图所示。在预测时,改变不同的W值计算相应率,从而与对照组相减得到uplift score。
在这里插入图片描述




  S-Learner方法简单,且也可以使用常见模型作为基模型如XGBoost、LightBGM和NN等,但其本身仍然是响应模型,模型的效果取决于特征W的贡献度,若W的贡献度较低,则有可能会被模型过滤,导致Uplift Score为0。

S-Learner Python使用

from xgboost.sklearn import XGBClassifier from causalml.inference.meta import BaseSClassifier from causalml.dataset import make_uplift_classification from sklearn.model_selection import train_test_split df, x_names = make_uplift_classification(treatment_name=['control', 'treatment']) df_train, df_test = train_test_split(df, test_size=0.2, random_state=111) base_model = XGBClassifier() clf = BaseSClassifier(learner=base_model,control_name='control') clf.fit(df_train[x_names].values, treatment=df_train['treatment_group_key'].values, y=df_train['conversion'].values) y_pred = clf.predict(df_test[x_names].values) 

2.3 X-Learner

论文地址:https://arxiv.org/pdf/1706.03461.pdf
  X-Learner是在T-Learner的基础上优化的一种方法,利用了全量的数据进行预测,且对于Treatment和Control样本不平衡时,也有较好的效果。模型步骤如下:
  步骤1: 使用实验组和对照组数据分别训练模型(此处与T-learner一样):
μ 0 ( x ) = E [ Y ( 0 ) ∣ X = x ] μ 1 ( x ) = E [ Y ( 1 ) ∣ X = x ] \mu _{0}(x)=\mathbb{E} [Y(0)|X=x]\\ \mu _{1}(x)=\mathbb{E} [Y(1)|X=x] μ0(x)=E[Y(0)X=x]μ1(x)=E[Y(1)X=x]
  步骤2: 分别将实验组模型在对照组上的uplift和对照组模型在实验组上的uplift :
D ~ i 1 : = Y i 1 − μ ^ 0 ( X i 1 ) D ~ i 0 : = Y i 0 − μ ^ 1 ( X i 0 ) \tilde{D}_{i}^{1} :=Y_{i}^{1} – \hat{\mu}_{0}(X_{i}^{1}) \\ \tilde{D}_{i}^{0} :=Y_{i}^{0} – \hat{\mu}_{1}(X_{i}^{0}) D~i1:=Yi1μ^0(Xi1)D~i0:=Yi0μ^1(Xi0)
  步骤3: 根据步骤2中得到uplift score,使用回归算法拟合:
τ ^ 0 ( x ) = E [ D ~ 0 ∣ X = x ] τ ^ 1 ( x ) = E [ D ~ 1 ∣ X = x ] \hat{\tau}_{0}(x)=\mathbb{E}[\tilde{D}^{0}|X=x]\\ \hat{\tau}_{1}(x)=\mathbb{E}[\tilde{D}^{1}|X=x] τ^0(x)=E[D~0X=x]τ^1(x)=E[D~1X=x]
  步骤4: 加权计算CATE估计量:
τ ^ X ( x ) = g ( x ) τ ^ 0 ( x ) + ( 1 − g ( x ) ) τ ^ 1 ( x ) \hat{\tau}_{X}(x)= g(x)\hat{\tau}_{0}(x)+(1-g(x))\hat{\tau}_{1} (x) τ^X(x)=g(x)τ^0(x)+(1g(x))τ^1(x)
  其中,g取值在[0,1]之间




















X-Learner Python使用

from xgboost.sklearn import XGBClassifier,XGBRegressor from causalml.inference.meta import BaseXClassifier from causalml.dataset import make_uplift_classification from sklearn.model_selection import train_test_split df, x_names = make_uplift_classification(treatment_name=['control', 'treatment']) df_train, df_test = train_test_split(df, test_size=0.2, random_state=111) clf = BaseXClassifier(outcome_learner=XGBClassifier(),effect_learner=XGBRegressor(),control_name='control') clf.fit(df_train[x_names].values, treatment=df_train['treatment_group_key'].values, y=df_train['conversion'].values) y_pred = clf.predict(df_test[x_names].values) 

2.4 Causal Tree

论文地址:https://link.springer.com/content/pdf/10.1007%2Fs10115-011-0434-0.pdf
  推理树是一种直接优化uplift的方法,算法是在决策树的基础上,改变叶节点的分裂方法,从而得到Uplift Tree。在预测环节,计算样本所在叶节点的实验组与对照组的差作为uplift score,公式如下所示(单Treatment):
τ ^ ( x ) = ∑ i : T i = 1 , X i ∈ l Y i ∣ i : T i = 1 , X i ∈ l ∣ − ∑ i : T i = 0 , X i ∈ l Y i ∣ i : T i = 0 , X i ∈ l ∣ \hat{\tau}(x)=\frac{\sum_{
{i:T_{i}=1,X_{i}\in l}}Y_{i} }{|i:T_{i}=1,X_{i}\in l|}-\frac{\sum_{
{i:T_{i}=0,X_{i}\in l}}Y_{i} }{|i:T_{i}=0,X_{i}\in l|}
τ^(x)=i:Ti=1,Xili:Ti=1,XilYii:Ti=0,Xili:Ti=0,XilYi

  其中,T=0为对照组,T=1为实验组, X i ∈ l X_{i}\in l Xil为落在叶节点l上的样本
  叶节点的分裂标准有多种,本文主要介绍Rzepakowski 和Jaroszewicz提出的基于信息论的分裂方法,公式如下。
D g a i n ( A ) = D ( P T ( Y ) : P C ( Y ) ∣ A ) − D ( P T ( Y ) : P C ( Y ) ) D_{gain}(A)=D(P^{T}(Y):P^{C}(Y)|A)-D(P^{T}(Y):P^{C}(Y)) Dgain(A)=D(PT(Y):PC(Y)A)D(PT(Y):PC(Y))
  其中,Pt和Pc是实验组和对照组的概率分布,函数D()评估实验组和对照组样本的差异,从而计算出分裂前后的发散增益程度。目前,评估叶节点的差异评估方法有相对殇(Kullback)、欧式距离(Euclidean)、卡方检验(Chi-Squared)和CTS,公式如下:
K L ( P : Q ) = ∑ i = l e f t , r i g h t p i l o g p i q i E ( P : Q ) = ∑ i = l e f t , r i g h t ( p i − q i ) 2 χ 2 ( P : Q ) = ∑ i = l e f t , r i g h t ( p i − q i ) 2 q i KL(P:Q)=\sum_{i=left,right}p_{i} log\frac{p_{i}}{q_{i}} \\ E(P:Q)=\sum_{i=left,right}(p_{i}-q_{i})^{2} \\ \chi^{2}(P:Q) =\sum_{i=left,right}\frac{(p_{i}-q_{i})^{2}}{q_{i}} KL(P:Q)=i=left,rightpilogqipiE(P:Q)=i=left,right(piqi)2χ2(P:Q)=i=left,rightqi(piqi)2
Causal Tree Python使用
















from causalml.inference.tree import UpliftTreeClassifier from causalml.dataset import make_uplift_classification from sklearn.model_selection import train_test_split df, x_names = make_uplift_classification(treatment_name=['control', 'treatment']) df_train, df_test = train_test_split(df, test_size=0.2, random_state=111) clf = BaseXClassifier(outcome_learner=XGBClassifier(),effect_learner=XGBRegressor(),control_name='control') clf.fit(df_train[x_names].values, treatment=df_train['treatment_group_key'].values, y=df_train['conversion'].values) y_pred = clf.predict(df_test[x_names].values) 

参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230114.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:05
下一篇 2026年3月16日 下午3:06


相关推荐

  • Coze工作流实战:快速搭建网站的智能客服助手

    Coze工作流实战:快速搭建网站的智能客服助手

    2026年3月12日
    2
  • windows下如何安装git及配置环境_git安装失败

    windows下如何安装git及配置环境_git安装失败下载安装1.从git官网下载一个git安装包,官网下载地址http://www.git-scm.com/download/2.双击安装程序(如果没有SecurityWarning请跳过此步骤),请点击【Run>】3.阅读协议,点击【Next>】4.选择安装位置,点击【Next>】5.选择安装组件:这里可以使用默认选项,点击【Next…

    2025年10月2日
    7
  • 构建基于Javascript的移动web CMS——加入jQuery插件

    构建基于Javascript的移动web CMS——加入jQuery插件

    2022年2月1日
    69
  • STM32看门狗详解[通俗易懂]

    STM32看门狗详解[通俗易懂]看门狗的作用:防止单片机因未知原因死机或比我们预期的时间过长长时间不能响应,如果出现这种问题,看门狗就会把单片机复位独立看门狗(IWDG):时钟来源:内部低速时钟(LSI),所以用看门狗时不需要配置时钟一般配置过程:寄存器:IWDG_KR:32位寄存器,低16位有效,只写写入0xAAAA,喂狗0x5555,取消IWDG_PR、IWDG_RLR的写保护0xCCCC,启动看门狗IWDG_PR:32位寄存器,低3位有效配置分频系数,4*2^prer.

    2022年4月30日
    75
  • jquery与vue区别_学jquery还是vue

    jquery与vue区别_学jquery还是vue仅仅从自己使用经验来说下感受。1,vue是一个前端框架,jquery是javacript库,封装了一些js常用的方法,仅此而已。vue有成熟的生态链,mvvm模式,是一个真正的web框架。表现在:1:vue有固定的写法和规定,必须要有一个div来作为容器,绑定事件方法,数据都有固定的地方,数据要写在data里面,方法要写在methods里面。而且绑定事件在dom元素标签上绑定,防止时间太…

    2022年10月9日
    5
  • linux menuconfig搜索,linux–menuconfig

    linux menuconfig搜索,linux–menuconfig|–linux内核中Makefile,Kconfig,.config的关系(1)三者的作用简单来说就是去饭店点菜:Kconfig是菜单,Makefile是做法,.config就是你点的菜Makefile:一个文本形式的文件,编译源文件的方法。Kconfig:一个文本形式的文件,内核的配置菜单。.config:编译所依据的配置。(2)三者的语法|–Makefile目标定义:目标定义就是用来定义哪…

    2022年6月1日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号