想做长期的 AB 实验?快来看看这些坑你踩了没
作者:江颢
1.什么是长期的 AB 实验
大部分情况下,我们做的 AB 实验都是短期的,一到两周或者一个月之内的,通过分析这段时期内测得的实验效应得出实验结论,并最终进行推广。
长期实验即运行时间达数月甚至数年的实验,实验的长期效应指的是需要数月数年的 AB 实验才能积累的实验效应。
那什么场景下还需要做长期的 AB 实验,为什么不直接将短期的实验效应直接推广到长期效应呢?
因为在某些情况下,实验的长期效应和短期效应是不同的 。
例如,在搜索引擎上显示不够匹配的搜索结果会导致用户再次搜索,搜索份额可能在短期内会增加,但随着用户体验下降并切换到更好的搜索引擎,搜索份额从长期来看会减少;同样,展示更多的广告可以在短期内增加广告点击和营收,但长期来看,却会因为广告点击甚至搜索的减少而造成营销的减少。
执着于短期的 AB 实验,会使我们倾向于高估技术的短期效应,而低估其长期效应。
2.为什么要做长期的 AB 实验
2.1 归因
数据驱动文化的团队会使用实验结果来跟踪评估团队的目标,在这种情况下需要对实验的长期效应进行正确的测量和归因。分析如果不引入新功能,从长远来看,产品获得的效果是怎么样的;引入新功能获得成功的原因,是由于外部政策影响、竞品变化还是用户的体验得到提升。这种归因是非常具有挑战性的
2.2 积累经验
长期和短期的 AB 实验在某种业务场景下是否存在差异,如果存在是什么原因造成的?产品引入新功能对用户的体验用什么影响,如果用户被新功能吸引,但只体验一次,则说明新功能可能不太满足用户需求;如果用户需要花费很长时间才能体验到新功能,则说明用户引导可能不够。了解这种差异可以为产品后续的升级迭代积累经验
2.3 推广结论
通过测量某种场景下的某些实验的长期效应,我们可以尝试总结并推广实验结论。之后在这类场景下做 AB 实验时,我们能否通过这些长期效应,创建可预测长期效应的短期指标,将这些指标作为我们实验的护栏指标;或者在决策中考虑那些推广的结论
3.为什么长期的 AB 实验容易踩坑
我们先来介绍一种最常见最流行的做长期实验的方式:即延长短期实验的运行时间,长期运行它。
下图展示了随着时间推移,测得的实验效应变化。第一个实验周期测得的百分比增量测量值 P1 被认为是短期效应;而最后一个测量值 PT 则被认为是长期效应。
我们以此为例分析下这种简单的方式容易踩那些坑,导致长期实验最后一周的测量值 PT 可能无法代表实验真正的长期效应:
3.1 实验设计不合理
3.1.1 随机化单元设计不合理
如果随机化单元设置成用户级别,但根据 cookie 进行试验的随机化,随着时间推移,实验组的用户可能因为使用新 cookie 而被随机分配到对照组,时而存在于实验组,时而存在于对照组,从而带来偏差。
3.1.2 幸存者偏差
并非实验开始时的所有用户都可以存在到实验结束。
如果实验组和对照组之间的用户生存率不同,则 PT 会有幸存者偏差。
如果不喜欢新功能的试验组用户随着时间流逝而启用产品,那 PT 只包含了哪些仍然存在的用户以及新加入实验的用户,从而带来偏差。
3.1.3 实验效应稀释
用户是可以使用多个设备体验功能,而如果实验仅测量其中的一个子集。 那实验时间越长,用户在实验期间使用多个设备的可能性就越大。对于最后一周内访问的用户,实际上实验只包括了在整个时间段 T 中一部分的用户体验, 以 PT 衡量的结果不是用户在时间 T 曝光于实验的长期效应,而是稀释后的结果。
3.2 实验组和对照组之间存在潜在的干扰
3.2.1 直接关联
用户行为往往会受到网络中其他人的影响,尤其是熟悉的人的行为的影响。
如果被测试功能对用户有显著的影响,即使其本身可能需要一段时间才能被用户发现并使用,但经过渗透用户的社交圈,通过网络传播可能很快就被发现并使用了。
例如如果实验组会促使用户给其他用户发送更多的私信,那么对照组用户也会回复这些私信,并可能更主动发送私信。如果实验关注指标是私信发送总数,那对照组关注指标也会增长,测出来的试验组数据和对照组数据差别会偏小,而不能完整的捕捉到新算法的收益
3.2.2 间接关联
实验组和对照组可能会因为共享某种资源而产生间接关联,造成干扰。
例如 uber 测试一个溢价算法,效果很好以致于实验组的用户更愿意打车,那么在路上可能接客的司机数量减少了,对应的对照组的价格会升高,导致照组用户愿意打车的意愿降低了。这种情况,会高估实验组和对照组的差别。
又如关于搜索引擎基于的关联模型的实验,如果我们使用从所有用户那里收集到的数据训练实验组和对照组,实验组的关联模型可以更好的预测用户喜欢点击什么,那么实验运行时间越长,实验组产生的'好的'点击数据也会使对照组收益。实验组和对照组的差别会降低。
3.3 实验用户的行为变化
随着用户对被测功能的学习并适应变化,用户的行为也会发生变化。
如果被测功能是新功能,也许需要一段时间才能被用户注意并使用,但是一旦发现它是有用的,长期来看,用户就会频发使用。
如果被测功能是对已有功能的修改,用户由于已经适应了旧功能,用户可能会需要时间适应新功能;也可能用户会在短期内对新功能产生兴趣,投入更多的时间和探索,但长期来看,用户行为最终会达到一个平衡点。
对于这些情况,实验的短期效应和长期效应存在不同
3.4 外部生态系统的变化
3.4.1 季节性变化
不同季节,商家会采取不同的营销活动,导致用户的购买意图不同。例如双十一期间用户的购买意图会比非双十一期间表现不同
3.4.2 重大事件
例如政策发生变化、大型社会事件,都可能会影响用户的被测试功能的表现
3.4.3 竞品影响
如果竞争对手启动了相同的功能,则可能影响用户对被测试功能的体验,该功能的价值可能会下降。
3.4.4 启动其他新功能
长期实验运行期间可能会启动许多其他实验,并且可能与被测试的功能进行交互,随着时间推移,可能会对实验产生影响。
4.如何做长期的 AB 实验
实验长期效应的偏差可能是由于不同原因引起的,以下介绍几种改善长期实验的测量方式来预防或者修正这种偏差。
注意没有一种方式可以完全解决所有的偏差,都可能存在某种局限性,建议使用前评估这些方法的局限性。
4.1 群组分析
在实验开始之前构建稳定的用户群,并仅分析对该用户群的短期效应和长期效应。这种方法可以帮助解决幸存者偏差和实验效应稀释的问题。
但这种方式有几点需要注意:
1.群组的稳定性对这种方法的有效性非常重要。如果随机化单元是基于 cookie 的,由于 cookie 流失率很高,群组的稳定性则比较差,导致这种方法不能很好的纠正偏差
2.群组必须具备代表性。如果群组不能代表总体人群,那分析结果可能无法推广到整个人群。
4.2 后期分析
该方式的关键是在实验运行一段时间后,使对照组用户和实验组用户在测量期间内的产品体验完全相同。
对于这种方式有两种选择:第一种在运行一段时间(时间 T)后关闭实验,然后在时间 T 和时间 T + 1 期间测量实验组用户和对照组用户之间的差异;或者可以将实验组发布给所有用户来应用此方式。
这种方式本质上是在最后一段时间内做了一个 A/A 实验,根据后期的 A/A 实验测量长期效应。
但这种方式有个前提隐患,即系统可能‘记住’了实验期间的信息,我们称之为系统的习得效应。常见的例子是通过机器学习模型向实验组用户展示更多的广告,实验组用户使用足够长的时间后系统可能会更了解用户,即使在后期进行了 A/A 实验,也仍然会向他们展示更多的广告。
如果实验中,系统的习得效应为零,那 A/A 实验之后实验组和对照组用户都曝光于完全相同的一组功能。给定足够多的实验,测量用户的习得效应,然后从新的短期实验中外推出长期效应。
这种方式能有效的将效应与随时间变化的外在因素和其他新功能带来的潜在交互影响分割开来。因为用户的习得效应是单独测量的,能为实验短期效应与长期效应的不同带来更多的分析依据。
但这种方式存在幸存者偏差和实验效应稀释的问题,可与群组分析方式结合使用。
4.3 实验留白
长期运行对照组是存在一定的成本的,代价可能是昂贵的,因为他们一直没有获得实验组的新功能。因此如果迫于时间、迭代周期的压力,需要将被测试的新功能推全给所有用户,一种方式就是实验留白。实验结果出来之后,将实验组流量发布给 90%、95% 的用户,剩下的用户留在原来的对照组数周或在数月。
留出实验是长期运行实验的一种典型方式,但需要注意的是由于对照组流量比例此时比较小,统计功效会变低,要确保仍有足够的流量不会影响实验的目标
想做长期的 AB 实验?快来看看这些坑你踩了没的更多相关文章
- 为什么在数据驱动的路上,AB 实验值得信赖?
在线AB实验成为当今互联网公司中必不可少的数据驱动的工具,很多公司把自己的应用来做一次AB实验作为数据驱动的试金石. 文 | 松宝 来自 字节跳动数据平台团队增长平台 在线AB实验成为当今互联网公司中 ...
- AB实验的高端玩法系列2 - 更敏感的AB实验, CUPED!
背景 AB实验可谓是互联网公司进行产品迭代增加用户粘性的大杀器.但人们对AB实验的应用往往只停留在开实验算P值,然后let it go...let it go ... 让我们把AB实验的结果简单的拆解 ...
- AB实验的高端玩法系列3 - AB组不随机?观测试验?Propensity Score
背景 都说随机是AB实验的核心,为什么随机这么重要呢?有人说因为随机所以AB组整体不存在差异,这样才能准确估计实验效果(ATE) \[ ATE = E(Y_t(1) - Y_c(0)) \] 那究竟随 ...
- Paper慢慢读 - AB实验人群定向 Double Machine Learning
Hetergeneous Treatment Effect旨在量化实验对不同人群的差异影响,进而通过人群定向/数值策略的方式进行差异化实验,或者对实验进行调整.Double Machine Learn ...
- AB实验的高端玩法系列4- 实验渗透低?用户未被触达?CACE/LATE
CACE全称Compiler Average Casual Effect或者Local Average Treatment Effect.在观测数据中的应用需要和Instrument Variable ...
- 注意,你所做的 A/B 实验,可能是错的!
对于 A/B 实验原理认知的缺失,致使许多企业在业务增长的道路上始终在操作一批"错误的 A/B 实验".这些实验并不能指导产品的优化和迭代,甚至有可能与我们的初衷背道而驰,导致&q ...
- Salt Stack 官方文档翻译 - 一个想做dba的sa - 博客频道 - CSDN.NET
OSNIT_百度百科 Salt Stack 官方文档翻译 - 一个想做dba的sa - 博客频道 - CSDN.NET Salt Stack 官方文档翻译 分类: 自动运维 2013-04-02 11 ...
- “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标 想做一个面对中小企业的专业上游软件供应商 台湾联发科技颠覆掉的是一个封闭的手机产业系统 解决方案,即AgileHIS.NET数字化医院基础方案
“医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标 我们做中国医疗信息化行业之中的联发科 ---我们在医疗行业中的定位及目标 从我个人来讲,我从2001年到现在这10年之间基本上一直在 ...
- 想做web前端project师应该学习些什么?
偶然间看到这篇文章.感觉博主写的挺不错的,假设你想做web前端project师的话,建议您阅读下面这篇文章,事实上web前端project师所做的工作事实上就是站点设计,有些小公司的美工事实上就是做w ...
- Paper慢慢读 - AB实验人群定向 Recursive Partitioning for Heterogeneous Casual Effects
这篇是treatment effect估计相关的论文系列第一篇所以会啰嗦一点多给出点背景. 论文 Athey, S., and Imbens, G. 2016. Recursive partition ...
随机推荐
- 3_肯德基餐厅信息查询_动态加载_post请求
肯德基餐厅信息查询网址:http://www.kfc.com.cn/kfccda/storelist/index.aspx import requests url = 'http://www.kfc. ...
- 4_Spring
一. Spring Spring的基本组成: 1.最完善的轻量级核心框架. 2.通用的事务管理抽象层. 3.JDBC抽象层. 4.集成了Toplink, Hibernate, JDO, and iBA ...
- CAS核心思想、底层实现
★ 1.CAS 是什么 CAS 是比较并交换,是实现并发算法时常用到的一种技术.当内存的值和期望的值相等时,进行更新,否则 什么都不做 或 重来 . CAS 的底层实现:是靠硬件实现的,靠硬件的原子性 ...
- 关于VirtualBox在新建虚拟机时-选择操作系统类型后没有64位的版本选项
今天笔者准备使用VirtualBox安装一台windows的虚拟时,在选项操作系统类型为Microsoft Windows后 发现下面的版本选择中,没有之前看到的64位选择,全是32位的,但实际昨天都 ...
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...
- doecker---制作DockerFile并上传Hub
一.DockerFile基础知识 FROM #基础镜像,一切从这里开始构建 MAINTAINER #镜像是谁写的,姓名+邮箱 RUN #镜像构建的时候需要运行的命令 ADD #添加内容,步骤,tomc ...
- 使用jmx exporter采集kafka指标
预置条件 安装kafka.prometheus 使用JMX exporter暴露指标 下载jmx exporter以及配置文件.Jmx exporter中包含了kafka各个组件的指标,如server ...
- 【HarmonyOS】【ArkUI】在Service中使用Emitter
参考资料 1.相关基础知识:触发器Emitter2.启动服务:ServiceAbility开发 开发步骤 第一步:开发界面,界面内容由一个按钮组件+文本组件构成,然后在按钮组件中添加点击事件,开启 ...
- 13、设计一个函数process,在你调用他的时候,每次实现不同的功能,输入a,b两个数, 第一次调用时找出a,b中的最大者。 第二次找出最小者,,第三次求两个数的和。
/* 设计一个函数process,在你调用他的时候,每次实现不同的功能,输入a,b两个数, 第一次调用时找出a,b中的最大者. 第二次找出最小者,,第三次求两个数的和. */ #include < ...
- C#winfrom调整任意控件宽和高
在winform项目开发中,偶尔需要用到边框拖拽.度娘也没找到相关的轮子(可能是我不配,没推给我).只能自己造一个 上效果图(鼠标没录制上,问题不大) 上代码 private void Form1_L ...