AB实验分流方式:发现最优分组概述

当前在货拉拉进行的诸多AB实验中,存在部分针对细分场景 或是分流粒度较粗 的策略评估,这些实验中实验单元少 ,简单随机分流会导致实验与对照实验前偏差(Pre-Experiment Bias)大。

本文档调研了业界先进的实验前偏差 应对技术(AA回溯、最优随机种子和方差缩减)后,在最优随机分组 的基础上,进一步提出了离线分流------用户或司机在实验中的行为与实验前有相关性,可以利用历史数据,将实验对象分为差异很小的两组或多组,以提升AB实验的可靠性和干预效应评估的准确性。

1. 实验前偏差

微软在Edge浏览器的一个AB实验中,改变了一些数据的存储格式,预计不会对用户产生影响。但实验数据显示关键用户参与度指标下降,p 值为0.01,且没有其他侧面指标可以解释这种指标变动。

这类问题通常会被解释为"数据波动",认为这个显著的实验结果是假阳性 (False Positive)。常见的解决方案是重开一次实验,但在实践中,未必有机会重开实验,即使可以重开也会花费额外时间,拖慢策略或产品功能的上线进度。

微软发现历史数据 可以有效地发现和应对实验前差异(Pre-Experiment Bias),提升AB实验的可信度。下文会简单介绍微软在其实验平台落地的三种技术:AA回溯最优随机分组方差缩减

1. AA回溯(Retrospective-AA Analysis)

在实验进行或结束后,计算和检查在实验前某段时间内实验组和对照组的指标差异,如果确实在AA回溯中观察到两个组之间的指标存在较大差异,则实验期间指标的差异更有可能是随机化引入的偏差。

2. 最优随机分组(SeedFinder)

虽然实验后AA回溯可以识别实验结果的假阳性,但它有滞后性,在实验开始后才能知道是否存在实验前偏差。使用SeedFinder可以在实验前判断出实验和对照组是否存在差异。

在AB实验中,通常使用哈希函数和随机种子将用户随机 分配到实验组和对照组。在实验开始前,使用大量不同的随机种子,生成大量实验对象分组方案 ,并计算其中各组的核心指标的差异,然后选择一个最佳(差异最小) 的种子用于AB实验。

微软建议生成数百个种子,但最合适的数量会因选择的产品和指标而异。多次随机减少了与策略无关的噪声,并提高了实验效果测算的精度。

微软建议结合使用所有三种技术来提高实验结果的可信度。使用SeedFinder 找到使实验前核心指标差异最小的随机分组,方差缩减 可以提高指标的敏感性(更容易显著)并减少实验前差异,而AA回溯可以检查未经SeedFinder优化过的次要指标的实验前差异。

本文在SeedFinder 的基础上,结合货拉拉AB实验的实际应用场景(如定价、营销),提出了更通用的离线分流的概念。

2. 离线分流

1. 思路

目标:找到两组或多组同质的分群支持AB实验

解法 :实验期间的用户/司机行为和其历史行为有相关性,在此基础上通过随机搜索运筹优化的方式找到历史上差异最小的两组或多组

2. 流程图------以用户分流为例

user_id 分流和随机搜索为例,同样也可以拓展到司机、空间分流

3. 操作流程

STEP 1 确定实验对象名单

根据实际业务场景,思考实验对象是否满足SUTVA假设(个体处理稳定性假设),例如实验对象是否存在Network Effect / Spillover Effect等,然后选择合适的实验分流单元(支持用户、司机、空间)。

根据AB实验需要评估的效应,按照与业务方达成一致的实验单元圈选逻辑,确定待分组实验单元名单。

STEP 2 确定分流相关参数

分组数量:将待分组实验对象名单分为几组

流量比例:子分组实验单元数量占总体实验单元数量的比例;如"对照(40%)、实验组A(30%)、实验组B(30%)"

核心指标:实验设计中关注的核心指标名称;如每个用户过去7天的完单量、完单流水等

历史数据切割:圈选训练日期、测试日期(可选,默认与训练日期一致)

同质性判断标准:如何判断随机出的分组在核心指标上有无差异;如近7天实验组和对照组的人均完单GTV无显著差异(阈值取0.05)或相对差异<1%

随机种子范围:确定需要尝试的随机种子的个数和范围

