想做长期的 AB 实验?快来看看这些坑你踩了没

作者:江颢

1.什么是长期的 AB 实验

大部分情况下,我们做的 AB 实验都是短期的,一到两周或者一个月之内的,通过分析这段时期内测得的实验效应得出实验结论,并最终进行推广。

长期实验即运行时间达数月甚至数年的实验,实验的长期效应指的是需要数月数年的 AB 实验才能积累的实验效应。

那什么场景下还需要做长期的 AB 实验,为什么不直接将短期的实验效应直接推广到长期效应呢?

因为在某些情况下, 实验的长期效应和短期效应是不同的

例如,在搜索引擎上显示不够匹配的搜索结果会导致用户再次搜索,搜索份额可能在短期内会增加,但随着用户体验下降并切换到更好的搜索引擎,搜索份额从长期来看会减少;同样,展示更多的广告可以在短期内增加广告点击和营收,但长期来看,却会因为广告点击甚至搜索的减少而造成营销的减少。

执着于短期的 AB 实验,会使我们倾向于高估技术的短期效应,而低估其长期效应。

2.为什么要做长期的 AB 实验

2.1 归因

数据驱动文化的团队会使用实验结果来跟踪评估团队的目标,在这种情况下需要对实验的长期效应进行正确的测量和归因。分析如果不引入新功能,从长远来看,产品获得的效果是怎么样的;引入新功能获得成功的原因,是由于外部政策影响、竞品变化还是用户的体验得到提升。这种归因是非常具有挑战性的

2.2 积累经验

长期和短期的 AB 实验在某种业务场景下是否存在差异,如果存在是什么原因造成的?产品引入新功能对用户的体验用什么影响,如果用户被新功能吸引,但只体验一次,则说明新功能可能不太满足用户需求;如果用户需要花费很长时间才能体验到新功能,则说明用户引导可能不够。了解这种差异可以为产品后续的升级迭代积累经验

2.3 推广结论

通过测量某种场景下的某些实验的长期效应,我们可以尝试总结并推广实验结论。之后在这类场景下做 AB 实验时,我们能否通过这些长期效应,创建可预测长期效应的短期指标,将这些指标作为我们实验的护栏指标;或者在决策中考虑那些推广的结论

3.为什么长期的 AB 实验容易踩坑

我们先来介绍一种 最常见最流行的做长期实验的方式:即延长短期实验的运行时间,长期运行它。

下图展示了随着时间推移,测得的实验效应变化。第一个实验周期测得的百分比增量测量值 P1 被认为是短期效应;而最后一个测量值 PT 则被认为是长期效应。

想做长期的 AB 实验?快来看看这些坑你踩了没

我们以此为例分析下这种简单的方式容易踩那些坑,导致 长期实验最后一周的测量值 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% 的用户,剩下的用户留在原来的对照组数周或在数月。

留出实验是长期运行实验的一种典型方式,但需要注意的是由于对照组流量比例此时比较小,统计功效会变低,要确保仍有足够的流量不会影响实验的目标

