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

2023-10-26

目录

1 安装教程及官方文档

1.1 pip安装

1.2 API文档

1.3 代码仓库

2 Uplift模型与主要方法介绍

2.1 发放代金券

2.2 多treatment

2.3 实验方法

3 causalml.inference.tree module

3.1 UpliftTreeClassifier

3.2 UpliftRandomForestClassifier

3.3 CausalRandomForestRegressor

4 待补充

5 问题


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

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

图8:多tretment

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

2.3 实验方法

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

图表 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、哪些需要随机数据才可建模,哪些观测数据也可以建模呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

因果推断4--Causal ML(个人笔记) 的相关文章

  • Python:urlretrieve PDF下载

    我在 Python 中使用 urllib 的 urlretrieve 函数来尝试从网站上获取一些 pdf 它 至少对我来说 已停止工作并正在下载损坏的数据 15 KB 而不是 164 KB 我已经用几个 pdf 对此进行了测试 但都没有成功
  • python中unicode字符串到ascii字符串的近似转换

    不知道这是否微不足道 但我需要将 unicode 字符串转换为 ascii 字符串 并且我不希望周围有所有这些转义字符 我的意思是 是否有可能 近似 转换为一些非常相似的 ascii 字符 例如 Gavin O Connor 转换为 Gav
  • Python Numpy TypeError:输入类型不支持 ufunc 'isfinite'

    这是我的代码 def topK dataMat sensitivity meanVals np mean dataMat axis 0 meanRemoved dataMat meanVals covMat np cov meanRemov
  • 在 Windows 上使用 Python 打开设备句柄

    我正在尝试使用 Giveio sys 驱动程序 该驱动程序需要先打开一个 文件 然后才能访问受保护的内存 我正在查看 WinAVR AVRdude 中的 C 示例 它使用以下语法 define DRIVERNAME giveio HANDL
  • 使用 Python 连接从 FTP 检索文件

    我构建了这个简单的工具来暴力破解并连接到 ftp 服务器 import socket import ftplib from ftplib import FTP port 21 ip 192 168 1 108 file1 passwords
  • 如何在Python中通过URL下载Azure Blob存储文件?

    我正在尝试从我的存储帐户下载 Azure Blob 存储文件 为此 我检查了 URL 是什么 并且正在执行以下操作 with urllib request urlopen
  • 为什么我在 Python 中收到“连接被拒绝”错误? (插座)

    我是套接字新手 请原谅我完全缺乏理解 我有一个服务器脚本 server py usr bin python import socket import the socket module s socket socket Create a so
  • 使用Python mysql.connector远程连接MySQL

    以下代码 在同一 LAN 内与 mysql 服务器不同的机器上运行 使用 Python3 和 mysql connector 本地连接到 MySQL 数据库 import mysql connector cnx mysql connecto
  • 如何在 PyCharm 中启用 flake8 的自动代码格式化

    我使用 Tox 运行单元测试 并使用 flake8 命令检查代码格式错误 每次我在 PyCharm 中编码时 我都会运行 tox 然后意识到我有一堆烦人的格式错误 我必须返回并手动修复 我希望 PyCharm 自动格式化代码 根据 flak
  • OpenCV 在使用 anaconda 的 Linux 上无法与 python 正常工作。收到 cv2.imshow() 未实现的错误

    这就是我得到的确切错误 我的操作系统是 Ubuntu 16 10 OpenCV 错误 未指定错误 该功能未实现 使用 Windows GTK 2 x 或 Carbon 支持重新构建库 如果您使用的是 Ubuntu 或 Debian 请安装
  • 有没有更快的方法将数字转换为名称?

    以下代码定义了映射到数字的名称序列 它的设计目的是获取一个号码并检索一个特定的名称 该类通过确保名称存在于其缓存中来进行操作 然后通过索引到其缓存中来返回名称 问题在这 如何在不存储缓存的情况下根据数字计算出名称 该名称可以被认为是一个以
  • Python - Map/Reduce - 如何在使用 DISCO 计数单词示例中读取 JSON 特定字段

    我正在按照 DISCO 示例来计算文件中的单词数 将单词数作为 Map Reduce 作业 http discoproject org doc disco start tutorial html 我对此工作没有任何问题 但是我想尝试从包含
  • Kivy:滚动缩放

    有没有办法在桌面 kivy 应用程序上放大图像 例如使用鼠标滚轮缩放 这里似乎讨论过 https github com kivy kivy issues 3563 https github com kivy kivy issues 3563
  • 查找一个列表在另一个列表中的值的索引

    我有两个 Python 整数列表 x and y 的所有元素x出现在某处y 而且只有一次 对于每个元素x 我想知道对应值的索引y 然后我想将这些索引设置为一个列表z 下面的代码按照我刚刚描述的方式工作 然而 对于一项任务来说 这似乎有点笨拙
  • 分别计算男女宿舍

    我想要的结果是这样的 males 1990 Q1 value Q2 value Q3 Value Q4 Value females Q1 value Q2 value Q3 Value Q4 value 如果任何值不存在则默认值 0 imp
  • 对二进制数的字符串表示进行按位运算 python 2.7

    我想对二进制数的两个字符串表示执行按位或 但我不知道如何将字符串转换为原始二进制 a 010110 b 100000 a b 应该产生 110110 然后我想计算 on 位的数量 这应该返回 4 您可以使用内置的将字符串转换为二进制int
  • Mac OS 上的 pybluez 安装错误

    我尝试安装pybluez使用以下命令 pip install pybluez sudo easy install pybluez 但对于这两个命令我最终都会出错 环境 Mac OSX 10 9 1 Python 2 7 点日志 cc fno
  • launchd执行python脚本,但导入失败

    我使用 appscript 编写了一个 python 脚本来跟踪我当前活动的窗口 我通过 launchd 运行它 但是当我这样做时 它无法导入 appscript 我已经在 launchd 的 plist 中设置了 PYTHONPATH 但
  • 保存 Jupyter Notebook,并显示 Plotly Express 小部件

    我有一个 Jupyter 笔记本 python 我使用plotlyexpress 在笔记本中绘图以进行分析 我想与非编码人员共享此笔记本 并让交互式视觉效果仍然可用 但它似乎不起作用 我尝试以下此处提出的建议 https community
  • 交响二阶颂歌

    我有一个简单的二阶 ODE 的齐次解 当我尝试使用 Sympy 求解初始值时 它返回相同的解 它应该替代 y 0 和 y 0 并产生一个没有常数的解 但事实并非如此 这是建立方程的代码 它是一个弹簧平衡方程 k 弹簧常数 m 质量 我在其他

