因果推断4–Causal ML(个人笔记)

目录


1 安装教程及官方文档

1.1 pip安装

pip install causalml

1.2 API文档

https://causalml.readthedocs.io/en/latest/causalml.html

1.3 代码仓库


github: https://github.com/uber/causalml/

CausalML简介

CausalML是一个基于Python的因果学习开源项目。最早为Uber项目定制、内部开源,而后正式成为开源项目。其提供了丰富的模型选择,例如常用的Meta-Learner和因果树模型,方便在实践中作对比和选择。同时还提供例如模拟数据生成、模型可视化、模型评估等一系列配套工具。其目标是用于解决业务实践问题,尤其是在计算速度和数据规模方面能够达到业界标准并持续优化。

赵振宇,腾讯数据科学总监。先后在Yahoo,Uber,腾讯任职。负责实验、因果推断、机器学习、产品分析、平台建设、开源软件、应用研究方面的工作。CausalML发起者之一,《关键迭代可信赖的线上对照实验》译者之一。

图表 1:CausalML图示

图表 2:CausalML模块概览 

2 Uplift模型与主要方法介绍

2.1 发放代金券

在互联网平台中,如果出现了成规模的用户流失,市场营销部门常常采用发放代金券的方式来召回流失用户。那么向哪些用户投放代金券效果最好呢?在数据科学时代,一个很常见的思路是采用机器学习方法来对用户建模,预测哪些用户最有可能回流,然后进行定向投放。但有时候实际结果表明,这种基于模型的投放组效果会不如随机投放组。

投放是有效果的,预测也是准确的,那么为什么基于模型的投放组效果反而不如随机投放呢?原因其实很简单,自然回流概率高的用户,不管是否有代金券,都会回来。将代金券发给必定会回来的用户,并不能产生增益。为了解决这一问题,我们需要将现有的机器学习算法与因果推断相结合。

介绍具体主要模块之前,我们先来介绍一下相关背景。和前面代金券的例子类似,在广告营销中,我们可以根据有无投递广告和是否购买产品来将用户划分成四类(见图四):总是购买、劝退用户、策略提升用户和总

图表 3:广告营销影响的四类用户

        如果我们将没被投放广告的用户设为对照组,将被投放广告的用户设为实验组。从整体上来评估,广告对购买率的提升效果 = 实验组购买率 – 对照组购买率,这实际上是因果推断中的ATE (Average Treatment Effect)。通过代金券发放的例子,我们知道这种评估方式是有误差的。作为改进,我们需要从个体角度来评估效果,为此就引入了HTE(Heterogeneous Treatment Effect) 的概念。简单来说,相比于ATE,HTE是一个更专注于个体差异化效果的指标。具体定义见下图:

图表 4:HTE

因为ITE是不能够通过观测得到的,所以我们采用CATE (Conditional ATE) 作为实际的指标:广告对用户i的效果 = E[Y|Treatment, Xi] – E[Y|Control, Xi]。Xi表示用户i所具有的相关特征。这就是Uplift模型的核心思想。有了CATE的概念,接下来要做的就是该如何估计CATE。常见的方法有Meta-learners和Uplift树模型两种。

Meta-learners的基本想法是组合既有的传统机器学习模型。首先定义一个base learner,一般就是一个传统的机器学习模型,任何一个给定X可以预测Y的模型都可以。然后采用不同的混合方式,比如S Learner,T Learner,X Learner,R learner。见下图:

图表 5:Meta-learners

        Uplift树模型的基本想法是通过改变树模型的损失函数来估计CATE(见图6)。与传统分类树的区别如下:

图表 6:Uplift图示参考

使用Uplift模型定位“策略提升用户”可以分成三个步骤:

1. 数据收集实验:目标是为Uplift模型收集训练数据。给对照组所有用户不发促销,给实验组所有用户发促销。

2. 训练Uplift模型:收集实验数据和用户特征,训练Uplift模型。训练完成的Uplift模型可以根据用户特征X,估计实验效果CATE。

3. 验证模型效果实验:设置对照组为无促销,设置两个实验组,实验组1为随机选取10%用户发促销,实验组2位根据Uplift模型预测,选取预估实验效果在top10%的用户发促销

根据以上步骤,在广告营销的场景中,最优策略是使用Uplift模型定位策略提升用户群(投放效果为正向),并针对这部分用户进行投放。这一策略和直接使用机器学习模型的不同见下图:

图7:Uplift模型 vs 机器学习模型

2.2 多treatment

有些场景下,存在多个实验组,且不同的实验组成本不相同。例如:

