4、排序与推荐评价:NDCG、MAP、MRR、AUC-ROC曲线、AUC-PR曲线
排序和推荐系统的评价,说白了就是回答一个问题:「好东西有没有排到前面?」
我刚开始做推荐时,总觉得只要把用户可能喜欢的东西推出去就行。后来发现,推出去和排好序完全是两码事。你想想看,用户只盯着前几个结果看,排在第十位的再好也白搭。所以,我们需要一套专门衡量「排序质量」的指标。
这一章,我会把排序评价里最常用的几个指标掰开揉碎讲清楚。包括 NDCG、MAP、MRR,以及两个分类评价但同样适用于排序场景的曲线:AUC-ROC 和 AUC-PR。
4.1 排序评价的核心逻辑
先理清一个概念:排序评价和分类评价有什么不同?
| 维度 | 分类评价 | 排序评价 |
|---|---|---|
| 关注点 | 预测是否准确 | 相关项是否靠前 |
| 典型指标 | 准确率、召回率、F1 | NDCG、MAP、MRR |
| 对位置敏感 | 否 | 是 |
| 对顺序敏感 | 否 | 是 |
说白了,分类评价只看「对不对」,排序评价还要看「位置好不好」。举个例子:搜索结果里,用户想要的那篇文档排在第一位和排在第十位,体验天差地别。排序指标就是用来量化这种差别的。
4.2 MRR:只看第一个正确答案
MRR(Mean Reciprocal Rank,平均倒数排名) 是最直观的排序指标之一。它的逻辑很简单:对于每个查询,找到第一个相关结果的位置,取倒数,然后对所有查询求平均。
公式长这样:
MRR = (1/N) * Σ (1 / rank_i)
其中 rank_i 是第 i 个查询中第一个相关结果的位置。
举个例子:
- 查询 A:第一个相关结果在第 2 位 → 得分 1/2 = 0.5
- 查询 B:第一个相关结果在第 1 位 → 得分 1/1 = 1.0
- 查询 C:第一个相关结果在第 5 位 → 得分 1/5 = 0.2
MRR = (0.5 + 1.0 + 0.2) / 3 ≈ 0.567
4.3 MAP:考虑所有相关结果
MAP(Mean Average Precision,平均精度均值) 比 MRR 更全面。它不光看第一个,而是把所有相关结果的位置都考虑进去。
计算分两步:
- 对每个查询,计算 Average Precision(AP)
- 对所有查询的 AP 求平均,得到 MAP
AP 的计算方式:
AP = (1 / R) * Σ (P@k * rel(k))
其中 R 是相关结果总数,P@k 是前 k 个结果中的精度,rel(k) 表示第 k 个结果是否相关(1 或 0)。
举个例子:假设某个查询有 3 个相关结果,排序结果如下:
- 位置 1:相关 → P@1 = 1/1 = 1.0
- 位置 2:不相关 → 不计
- 位置 3:相关 → P@3 = 2/3 ≈ 0.67
- 位置 4:不相关 → 不计
- 位置 5:相关 → P@5 = 3/5 = 0.6
AP = (1.0 + 0.67 + 0.6) / 3 ≈ 0.756
4.4 NDCG:带权重的排序评价
NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益) 是我个人最常用的排序指标。它有几个优点:
- 支持多级相关性(不只是相关/不相关)
- 位置越靠后,权重越低(折损)
- 归一化后方便跨查询比较
计算步骤:
- 计算 DCG:DCG@k = Σ (2^rel_i - 1) / log2(i + 1)
- 计算 IDCG:理想情况下的 DCG(按相关性从高到低排序)
- NDCG@k = DCG@k / IDCG@k
举个例子:假设有 5 个结果,相关性评分分别为 [3, 2, 0, 1, 0]:
DCG@5 = (2^3-1)/log2(2) + (2^2-1)/log2(3) + (2^0-1)/log2(4) + (2^1-1)/log2(5) + (2^0-1)/log2(6)
= 7/1 + 3/1.585 + 0/2 + 1/2.322 + 0/2.585
= 7.0 + 1.89 + 0 + 0.43 + 0
= 9.32
IDCG(理想排序 [3, 2, 1, 0, 0]):
IDCG@5 = 7/1 + 3/1.585 + 1/2 + 0/2.322 + 0/2.585
= 7.0 + 1.89 + 0.5 + 0 + 0
= 9.39
NDCG@5 = 9.32 / 9.39 ≈ 0.993
4.5 AUC-ROC 与 AUC-PR:从分类到排序
这两个指标原本是分类评价用的,但也能用来衡量排序质量。为什么?因为排序本质上是在给每个样本打分,然后按分数排序。如果正样本的分数普遍高于负样本,说明排序好。
AUC-ROC:关注正负样本的排序关系
AUC-ROC(Area Under the Receiver Operating Characteristic curve) 衡量的是:随机选一个正样本和一个负样本,正样本排在负样本前面的概率。
取值范围:[0.5, 1],0.5 表示随机排序,1 表示完美排序。
优点:
- 对样本不平衡不敏感
- 直观易懂
缺点:
- 只关心排序关系,不关心具体分数
- 在正样本极少时可能过于乐观
AUC-PR:关注正样本的排序质量
AUC-PR(Area Under the Precision-Recall curve) 是 Precision-Recall 曲线下的面积。它更关注正样本的排序质量。
取值范围:[0, 1],越大越好。
优点:
- 对正样本的排序更敏感
- 适合正样本极少的场景(比如异常检测、点击率预测)
缺点:
- 受样本不平衡影响大
- 不同数据集之间不可比
| 指标 | 关注点 | 对不平衡敏感 | 适用场景 |
|---|---|---|---|
| AUC-ROC | 正负样本整体排序 | 不敏感 | 通用排序评价 |
| AUC-PR | 正样本排序质量 | 敏感 | 正样本极少的场景 |
4.6 核心知识结构图
下面这张图帮你理清这几个指标的关系和适用场景:
4.7 如何选择指标?
不同场景适合不同的指标。我整理了一个选择指南:
| 场景 | 推荐指标 | 原因 |
|---|---|---|
| 问答系统(只有一个正确答案) | MRR | 只关心第一个答案的位置 |
| 文档检索(多个相关文档) | MAP | 考虑所有相关文档的位置 |
| 推荐系统(多级相关性) | NDCG | 支持多级评分,位置折损合理 |
| 通用排序质量评估 | AUC-ROC | 不依赖截断位置,整体评估 |
| 正样本极少的排序 | AUC-PR | 对正样本排序更敏感 |
4.8 实践中的注意事项
最后分享几个我在项目中踩过的坑:
- 标注质量决定指标上限:相关性标注不准,再好的指标也是白搭。我见过一个项目,NDCG 从 0.6 提到 0.9,结果只是标注标准变了。
- 截断位置要合理:NDCG@100 在大多数场景没有意义,用户根本看不到那么后面。我习惯用 NDCG@10 和 NDCG@20。
- 指标之间可能矛盾:AUC-ROC 高但 NDCG 低,说明模型对整体排序好但对头部排序差。这时候要优先优化头部。
- 离线指标不等于线上效果:离线指标提升 10%,线上可能没变化。我一般把离线指标当作「筛选器」,过了阈值才上 A/B 测试。
嗯,排序评价就讲到这里。这些指标看起来多,但核心逻辑就一条:好东西要排到前面去。理解了这一点,剩下的就是选对指标、算对数值、持续优化。