随机推荐

  • 开源项目哪家强?Github年终各大排行榜超级盘点(内附开源项目学习资源)

    整理 Jane 出品 AI科技大本营 导语 提到开源项目 2018 年注定是不平凡的一年 据 Octoverse 报告数据 仅在 2018 年 Github 上的新用户就比过去六年的用户总数还要多 存储库数量近一亿 这些增长都要归功于开源社
  • Linux 系统中kill命令杀死进程常用技巧

    目录 前言 基础 进阶 1 查找进程号的方式进行改进 2 将常规的两步杀死进程合并为一步 3 强制踢掉登陆用户 kill的注意事项 前言 在Linux的系统中 kill是我们最常见的命令之一 kill 英语中为杀死的意思 顾名思义 就是用来
  • pytorch中使用detach()

    import torch nn as nn import torch class net nn Module def init self super init self conv nn Conv2d 3 6 3 stride 2 paddi
  • GOOGLE地图基站定位-Google Mobile Maps API

    如果你在你的手机装过Google Mobile Maps 你就可以发现只要你的手机能连接GPRS 即使没有GPS功能 也能定位到你手机所在的位置 只是精度不够准确 在探讨这个原理之前 我们需要了解一些移动知识 了解什么是MNC LAC Ce
  • Spark SQL 基本操作

    将下列JSON格式数据复制到Linux系统中 并保存命名为employee json id 1 name Ella age 36 id 2 name Bob age 29 id 3 name Jack age 29 id 4 name Ji
  • 【财富空间】一场史无前例的白领破产潮,正在来袭!

    来源 水木然 ID smr8700 最近 我们在上海做一个项目 准备招一个部门经理 于是发了招聘启示 应聘的人符合条件的很少 这不算什么 最令我吃惊的是 他们基本上个个都是要求年薪百万以上 放眼四望 诺大的上海 除去垄断国企 大牌的外企 再
  • xshell及xftp更新提示:Xshell出现要继续使用此程序必须应用到最新的更新或使用新版本

    一 前言 java开发者或者linux运维都肯定会用到xshell及xftp工具 说实话这两个工具真心是好用 但是有两个问题一直困扰这我 1 每次打开xshell或xftp总是会提示更新 2 今天打开xftp的时候 突然提示 要继续使用此程
  • Arduino基础 — Arduino 字符串

    Arduino 字符串 在Arduino编程中有两位字符串 1 字符数组 与C语言编程使用相同 2 Arduino 字符串 它允许我们在代码中使用字符对象 字符串数组 字符串是一个特殊的数组 在字符串的末尾有一个额外的元素 其值总是为0 零
  • 面试鹅厂,我三面被虐的体无完肤……

    戳蓝字 CSDN云计算 关注我们哦 作者 codegoose 来源 https segmentfault com a 1190000017864721 经过半年的沉淀 加上对MySQL redis和分布式这块的补齐 终于重拾面试信心 再次出
  • SOLO代码阅读解析

    SOLO是一种直接预测instance mask的范式 摒弃了之前top down和bottom up两种主流的实例分割方法 从而pipeline更加简洁直观 这篇文章以官方代码中的demo为例 简单梳理一下SOLO在inference时的
  • etcd编译与简单使用

    etcd是用go语言编写的 首先安装与配置go语言的环境 ubuntu1404安装go开发环境参考 http xhrwang me 2014 12 22 go dev env html http go ctolib com topics 3
  • 队列的C语言实现

    头文件 Queue h typedef int BTDataType typedef struct BindaryTreeNode BTDataType data struct BindaryTreeNode left struct Bin
  • Elasticsearch解决只能查询10000条数据方案

    es官方默认限制索引查询最多只能查询10000条数据 查询第10001条数据开始就会报错 Result window is too large from size must be less than or equal to 但是很多时候10
  • tan和atan--正切和反正切函数

    功能简介 求变量的正切和反正切 语法格式 1 Y tan X 求X中元素的正切值 元素可以为复数 tan函数是周期函数 以pi为一个周期 当元素值等于pi 2的奇数倍时 函数失去定义 在三角函数中 tan x sin x cos x 2 Y
  • P1025 数的划分(dfs/dp)

    题目 https www luogu com cn problem P1025 题目描述 将整数n分成k份 且每份不能为空 任意两个方案不相同 不考虑顺序 例如 n 7 k 3 下面三种分法被认为是相同的 1 1 5 1 5 1 5 1 1
  • 关于vscode头文件出现红色波浪曲线问题

    关于vscode头文件总显示红色波浪曲线解决 方法1 可以在设置中直接关掉 方法2 没有添加编译器的路径 我们可以找到gcc exe所在的路径 或者重新安装官网下载 解压到c盘非中文路径 复制路径 主要是看gcc g 所在的路径
  • 环信iOS使用步骤及使用总结

    环信iOS使用步骤及使用总结 第一步 集成 请参照环信官方文档http docs easemob com im 300iosclientintegration 20iossdkimport 集成 iOSSDK 在您阅读此文档时 我们假定您已
  • OpenAI最新官方ChatGPT聊天插件接口《插件部署上生产》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)

    Plugins in production 插件部署上生产 前言 Rate limits 速率限制 Updating your plugin 更新您的插件 Plugin terms Domain verification and secur
  • TCP与UDP的区别

    一 前言 TCP IP 中有两个具有代表性的传输层协议 分别是 TCP 和 UDP 二 TCP IP网络模型 计算机与网络设备要相互通信 双方就必须基于相同的方法 比如 如何探测到通信目标 由哪一边先发起通信 使用哪种语言进行通信 怎样结束
  • 因果推断4--Causal ML(个人笔记)

    目录 1 安装教程及官方文档 1 1 pip安装 1 2 API文档 1 3 代码仓库 2 Uplift模型与主要方法介绍 2 1 发放代金券 2 2 多treatment 2 3 实验方法 3 causalml inference tre