因果推断4--Causal ML(个人笔记)

图8:多tretment

们会希望在优化转化率的同时,也考虑成本:将9折优惠券发给对于9折实验效果敏感的用户,将8折优惠券发给只对8折实验效果敏感的用户。对于这种场景,CausalML也提供了对应的价值优化方法。方法的想法是考虑成本,将成本计入CATE中,用基于X Learner的方法,在多个实验组并存的情况下尝试将最优的实验组挑出来。

2.3 实验方法

业界常用的实验方法可以总结成以下几种:A/B测试基本覆盖了大多数实验场景;网络效应实验适用于分流时用户之间存在干扰的情况,也即因果推断中的interference问题;Uplift模型适用于对HTE的估计;灰度放量试验适用于全量上线有风险,需要实时监控修正再逐步放开的情况;MAB即多臂老虎机,适用于在多实验组中进行价值优化;Interleaving基于同一个用户对于排序方法A和B的偏好,适用于评估排序算法对长尾查询的效果。

因果推断4--Causal ML(个人笔记)

图表 9:业界实验领域概览图表

参考:

  1. causalml package — causalml documentation
  2. CausalML: 基于Python的因果学习开源项目_模型_用户_效果
  3. Zhao, Zhenyu, and Totte Harinen. “Uplift modeling for multiple treatments with cost optimization.” In 2019 IEEE International Conference on Data Science and Advanced Analytics (DSAA), pp. 422-431. IEEE, 2019.

  4. 因果推断笔记——python 倾向性匹配PSM实现示例(三)_悟乙己的博客-CSDN博客_python 因果推断

  5. PSM倾向得分匹配法【python实操篇】_水满船头滑的博客-CSDN博客_python psm

  6. 因果推断学习笔记三——Uplift模型_米法·的博客-CSDN博客_uplift模型

  7. CausalML创始人赵振宇:基于Python的开源框架玩转因果学习|周日直播·因果科学读书会_腾讯新闻

  8. 因果推断与反事实预测——利用DML进行价格弹性计算(二十四)_悟乙己的博客-CSDN博客_dml算法

  9. 因果推断杂记——因果推断与线性回归、SHAP值理论的关系(十九)_悟乙己的博客-CSDN博客_shap 回归

3 causalml.inference.tree module

3.1 UpliftTreeClassifier

from causalml.inference.tree import UpliftTreeClassifier

Uplift Tree Classifier for Classification Task.

A uplift tree classifier estimates the individual treatment effect by modifying the loss function in the classification trees.

The uplift tree classifier is used in uplift random forest to construct the trees in the forest.

import numpy as np
import pandas as pd

from causalml.dataset import make_uplift_classification
from causalml.inference.tree import UpliftRandomForestClassifier
from causalml.metrics import plot_gain

from sklearn.model_selection import train_test_split
import causalml
causalml.__version__
df, x_names = make_uplift_classification()

 Look at the conversion rate and sample size in each group
df.pivot_table(values='conversion',
               index='treatment_group_key',
               aggfunc=[np.mean, np.size],
               margins=True)

clf = UpliftTreeClassifier(control_name='control')
clf.fit(df_train[x_names].values,
         treatment=df_train['treatment_group_key'].values,
         y=df_train['conversion'].values)
p = clf.predict(df_test[x_names].values)
df_res = pd.DataFrame(p, columns=clf.classes_)
df_res.head()

 

uplift_model = UpliftRandomForestClassifier(control_name='control')
df_res = uplift_model.predict(df_test[x_names].values, full_output=True)
print(df_res.shape)
df_res.head()

 

3.2 UpliftRandomForestClassifier

from causalml.inference.tree import UpliftRandomForestClassifier
 

from causalml.inference.tree import CausalRandomForestRegressor, CausalTreeRegressor

3.3 CausalRandomForestRegressor

UpliftRandomForestClassifier和CausalRandomForestRegressor的区别?????

4 待补充

1、特征选取方式

2、CausalRandomForestRegressor学习

3、因果推断与线性回归:DML

4、多treatment、多treatment多label

5 问题

1、auuc评估有什么弊端?

答:样本不随机,分桶后偏差。可以使用偏向性匹配拉齐在评估。

2、多treatment的auuc评估评估,样本间分布不均匀怎么做拉齐?

答:评估时候考虑各样本的占比。

3、DML可以解决离散tretamnet,和vcnet、DRNtet差异?

4、DML在工业好像使用的较多,结合ps?

5、哪些需要随机数据才可建模,哪些观测数据也可以建模呢?

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年8月17日
下一篇 2023年8月17日

相关推荐