A/B测试是推荐系统效果验证的金标准。通过随机将用户分为对照组和实验组,对比不同推荐策略的真实效果。A/B测试能捕捉离线评估无法衡量的因素(位置偏差、长期影响等)。
z = (p_B-p_A) / √(2p̄(1-p̄)/n)
n = (z_{α/2}√2p̄(1-p̄)+z_β√(p₁(1-p₁)+p₂(1-p₂)))²/Δ²
CI = Δ ± z_{α/2}·SE
import numpy as np
from scipy import stats
np.random.seed(42)
print("="*60+"\nA/B测试\n"+"="*60)
# 模拟A/B测试数据
n_users_ab=2000
# 控制组(A): 旧推荐算法
ctr_A=np.random.binomial(1,0.05,n_users_ab)
# 实验组(B): 新推荐算法(提升0.8pp)
ctr_B=np.random.binomial(1,0.058,n_users_ab)
print(f"样本量:每组{n_users_ab}")
print(f"控制组(A)CTR:{ctr_A.mean():.4f}")
print(f"实验组(B)CTR:{ctr_B.mean():.4f}")
# 统计检验
# Z检验(两比例)
p_A=ctr_A.mean();p_B=ctr_B.mean()
p_pool=(ctr_A.sum()+ctr_B.sum())/(2*n_users_ab)
se=np.sqrt(2*p_pool*(1-p_pool)/n_users_ab)
z=(p_B-p_A)/se
p_value=2*(1-stats.norm.cdf(abs(z)))
print(f"\nZ检验:z={z:.4f} p={p_value:.4f}")
print(f"结论:{'显著'if p_value<0.05 else '不显著'}(α=0.05)")
# 置信区间
diff=p_B-p_A
ci_low=diff-1.96*se;ci_high=diff+1.96*se
print(f"差异置信区间:[{ci_low:.4f},{ci_high:.4f}]")
# 样本量计算
def sample_size(p_base,mde,alpha=0.05,beta=0.2):
z_alpha=stats.norm.ppf(1-alpha/2)
z_beta=stats.norm.ppf(1-beta)
p1=p_base;p2=p_base+mde
p_avg=(p1+p2)/2
n=(z_alpha*np.sqrt(2*p_avg*(1-p_avg))+z_beta*np.sqrt(p1*(1-p1)+p2*(1-p2)))**2/mde**2
return int(np.ceil(n))
print(f"\n--- 样本量计算 ---")
for mde in [0.005,0.01,0.02]:
n=sample_size(0.05,mde)
print(f"MDE={mde}:需要每组{n}样本")
# 多指标测试
print("\n--- 多指标测试 ---")
metrics={"CTR":(ctr_A,ctr_B),"停留时长":(np.random.exponential(30,n_users_ab),np.random.exponential(32,n_users_ab))}
for name,(a,b) in metrics.items():
t_stat,p_val=stats.ttest_ind(a,b)
print(f" {name}:A均值={np.mean(a):.2f} B均值={np.mean(b):.2f} p={p_val:.4f}")
# 分层分析
print("\n--- 分层分析 ---")
user_type=np.random.choice(["新用户","老用户"],n_users_ab,p=[0.3,0.7])
for ut in ["新用户","老用户"]:
mask_a=user_type==ut
ctr_a=ctr_A[mask_a];ctr_b=ctr_B[mask_a]
if len(ctr_a)>0 and len(ctr_b)>0:
print(f" {ut}:A={ctr_a.mean():.4f} B={ctr_b.mean():.4f} n={mask_a.sum()}")
# AA测试(验证分流正确性)
print("\n--- AA测试(验证分流) ---")
ctr_all=np.concatenate([ctr_A,ctr_B])
half=len(ctr_all)//2
aa_a=ctr_all[:half];aa_b=ctr_all[half:]
t_aa,p_aa=stats.ttest_ind(aa_a,aa_b)
print(f"AA测试:p={p_aa:.4f} ({'通过'if p_aa>0.05 else '失败'} - 应>0.05)")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
本课是第20课:A/B测试,属于评估与优化阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:实现贝叶斯A/B测试(替代频率学派方法)
练习2:实现分层实验(方差减少)
练习3:实现多臂老虎机A/B测试(替代固定分流)
练习4:实现交叉实验(多个因素同时测试)
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解A/B测试的原理与统计基础
✅ 掌握统计显著性和样本量计算
✅ 理解A/B测试的常见陷阱
✅ 设计合理的推荐系统A/B测试方案
💡 关键提示:A/B测试是推荐系统效果验证的最终环节和金标准。任何算法改动都应该通过严谨的A/B测试验证后再全量上线。良好的实验文化、规范的分流机制、完善的监控体系,是推荐系统持续迭代优化的基础。切记:没有A/B测试验证的优化都是主观臆断。