史上最全因果推断知识合集-4(快手因果推断与实验设计)

article/2025/5/10 21:15:51

导读:理解和识别用户行为指标的相互关系是实验分析的目标。在社区氛围下,影响用户行为的因素更为复杂,关系识别更为困难,如何使用各种学科的方法,对社区进行宏观或微观的建模分析,系统性的评估各种策略的长期生态影响,是所要解决的重要问题。

本文金雅然博士将以快手直播的现实任务为例进行展开,介绍快手因果推断与实验设计的相关工作,主要内容包括:① 快手直播场景中遇到的因果推断问题及技术框架;② 基于观测数据或实验数据的因果推断技术案例;③ 涉及到网络效应的复杂实验设计。

01快手直播场景中遇到的因果推断问题及技术框架

在快手我们主要会遇到这四类问题:用户激励设计、推荐策略评估、产品功能迭代以及预估产品和方向的长期价值。

遇到这些问题我们通常有几种方式来解决:

  • 基于观测数据的因果推断,即从已有实验和非实验数据中提炼因果关系;
  • 在产品设计上构建正确的AB实验,合理计算指标,度量产品功能和迭代的影响;
  • 通过经济模型、机器学习算法和数据、实验的结合构造反事实推理来回答长期效应问题。

编辑

因果推断的核心是在数据中存在关联关系的前提下,考虑数据之间的因果关系。任务是在给定的假设中,选择模型框架,将因果关系从关联中分割,对因果分析的大小作出正确的估计,并且通过统计推断的方法,验证推断的正确度,并回答推断结果存在多大波动。

在因果推断中,我们通常应用以下两种框架:

Rubin虚拟事实模型(Potential Outcome)的核心是寻找合适的对照组。通常情况下,我们想要度量用户是否被实验影响到的两者差异是多少,而对于同一个用户,我们只能观测到被影响/不被影响一个状态,因此需要寻找合适的对照组,估计无法被观测到的影响。我们通常会构造一些识别实验,比如,经济学上通过RCT实验,互联网常使用AB实验,或者根据观测数据使用恰当的方法来寻找对照组。

Pearl因果图模型(Causal Graph Model)使用有向图描述变量之间的因果关系。通过计算因果图中的条件分布,获得变量之间的因果关系。有向图指导我们使用这些条件分布来消除估计偏差,其核心也是估计检验分布、消除其他变量带来的偏差。

Pearl框架和Rubin框架有一些关联,简单图中,Potential Outcome模型中通过工具变量和匹配法消除估计偏差和Pearl的框架思想是一致的。

但是Pearl的框架可以处理多个变量之间相互作用的复杂关系。

总结来说,Potential Outcome和Causal Graph是两种互补的推测虚拟事实的方法,目的都是为了计算存在混淆变量时,干预变量时对结果的影响,都需要对因果关系作假设,以及控制带来偏差的变量;不同点在于Rubin框架估计的因果效应主要是干预前后的期望差值,而Pearl框架下,我们估计的是干预前后的分布差异,Rubin框架解决的问题是因果效应的估计和统计推断,Pearl框架更偏向于因果关系的识别。

从这两种框架延伸,在不同情景下,快手会使用不同工具解决实际问题,AB实验帮助我们观测策略或产品变动影响,在一些不能做实验或者多个实验相结合的场景下,会有一些其他的方法,下面会对具体方法展开介绍。

02基于观测数据或实验数据的因果推断技术案例

1. 产品功能的评估:DID及其拓展案例

双重差分适用于存在不可观测的个体固定效应场景,通过差分消除固定效应,其关键假设是,政策干扰前存在平行趋势,且实验干扰效应不随时间变化。双重差分可以用来消除那些对后期可能存在干扰因素,得到实验效果估计。

 双重差分假设用户开始受影响的时间是一样的,实验处理效应对用户的影响是一样的,而这些假设难以满足。比如穿云箭红包,当实验效果上线后,用户的行为会发生变化,且不同用户的行为是不一致的,当不同表现用户都在实验组,传统的DID模型估计实验效应会产生偏差。因此我们在DID方法上进行修正,按照用户的状态是否更改分为不同类型,对不同类型用户分别做DID估计,再进行加权平均,得到修正后DID实验效果值。

当treatment施加到一个群体或者地区上时,很难找到单一的对照组,这种时候采用合成控制方法构造虚拟对照组进行比较,原理是构造一个虚拟的对照组,通过treatment前的数据上学习的权重,拟合实验组在实验开始前的数据,模拟实验组用户在没有接受实验情况下的结果,构造合成控制组,实验开始后,评估实验组和合成控制组之间的差异。

2. 推荐策略的评估:因果推断与机器学习

