推荐系统评估是确保模型实际效果的关键环节。本章重点介绍了**离线评估**和**在线A/B测试**两大评估方法。核心概念包括:1)**排序问题的独特性**,即关注前N个结果的准确性,并需考虑位置偏置和长期/短期指标冲突;2)**离线评估指标**,如准确度类指标(RMSE、MAE)、排序类指标(Precision@K、Recall@K、F1@K、MAP、NDCG@K、MRR)以及多样性、覆盖率、新颖度等;3)**在线A/B测试的必要性**,因为离线指标提升不代表在线效果提升,且需规避新奇效应、幸存者偏差、SRM和辛普森悖论等陷阱。掌握这些内容后,读者能够设计合理的评估方案,选择合适的指标,并有效实施A/B测试,从而全面评估推荐系统的性能,避免过度关注短期指标而忽视长期用户体验和系统公平性。
推荐系统评估:从离线指标到在线 A/B
训好了推荐模型, 怎么知道它真的好用?这一章拆解离线评估 + 在线 A/B 测试。
一、为什么评估这么难
推荐是个排序问题, 不是分类问题, 也不是回归问题:
- 关心的是"前 N 个结果排得对不对"
- 用户行为有位置偏置 (第一位置天然 CTR 高)
- 长期 vs 短期指标可能冲突 (推爆款短期 CTR 高, 长期用户疲劳)
二、离线评估:三大类指标
1. 准确度类 (Rating-based)
把推荐看成"预测评分", 用回归指标:
- RMSE: √(1/n × Σ(预测 - 真实)²)
- MAE: 1/n × Σ|预测 - 真实|
缺点: 实际推荐不关心"评分误差多大", 只关心"排得对不对"。
2. 排序类 (Ranking-based) ⭐ 重点
Top-K 推荐的指标, 工业界最常用:
Precision@K (前 K 个里命中比例)
Precision@K = \frac{推荐前 K 个中相关的数量}{K}
Recall@K (相关物品被召回的比例)
Recall@K = \frac{推荐前 K 个中相关的数量}{全部相关物品数}
F1@K (Precision + Recall 调和)
F1@K = \frac{2 \times P@K \times R@K}{P@K + R@K}
MAP (Mean Average Precision)
对每个用户计算 Average Precision (AP), 再求平均:
AP@K = \frac{1}{m} \sum_{k=1}^{K} Precision@k \times rel(k)
rel(k) = 1 如果第 k 个位置是相关物品, 否则 0。
NDCG@K (Normalized Discounted Cumulative Gain) ⭐ 工业界标配
核心思想: 排得越靠前的相关物品, 权重越大:
DCG@K = \sum_{k=1}^{K} \frac{rel(k)}{\log_2(k+1)}
NDCG@K = \frac{DCG@K}{IDCG@K}
IDCG 是理想排序的 DCG (用所有相关物品都排在最前面)。
优势: 考虑位置, 多档相关度 (评分 5 > 评分 3), 业界最常用。
MRR (Mean Reciprocal Rank)
第 1 个相关物品出现的位置的倒数:
MRR = \frac{1}{|U|} \sum_{u \in U} \frac{1}{rank_u}
适合场景: 找 1 个正确答案 (如搜索) 不太适合多结果推荐。
3. 多样性 / 覆盖率 / 新颖度
光看"准不准"不够, 还要看:
- 覆盖率 (Coverage): 推荐过的物品数 / 全量物品数
- 多样性 (Diversity): 推荐列表内物品两两不相似度
- 新颖度 (Novelty): 推用户没见过的物品的比例
- 基尼系数 (Gini): 衡量推荐是否过度集中头部
反例: 100% 准的推荐 = 反复推已知的爆款 → 信息茧房。
三、离线评估方法
Holdout 验证
按时间划分: 用 1-7 号数据训, 8 号数据测。
关键: 不能随机打乱! 未来不能预测过去。
时间交叉验证 (Time-based CV)
滚动窗口: 1-7 训 → 8 测, 2-8 训 → 9 测, 3-9 训 → 10 测。
from surprise.model_selection import KFold
kf = KFold(n_splits=5, random_state=42, shuffle=False) # 注意 shuffle=False
反事实评估 (Counterfactual)
Inverse Propensity Scoring (IPS):
实际只看到"曝光"的物品, 怎么估计未曝光的? 用倾向分数加权:
\hat{R} = \frac{1}{|U|} \sum_{u, i \in O} \frac{r_{ui}}{P(\text{exposure}|u, i)}
O 是曝光集, P 是曝光概率。
四、在线评估:A/B 测试
离线指标涨 ≠ 在线涨! 必须做 A/B。
标准流程
流量分桶: 1% 实验组 + 1% 对照组 + 98% 保留
↓
实验周期: 至少 7 天 (覆盖工作日 + 周末)
↓
核心指标: CTR / 留存 / 时长 / GMV
↓
显著性检验: p-value < 0.05
↓
全量发布: 通过 → 100% 流量
关键陷阱
- 新奇效应 (Novelty Effect): 用户因为"新"而点, 1 周后回归
- 幸存者偏差: 实验结束看数据, 流失用户没算
- SRM (Sample Ratio Mismatch): 流量分桶不均, 实验不可信
- 辛普森悖论: 分层看是 A 优, 整体看是 B 优
工业级 A/B 平台
- Google Optimize / Firebase: 小流量实验
- 自建分流: 一致性 hash, 用户 ID 路由
- Interleaving: 快速对比, A/B 结果的"小型版"
五、完整评估 checklist
- 离线 NDCG@10 / MAP@10 ≥ 基线 5%
- 覆盖率 / 多样性不退化
- 长尾物品能露出来
- A/B 实验 ≥ 7 天
- 核心业务指标正向
- 无 SRM / 新奇效应
- 反事实 (IPS) 验证
总结
推荐评估是多维的: 准 + 多样 + 公平 + 长期, 缺一不可。
光看 NDCG, 容易把推荐系统调成"只推爆款", 短期数据好, 长期用户走光。
章末小测验
检验你对《推荐系统评估》的掌握程度。
为什么 NDCG@K 比 Precision@K 更受推荐系统青睐?
推荐 A/B 测试关键陷阱中, '新奇效应'是指?