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

我的经验:MRR 适合「只有一个正确答案」的场景,比如问答系统、导航搜索。我在做智能客服时就用 MRR 来评估——用户问「怎么退款」,第一个回答是不是退款流程?如果是,体验就好。但 MRR 有个硬伤:它只关心第一个,后面的相关结果再好也不管。

4.3 MAP:考虑所有相关结果

MAP(Mean Average Precision,平均精度均值) 比 MRR 更全面。它不光看第一个,而是把所有相关结果的位置都考虑进去。

计算分两步:

  1. 对每个查询,计算 Average Precision(AP)
  2. 对所有查询的 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

避坑指南:我曾经在一个文档检索项目里直接用 MAP,结果发现指标很高但用户反馈很差。后来排查发现,MAP 对「相关结果总数」非常敏感。如果标注的相关结果太少,AP 会被少数几个好位置拉得很高,掩盖了整体排序质量。所以,使用 MAP 前一定要确认标注的完整性。

4.4 NDCG:带权重的排序评价

NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益) 是我个人最常用的排序指标。它有几个优点:

  • 支持多级相关性(不只是相关/不相关)
  • 位置越靠后,权重越低(折损)
  • 归一化后方便跨查询比较

计算步骤:

  1. 计算 DCG:DCG@k = Σ (2^rel_i - 1) / log2(i + 1)
  2. 计算 IDCG:理想情况下的 DCG(按相关性从高到低排序)
  3. 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
关键点:NDCG 的值域是 [0, 1],越接近 1 说明排序越接近理想排序。实际项目中,NDCG@10 和 NDCG@20 是最常用的截断位置,因为用户很少翻到第 20 页以后。

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 正样本排序质量 敏感 正样本极少的场景
我的建议:在推荐系统中,我通常同时看 AUC-ROC 和 AUC-PR。如果 AUC-ROC 高但 AUC-PR 低,说明模型对负样本排序很好,但对正样本的排序不够精准。这时候需要调整模型,让正样本的分数更突出。

4.6 核心知识结构图

下面这张图帮你理清这几个指标的关系和适用场景:

排序评价指标知识结构图 排序与推荐评价指标体系 排序评价指标 位置敏感指标 排序关系指标 多级相关性指标 MRR MAP AUC-ROC AUC-PR NDCG MRR 只关心第一个相关结果 适合问答、导航搜索 MAP 考虑所有相关结果 适合文档检索 NDCG 支持多级相关性 推荐系统首选 AUC-ROC vs AUC-PR ROC 看整体排序,PR 看正样本排序质量

4.7 如何选择指标?

不同场景适合不同的指标。我整理了一个选择指南:

场景 推荐指标 原因
问答系统(只有一个正确答案) MRR 只关心第一个答案的位置
文档检索(多个相关文档) MAP 考虑所有相关文档的位置
推荐系统(多级相关性) NDCG 支持多级评分,位置折损合理
通用排序质量评估 AUC-ROC 不依赖截断位置,整体评估
正样本极少的排序 AUC-PR 对正样本排序更敏感
核心原则:没有万能指标。我一般会同时看 2-3 个指标,从不同角度评估排序质量。比如推荐系统里,NDCG@10 看头部排序,AUC-ROC 看整体排序,两个一起用才能全面了解模型表现。

4.8 实践中的注意事项

最后分享几个我在项目中踩过的坑:

  • 标注质量决定指标上限:相关性标注不准,再好的指标也是白搭。我见过一个项目,NDCG 从 0.6 提到 0.9,结果只是标注标准变了。
  • 截断位置要合理:NDCG@100 在大多数场景没有意义,用户根本看不到那么后面。我习惯用 NDCG@10 和 NDCG@20。
  • 指标之间可能矛盾:AUC-ROC 高但 NDCG 低,说明模型对整体排序好但对头部排序差。这时候要优先优化头部。
  • 离线指标不等于线上效果:离线指标提升 10%,线上可能没变化。我一般把离线指标当作「筛选器」,过了阈值才上 A/B 测试。

嗯,排序评价就讲到这里。这些指标看起来多,但核心逻辑就一条:好东西要排到前面去。理解了这一点,剩下的就是选对指标、算对数值、持续优化。