因果分析与机器学习存在一些差异点。因果分析的语言,核心在于因果关系的识别,即合理的估计处理前和处理后现有条件期望的差异,也可以是一种处理缺失数据的问题,在因果推断上我们非常关心的是如何准确的估计结果以及结果的方差。而在机器学习中,我们使用准确度来衡量机器学习模型的好坏,其目标是在训练集上估计一个条件期望,使得测试集上MSE最小。机器学习可以通过cross-validation(模型参数)的方法去数据驱动的选择一个最佳模型形式,与传统计量经济学方法相比不需要复杂的假设,例如function form的假设,从这种意义上机器学习能够更准确的预测。

但是在因果推断问题上,机器学习的局限性在于,无论用什么机器学习方法,因果识别的条件都不能被放松;同时在机器学习模型通常使用的正则化和过拟合处理,会带来有偏估计,因此我们需要消除这种估计的偏差;在统计推断上,机器学习的局限性在于,有些模型不能直接计算方差,并且有时即使可以计算,方差的收敛速度也未必能够达到预期,所以针对这些问题,下面介绍了几种方法。

① 双重机器学习模型

很多时候因果推断会遇到混淆变量的问题,比如想要去分析直播推荐多样性对用户活跃度的影响,但是这些都和用户历史相关。传统计量经济学方法可以解决这个问题,但是依赖很多强假设,强假设下,得到的估计不一定合理,双重机器学习为这个问题提供了解决的思路。

双重机器学习假设所有混淆变量都可以被观测,其正则化过程能够达到高维变量选择的目的,与Frisch-Waugh-Lovell定理相似,模型通过正交化解决正则化带来的偏差。

除了上面所描述的,还有一些问题待解决,比如在ML模型下存在偏差和估计有效性的问题,这个时候可以通过Sample Splitting 和 Cross Fitting的方式来解决,具体做法是我们把数据分成一个训练集和估计集,在训练集上我们分别使用机器学习来拟合影响,在估计集上我们根据拟合得到的函数来做残差的估计,通过这种方法,可以对偏差进行修正。在偏差修正的基础上,我们可以对整个估计方法去构造一个moment condition,得到置信区间的推断,从而得到一个有良好统计的估计。

② 因果随机森林模型

我们通常探究策略对于不同用户异质性的影响,即哪些用户更容易被影响以及影响有多大,传统做法是多维分析,但是效率低,容易犯错。这时可以结合机器学习的方法,这里选择了决策树方法,因为决策树的分桶特性能够帮助解决异质性问题,相对于传统方法因果树做了两点改动:

  • 把数据分成训练集和估计集,一部分训练集去构造树,另一部分估计集去估计因果效应和方差;
  • 在树的分区方式上,使用各个节点的方差对目标函数加以修正。

通常情况下,我们结合实验来做分析。比如在实验中,通过因果树得到因果效应的分布,然后挑选出来那些实验效果显著的用户,去分析他们的特征,以及找到敏感用户,帮助我们了解策略的影响,作出下一步迭代。

③ Meta-Learner for Uplift Modeling

Uplift-modeling是另一种定位敏感人群的方法,和因果树的步骤有差别。核心是利用实验数据对实验结果变量建模,利用得到的模型估计条件平均处理效果。Uplift-modeling具有不同的学习方式,主要有S-Learner 、T-Learner和X-learner。和因果树相比,Meta-Learner是一种间接建模方式,实现快但一些场景下误差较大。

3. 用户行为链路的研究:因果图

我们通常通过因果图来进行用户行为链路的研究。Rubin流派常用来估计变量之间的一度关系,但当我们面对一些未知问题时,我们想了解的是有哪些变量真正影响我们关心的结果变量,以及变量之间的相互影响和用户行为链路是什么,有效过程指标是什么,这些时候我们用到因果图的方法。

在生成因果图中,常遇到的限制是算法层面的,比如我们在优化目标函数的时候,需要遍历所有的因果图,是一个NP-hard问题,我们需要有效的算法得到想要的估计,市面上的算法大概分为两类:

  • Constraint-based Algorithms
  • Score-based Algorithms

03复杂实验设计

在实验设计上我们通常遇到的难点是网络效应的检测和应对,在直播下,网络效应有好多种表现方式,在这种网络效应存在的情况下尝试了一些方式,比如说:双边实验、时间片轮转实验、合成控制方法。

1. 双边实验设计

 在双边实验中,同时进行了主播侧和观众侧的分流,主播侧一部分是上了挂件,观众侧一部分能看到一部分看不到,双边实验的优点是可以同时检测两端的效果,同时可以帮助检测到组间的转移和溢出。在了解到组间溢出和干扰下,通过双边实验我们可以更加准确的测算处理效应,在挂件场景下,我们认为N3是代表完全没有处理过的效果,Y代表处理后的结果,N3和Y进行差分,计算产品功能推全后的影响,而且,双边实验能够更好的帮助我们归因。

