ML辅助A/B随机化检验 — 有限样本随机化测试检测异质处理效应与干扰效应
Skill-ML-AB-Randomization-Test · 02-A_B实验
1. 解决的问题
传统t检验漏报异质处理效应导致真实有价值的实验被错误回滚——ML随机化检验将ML交叉验证误差差作为统计量,精准检测HTE和干扰效应,有限样本精确保证(2025 arXiv:2501.07722)
2. 核心算法逻辑
反直觉洞察:传统A/B测试使用t检验或MannWhitney U检验,这两种方法只能检测平均处理效应(ATE)——对所有用户的平均影响。但跨境电商的很多关键问题是异质处理效应(HTE):新版产品页面对"首次访问用户"有效,但对"回头客"反而降低转化;限时折扣对"犹豫型用户"有效,对"价格不敏感的忠实用户"没效果。传统t检验无法捕捉这类HTE,甚至在HTE显著时会"漏报"(虽然某子群有强效应,ATE接近0导致整体不显著)。ML辅助随机化检
3. 业务应用场景
- 业务问题:母婴卖家对吸奶器产品页面进行改版(加入视频评测+信任徽章),传统t检验显示整体转化率无显著提升(p=0.12)。但运营直觉告诉他们"首次访问用户"应该显著受影响 - ML随机化检验: 1. 特征X:用户类型(新/回头客)、设备类型、访问时段、地区 2. 分别对新用户/回头客子群运行ML随机化检验 3. 发现:新用户子群p=0.003(显著),回头客子群p=0.71(不显著) 4. 决策:对新用户保持新版页面,对回头客保留旧版(个性化A/B) - 预期产出:精准发现HTE后,个性化页面策略使整体转化率额外提升3.2%
- **业务问题**:闪购活动(限时折扣)实验设计中,被随机分配到"看到闪购"组的用户,其购买行为可能影响"未看到闪购"组(库存被抢购→其他用户无法购买) - **ML随机化干扰检验**:构建用户社交网络图,检测处理组对控制组邻居的溢出效应;量化干扰强度,校正实验结果
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:传统t检验"不显著"而错误回滚一次实验的成本(假设实际有HTE效应)约等于放弃3-8%的GMV提升机会;ML随机化检验减少漏报,每季度至少识别1个被误判的有价值实验,年化价值$5-20万
- 实施难度:⭐⭐⭐☆☆(需要scikit-learn基础;排列检验计算量适中;主要挑战是选择合适的特征X和ML模型)
- 优先级:⭐⭐⭐⭐⭐(A/B测试是跨境电商迭代的核心工具,检验方法升级直接提升决策质量)
- 适用规模:样本量>200的实验即可使用;特别适合有丰富用户特征(新/老用户/设备/地区)的跨境平台
- 数据依赖:实验日志(用户ID/处理分配/结果/协变量),无需额外数据采集
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
ML辅助A/B随机化检验
基于 arXiv:2501.07722 (2025)
有限样本随机化测试,检测ATE/HTE/干扰效应
"""
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
import warnings
warnings.filterwarnings('ignore')
def compute_ml_test_statistic(X, D, Y, model=None, n_folds=5):
"""
计算ML辅助测试统计量
T_ML = CV_Error(无处理) - CV_Error(有处理)
Args:
X: 协变量矩阵 (n_samples, n_features)
D: 处理变量 (n_samples,),0=控制,1=处理
Y: 结果变量 (n_samples,)
model: ML模型(默认GBM)
Returns:
T_ML: 测试统计量(正值=处理有效)
"""
if model is None:
model = GradientBoostingClassifier(n_estimators=50, max_depth=3, random_state=42)
n = len(Y)
D_col = D.reshape(-1, 1)
# 有处理变量的模型
X_with_D = np.hstack([X, D_col])
scores_with = cross_val_score(model, X_with_D, Y, cv=n_folds, scoring='neg_log_loss')
# 无处理变量的模型
scores_without = cross_val_score(model, X, Y, cv=n_folds, scoring='neg_log_loss')
# 测试统计量:有处理时误差更小说明处理有效
T_ML = np.mean(scores_without) - np.mean(scores_with)
return T_ML
def randomization_test(X, D, Y, n_permutations=500, alpha=0.05):
"""
随机化检验(排列检验)
Args:
X: 协变量
D: 处理变量
Y: 结果变量
n_permutations: 排列次数
alpha: 显著性水平
Returns:
p_value: p值
T_observed: 观测统计量
T_null_dist: 零假设分布
significant: 是否显著
"""
# 观测统计量8. 论文来源
- 2501.07722