时空片轮播顺序 (仅适用于时空分流):交替轮播 (每天时间片奇数) 或 交替轮播+隔天反转(每天时间片偶数)

STEP 3 生成实验对象分流方案

随机搜索(Random Search)

使用不同的随机种子,利用与AB平台完全相同的哈希算法,根据STEP 2中输入的分流参数,生成多个实验对象分流方案

根据同质性判断标准 ,使用训练日期数据,计算每个实验对象分流方案 中两个或多个组之间核心指标的差异和显著性水平,并判断是否同质 。 如果满足同质性标准,则保留该实验对象分流方案同质性评估结果,供后续环节使用

运筹优化

相较于随机搜索,运筹优化可以找到最优解,或者在相同的时间内找到更优解。

输入离线分组对应的参数:

  1. 同质性要求: 如最小化实验和对照组某段周期(或每周、每天)的各个指标汇总差异
  2. 指标数量 <math xmlns="http://www.w3.org/1998/Math/MathML"> I I </math>I:如I=2代表2个指标
  3. 时间片粒度数量 <math xmlns="http://www.w3.org/1998/Math/MathML"> T T </math>T:如时间片粒度为天,T=7,代表实验和对照组一周内每天的指标相似
  4. 分组数量 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K:如K=2,将待分组实验对象名单分为均等的2组
  5. 总体数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X ˉ \bar{X} </math>Xˉ:训练集的优化目标,是一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> I × T × K I \times T \times K </math>I×T×K的矩阵;假设要把完单总量为500单的100个用户分为两组,我们希望两组的用户的人数和人均单相等,其实是要求两组的人数接近50且每组人均完单接近500 / 100 = 5,因此优化的目标应该是和总体相似
  6. 训练集分组数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X G X^G </math>XG: <math xmlns="http://www.w3.org/1998/Math/MathML"> X G X^G </math>XG是一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> I × T × K I \times T \times K </math>I×T×K的矩阵,对应着不同实验分组每个时间点每个指标的值;根据实验对象分流方案,计算各组的指标数据,支持遗传算法迭代
  7. 损失函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> L ( X G , X ˉ ) L(X^G, \bar{X}) </math>L(XG,Xˉ):根据训练集分组数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X G X^G </math>XG和总体数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> X ˉ \bar{X} </math>Xˉ,计算两组或多组的核心指标差异;如MSE

使用遗传算法:

使用遗传算法,求解 <math xmlns="http://www.w3.org/1998/Math/MathML"> G ∗ = arg ⁡ min ⁡ G ∑ i = 1 I ∑ t = 1 T ∑ k = 1 K L ( X G , X ˉ ) G^* = \arg \min_G \sum_{i=1}^{I} \sum_{t=1}^{T} \sum_{k=1}^{K}L(X^G, \bar{X}) </math>G∗=argminG∑i=1I∑t=1T∑k=1KL(XG,Xˉ)

  1. 如果使用最简单的MSE损失函数,上述数据问题变为:

    <math xmlns="http://www.w3.org/1998/Math/MathML"> G ∗ = arg ⁡ min ⁡ G ∑ i = 1 I ∑ t = 1 T ∑ k = 1 K ( x i t k G − x ˉ i t k ) 2 G^* = \arg \min_G \sum_{i=1}^{I} \sum_{t=1}^{T} \sum_{k=1}^{K} (x^G_{itk} - \bar{x}_{itk})^2 </math>G∗=argminG∑i=1I∑t=1T∑k=1K(xitkG−xˉitk)2

  2. 如果考虑的多个指标的尺度不同,可应用normalizaiton,如:

    <math xmlns="http://www.w3.org/1998/Math/MathML"> G ∗ = arg ⁡ min ⁡ G ∑ i = 1 I ∑ t = 1 T ∑ k = 1 K ( x i t k G − x ˉ i t k x ˉ i t k ) 2 G^* = \arg \min_G \sum_{i=1}^{I} \sum_{t=1}^{T} \sum_{k=1}^{K} (\frac{x^G_{itk} - \bar{x}{itk}}{\bar{x}{itk}})^2 </math>G∗=argminG∑i=1I∑t=1T∑k=1K(xˉitkxitkG−xˉitk)2

  3. 如果指标中存在一些离群点,也可以使用更Robust的损失函数,如Huber loss