然而双边实验只能描述简单的组间溢出,在个体和个体之间存在干扰的复杂情况下,双边实验是无法帮助我们判断实验效果,例如直播PK暴击时刻这种情况下,我们通过时间片轮转实验解决,即在一定实验对象上进行实验组策略和对照组策略的反复切换。

2. 时间片轮转实验

时间片轮转的核心在于:

  • 时间片的选择
  • 实验总周期选择
  • 随机切换时间点是什么样子的

当时间粒度约粗糙,时间上的干扰造成的偏差会越小,但是方差会越大,影响实验的检验效果,针对这个问题,采取的方案是最优设计。

最优设计的核心假设是:

  • Outcome有一个绝对上界
  • 用户无法知晓下一个时间是否是实验组
  • 如果时间片之间存在干扰,干扰的影响是固定且有限的

当我们不知道一个时间片实验时间节点如何设计时,通常采取的步骤是,预估一个时间,通过实验确定carry over的阶数下限是多少,根据阶数下限,找到最优切换时间点,再进行一次实验,通过实验组和对照组的选择来进行因果效应的估计。其缺点在于,实验周期长,没有办法观测到HTE (heterogeneous treatment estimation)。

04问答环节

Q:DID和ABtest有什么区别?什么时候用DID不用ABtest?

A:两种不同维度的方法,ABtest是说,在实验对象上做出一些随机的对照,然后进行比较,即便是这种AB实验,我们遇到AB效果比较大的时候,也可以用DID来进行,DID不一定基于实验来进行,可以比如根据不同用户群来比较。

Q:双重机器学习和PSM的结果有什么区别?

A:两种不同维度的方法,PSM的核心假设是,我们先去估计了propensity Score ,基于propensity Score我们认为propensity Score相似的情况下treat与control组可以计算因果效应,双重机器学习是说,我们针对于混淆变量对于treatment的影响和混淆变量对于outcome的影响的function form是未知的,涉及到高维变量选择的问题,同时需要两步的估计,来得到我们想要估计的因果变量,是主要的差异。

Q:CIA假设往往不能满足,应该如何降低影响?

A:现在很多的包括双重机器学习等方法都有很多的扩展,比如当有些合适的工具变量会有些合适的拓展的工具方法,另外可以通过一些matching的方法去构造些满足条件的样本,但是这个东西也不是完全精确,很多时候需要靠人为的逻辑判断。

Q:因果图的结构是预设的还是模型结构输出的?

A:主要是模型输出的,但是在算法中我们可以限定哪些变量是父节点,哪些是子节点,如果最后结果与假设相悖,会发现假设的父节点下是没有任何子节点的。

Q:如何评价因果图判断的准确性?

A:① 通过模拟数据看准确性;② 通过实验数据,在有限的检验方式下,我们发现其结论是比较Robust,当然理论上可能还需要些证明。


http://chatgpt.dhexx.cn/article/EgnyCtCW.shtml

相关文章

因果分析与相关

在现实场景中我们常被要求回答“如果”的问题,经济学家称之为反事实。如果我现在要的不是这个价格,而是另一个价格,会发生什么?如果我不吃低脂饮食,而是吃低糖饮食会怎么样?如果你在银行工作,提…

因果分析.科学实验评估

目录 1. A/B Test原理 2. 实验分组划分 3.实验指标设计 4. 实验效果评估 5.离线指标测算 6.实验结果分析 不是每个想法都是好的,大部分想法都是不好的。 在互联网背景下,快速试错已经成为产品持续迭代的必备能力。借鉴传统行业(医学等)成熟的实验…

因果关系分析方法

因果关系推断,可以说是数据分析领域最难的问题之一,争吵很多年也没有定论。经常同学们被问到:“到底这个问题的原因是什么!”都会觉得分析起来很挠头,今天我们系统讲解下。 1 常见方法1:拆解法 最常见的用…

因果分析来了!

我是小z,也可以叫我阿粥~ 本文的分享主题为观测数据因果推断,希望通过本文可以让大家对观测数据因果推断有一个整体的了解,明晰当前观测数据因果推断的困境和主要处理方法,以及在特定问题中的一套通用解法。 具体将围绕以下3部分展…

因果分析:原理、方法论、应用

什么是因果分析? 因果分析(Causal Analysis)是分析彼此之间的因果关系。 因果推断(Causal Inference)是基于原因推结果,是因果分析的一部分。 因果分析是数据分析、数据科学中重要的方法,广泛应用于A/B实验,异常分析&#xff0…

C语言有负号的除法以及求余运算规则

举例说明 abc…d 1753…2 被除数除数商…余数 有负号的运算规则 求: -17除以5的商和余数17除以-5的商和余数-17除以-5的商和余数 答: abc…d 用a代表被除数,用b代表除数,用c代表商,用d代表余数. c的数值是|a|/|b|,c是正号还是负号由a和b的负号数量决定;d的正负号和a相同…