Original: https://www.cnblogs.com/Jcloud/p/16978085.html
Author: 京东云开发者
Title: 想做长期的 AB 实验?快来看看这些坑你踩了没

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/796653/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 利用WSL中的conda虚环境解决Import “***“ could not be resolved问题

    项目场景: 下午在加载可视化工具时用到了open3d的库,但是在VScode上缺少这样的库,于是我试图使用pip指令安装,结果出现了如下情况: 我按照所说更新了pip,或许由于网络…

    Python 2023年9月8日
    072
  • 【Python基础教程】类的定义和使用

    哈喽兄弟们,今天咱们分享一下类的定义和使用。 在Python中,类表示具有相同属性和方法的对象的集合。在使用类时,需要先定义类,然后再创建类的实例,通过类的实例就可以访问类中的属性…

    Python 2023年11月1日
    037
  • matplotlib.pyplot.hist()绘制直方图

    目录 一、matplotlib.pyplot.hist()语法 二、绘制直方图 ①绘制简单直方图 ②:各个参数绘制的直方图 (1)histtype参数(设置样式bar、barsta…

    Python 2023年8月30日
    034
  • Django入门笔记(一):框架结构及原理解析

    * – + 1、下载安装 + 2、创建django框架 + 3、运行django + 4、创建app + 常用django命令 1、下载安装 Django框架是使用py…

    Python 2023年8月4日
    049
  • 008 Django 静态文件配置

    静态文件配置 静态文件配置 settings.py 的设置 静态文件的访问 一般放在静态文件夹中的有哪些文件 settings.py 的设置 配置静态文件的访问路径 【该配置项已经…

    Python 2023年6月12日
    072
  • Scrapy教程经典实战【新概念英语】

    Scrapy教程经典实战【新概念英语】 前言 本教程旨在教会每一个想学习爬虫的人,学习的同时也能锻炼你阅读文档的习惯。 在本教程中,我们假设您的系统上已经安装了 Scrapy。如果…

    Python 2023年10月3日
    041
  • 编译llvm源码

    起因 最近几天因为公司服务器的libstdc++.so版本太低,导致我想用clangd进行代码不全的时候没法运行,因为官网上的clangd 14二进制包需要glibc2.28的东西…

    Python 2023年6月3日
    054
  • Python运算符

    目录 一、算数运算符 二、比较运算符 三、赋值运算符 四、逻辑运算符 五、位运算符 六、成员运算符 七、身份运算符 八、三目运算符 九、运算符优先级 ​​​​​​​ 一、算数运算符…

    Python 2023年8月1日
    053
  • 新型的代码调试工具

    文章目录 一.安装模块 * – 0.基础的使用方法 1.支持日志文件 2.1 读取局外变量或其他表达式 2.2 读取局外变量或其他表达式 2.3 设置调试日志的前缀 3…

    Python 2023年8月15日
    040
  • flask-sqlalchemy操作mysql

    文章目录 1、简介 2、mysql连接设置 3、模型类字段类型 4、ORM使用方式 * 4.1、先创建模型类,再迁移到数据库 4.2、用原生SQL创建数据库表,再编写模型类作映射 …

    Python 2023年8月13日
    054
  • matplotlib–pyplot

    前言 上一节我们提到, matplotlib绘图有两种风格 显式创建图形与轴空间,并在其上调用方法的OO风格 依靠 pyplot自动创建和管理图形和轴,并使用 pyplot函数进行…

    Python 2023年8月31日
    050
  • Matplotlib实践

    学习目标: 一周掌握 Matplotlib 学习内容: Matplotlib初相识 一、认识matplotlibMatplotlib是一个Python 2D绘图库,能够以多种硬拷贝…

    Python 2023年9月3日
    055
  • 【Python爬虫系列教程 30-100】通过scrapy框架、爬取豆瓣电影前250的电影资源并保存到MongoDB

    ### 回答1: 豆瓣 电影_是众所周知的一个知名 _电影_评分网站,其中的TOP250 _电影_榜单更是备受关注。 _爬 取_这个榜单的数据可以帮助我们更好地了解 _电影_市场和…

    Python 2023年10月4日
    044
  • 研发效能|DevOps 已死平台工程永存带来的焦虑

    最近某位大神在推特上发了一个帖子,结果引来了国内众多卖课机构、培训机构的狂欢,开始贩卖焦虑,其实「平台工程」也不是什么特别高深莫测的东西。闲得无聊,把这位大神的几个帖子薅了下来,你…

    Python 2023年10月16日
    045
  • 在pygame 里面怎么搭建显示得分

    在调用pygame下面调用一下初始化 不调用初始化会报错会找不到字体 pygame.init() 定义一个变量来记录分数 下面放在游戏循环里面 第一, 调用电脑自带的字体 第一个参…

    Python 2023年9月18日
    028
  • 解决RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cp

    今天在把.pt文件转ONNX文件时,遇到此错误。 报错 RuntimeError: Expected all tensors to be on the same device, b…

    Python 2023年8月2日
    042
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球