运筹优化执行举例:

|---------------|----------|-----------|-----------|-----------|----------|
| 城市分群 | 指标名称 | 日期 ||||
| 城市分群 | 指标名称 | 2022/7/1 | 2022/7/2 | 2022/7/3 | 2022/7/4 |
| 总体 | 执行单量 | 1,000,000 | 1,200,000 | 1,100,000 | 900,000 |
| 总体 | 配对单量 | 850,000 | 1,020,000 | 935,000 | 765,000 |
| 每组目标(均分为2组) | 执行单量 | 500,000 | 600,000 | 550,000 | 450,000 |
| 每组目标(均分为2组) | 配对单量 | 425,000 | 510,000 | 467,500 | 382,500 |
| 城市组1 | 执行单量 | 498,000 | 598,000 | 548,000 | 448,000 |
| 城市组1 | 配对单量 | 423,000 | 508,000 | 465,500 | 380,500 |
| 城市组2 | 执行单量 | 502,000 | 602,000 | 552,000 | 452,000 |
| 城市组2 | 配对单量 | 427,000 | 512,000 | 469,500 | 384,500 |
| 城市组1与目标DIFF | 执行单量 | -2,000 | -2,000 | -2,000 | -2,000 |
| 城市组1与目标DIFF | 配对单量 | -2,000 | -2,000 | -2,000 | -2,000 |
| 城市组2与目标DIFF | 执行单量 | 2,000 | 2,000 | 2,000 | 2,000 |
| 城市组2与目标DIFF | 配对单量 | 2,000 | 2,000 | 2,000 | 2,000 |
| 总体损失(MSE) | 64,000,000 |||||

保存该最优实验对象分流方案及同质性评估结果,供后续环节使用

STEP 4 实验设计评估

在测试日期上,输出满足同质性标准实验对象分流方案中,两两分组之间的核心指标相对差异,并判断差异是否显著(输出p值)

展示多个实验对象分流方案,供用户选择

3. 案例说明

1. 实验前差异有延续性

可以检验实验前差异和实验中差异存在相关性,若相关则说明实验前的差异可能延续到实验中

问题:将实验前的差异控制在0附近,是否能将实验中的差异更好地控制在0附近?

2. 发现最优分组增强实验可靠性

简单随机分流:user_id随机分流

控制实验前差异 :在user_id随机分流的基础上,只选择两组人均单量的相对差异在±0.25%以内的分流(这部分分流占总体分流大约16%)

两种抽样方式通过随机模拟各得到1000种分流,分别统计两种分流方式实验中a、b两组人均单量的相对差异

相对差异 = 实验组指标/对照组指标 - 1

由于两组受到的干预相同(AA实验),故希望差异在0附近越集中越好;越集中,说明两组越同质,分流同质性越好

控制实验前差异可以一定程度实验中差异在0附近的集中度,从而提高分流的同质性

左图:横轴表示实验前人均单量差异,纵轴表示实验中人均单量差异

右图:横轴表示实验中两组相对差异;纵轴表示相对差异出现的频次(大部分差异在0附近);蓝:简单随机抽样,黄:控制实验前差异

总结

实验前偏差会造成实验组和对照组之间存在差异,影响AB实验的实际效果。

本文在微软提出的SeedFinder基础上,结合运筹优化技术,提出了一种离线分流算法,在货拉拉的实际业务中取得了较好的实验效果。

相关推荐
我明天再来学Web渗透9 分钟前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法
Data 31715 分钟前
Hive数仓操作(十一)
大数据·数据库·数据仓库·hive·hadoop
数据分析螺丝钉1 小时前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试
no_play_no_games1 小时前
「3.3」虫洞 Wormholes
数据结构·c++·算法·图论
五味香1 小时前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
毕小宝1 小时前
逻辑回归(下): Sigmoid 函数的发展历史
算法·机器学习·逻辑回归
小叮当爱咖啡1 小时前
DenseNet算法:口腔癌识别
算法
希望有朝一日能如愿以偿1 小时前
算法(食物链)
算法
鱼跃鹰飞1 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
qtj-0012 小时前
普通人在刚开始做副业时要注意哪些细节?
大数据·微信·新媒体运营·创业创新