C语言取余问题

如果 % 左边的操作数是正数&#xff0c;则取余的结果为正数或零&#xff1b;如果 % 左边的操作数是负数&#xff0c;则取余的结果为负数或零。 例如代码运行如下&#xff1a; 主代码&#xff1a; #include<iostream> using namespace std; int main() {cout<<(13…

c语言怎么对大数求余,C语言:大数取余

大数取余数(数组) 今天做学校的oj时遇到一题&#xff0c;问题可见一下截图&#xff1a; 查遍各大论坛&#xff0c;都没有遇到合适的方法&#xff0c;普通方法不可用&#xff0c;要采用数组的形式。 被除数超过long long类型&#xff0c;不能采用常规思路&#xff0c;否则会出现…

C语言--求余问题

C在线工具 | 菜鸟工具 在c语言中&#xff0c;如果 a为一个四位数 那么a%1000/100是啥&#xff1f; 假设a的值为1345&#xff0c;那么当计算a%1000时&#xff0c;值为345 #include <stdio.h>int main() {int a 1345;int b a%1000;printf("%d",b); } 而345/…

软件开发流程图

文件下载https://download.csdn.net/download/weixin_43250197/12243113

嵌入式软件开发的特点和流程

嵌入式软件就是嵌入在硬件中的操作系统和开发工具软件&#xff0c;被广泛应用于工业控制、消费电子、医疗、通信等领域&#xff0c;我们常见的手机、电脑、数码相机等都运用到了嵌入式软件技术。为了确保嵌入式系统的运行&#xff0c;嵌入式软件迅速崛起&#xff0c;在整个软件…

一套完整的软件开发流程是怎样的?

​做什么事都需要一个流程&#xff0c;软件开发也不例外。 那么&#xff0c;一个软件从无到有到底是怎么开发的&#xff1f;一个软件产品的结果为什么是这样&#xff1f;为什么开发的速度不能再快一点。为什么程序员大多秃顶&#xff1f;他们有那么忙吗&#xff1f;完整的软件…

汽车软件V流程开发

1.系统需求分析 调研并输出系统需求文档 2.系统架构设计 通常和第一步并行&#xff0c;并在系统需求文档中体现。第1和第2步都是系统层级的&#xff0c;下面应该分软件和硬件两个分支&#xff0c;这里我们只关注软件这个分支。 3.软件需求分析 输出软件需求文档&#xff0…

详解自动驾驶安全软件开发流程

1 引言 自动驾驶汽车开发越来越重视性能、质量和性价比&#xff0c;自动驾驶口碑成为新技术应用取得市场成功的关键&#xff0c;而口碑的建立依赖于相关软件开发流程、周期、时间和质量。一家汽车企业只有拥有或者其软件开发供应商具有成熟的软件开发团队、软件开发流程、可复用…

软件开发流程:需求评审流程

1 常规需求 图1 常规需求评审流程 2 非常规需求 图2 非常规需求评审流程 3 紧急需求 图3 紧急需求评审流程

软件开发流程知识概括

软件开发流程知识概括 软件开发流程简述开发流程详解软件开发流程涉及的图软件开发总结 软件开发流程简述 研发流程简述&#xff1a; 研发流程详解&#xff1a; 需求提出&#xff1a; ①这个环节主要是产品爸爸给我们提需求&#xff0c;每个需求都是他们从用户&#xff0c…

软件开发的一般流程是什么?

软件开发流程分为: 需求确认——概要设计——详细设计——编码——单元测试——集成测试——系统测试——维护 软件开发是一项包括需求捕捉、需求分析、设计、实现和测试的系统工程。软件一般是用某种程序设计语言来实现的。通常采用软件开发工具可以进行开发。软件分为系统软…

python----列表操作

1. append(添加&#xff0c;添加的类型不变) a [1, 2] b [3, 4] c a.append(b) print(a--->, a) print(b--->, b) print(c--->, c)2. extend(末尾添加&#xff0c;会合并成一个列表) a [1, 2] b [3, 4] c a.extend(b) print(a--->, a) print(b--->, b) …

python——列表基础操作

1.列表的格式 列表的相关操作&#xff1a; 2.添加append()列表里面包含列表: extend和append的区别&#xff1a;append的最终列表中添加的是一个元素&#xff0c;extend的最终列表中显示的是追加的多个元素 第二种方式extend(): 指定对应索引新增数据insert&#xff1a; &am…

在python中、列表中的元素可以是_Python列表操作集合

对于python列表里元素的操作主要分为以下几个方面&#xff1a; 1、向列表里面加元素&#xff1b; 向python列表里面添加元素主要有三种方法&#xff1a; &#xff08;1&#xff09;append&#xff08;&#xff09; append()对于列表的操作主要实现的是在特定的列表最后添加…