0%

推荐系统的常见评估指标

做推荐系统时,一个很常见的问题是:模型到底该怎么评估?

如果只是看 loss,往往是不够的。因为推荐系统真正关心的通常不是“概率有没有拟合好”,而是:

  • 正样本能不能被排到前面
  • 用户真正感兴趣的 item 能不能被召回
  • 前几个推荐位里有没有足够多的好结果

所以推荐系统的评估指标,很多时候本质上是在回答两个问题:

  1. 模型能不能把正样本排在负样本前面
  2. 模型能不能把用户真正想看的内容放到 Top-K

下面是推荐系统里常见的几类指标。

Precision, Recall

Precision 和 Recall 是最基础的一组指标。它们最常出现在召回阶段或者 Top-K 推荐评估里。

先约定几个量:

  • TP:真正例,推荐了且用户确实喜欢
  • FP:假正例,推荐了但用户不喜欢
  • FN:假负例,没有推荐但用户其实喜欢

Precision

Precision 关注的是:

  • 你推荐出去的东西里,有多少是真的对的

公式为:

$$
\mathrm{Precision} = \frac{TP}{TP + FP}
$$

例如给一个用户推荐了 10 个商品,其中 4 个是他真正点击或购买的,那么:

$$
\mathrm{Precision} = \frac{4}{10} = 0.4
$$

在推荐系统里,Precision 高说明:

  • 推荐结果更“准”
  • 暴露出去的位置浪费更少

但它也有局限,因为它不关心你漏掉了多少用户真正喜欢的内容。

Recall

Recall 关注的是:

  • 用户真正感兴趣的东西里,你找回来了多少

公式为:

$$
\mathrm{Recall} = \frac{TP}{TP + FN}
$$

例如某个用户一共会喜欢 20 个 item,但你的系统只召回了其中 6 个,那么:

$$
\mathrm{Recall} = \frac{6}{20} = 0.3
$$

在推荐系统里,Recall 尤其适合评估召回层,因为召回阶段的目标本来就不是特别精准,而是先尽量不要漏掉好东西。

Precision@K 和 Recall@K

在实际推荐里,我们通常更关心前 $K$ 个结果,所以常写成:

$$
\mathrm{Precision@K} = \frac{\mathrm{Hits@K}}{K}
$$

$$
\mathrm{Recall@K} = \frac{\mathrm{Hits@K}}{\mathrm{Relevant}}
$$

例如用户真实喜欢的 item 有 5 个,模型给出的 Top-10 里命中了 3 个,那么:

$$
\mathrm{Precision@10} = \frac{3}{10}
$$

$$
\mathrm{Recall@10} = \frac{3}{5}
$$

可以看到:

  • Precision@K 更关心“前 K 个准不准”
  • Recall@K 更关心“前 K 个够不够全”

AUC, F1

这一组指标更常出现在 CTR 预估、点击预测、二分类推荐任务里。

AUC

AUC 的全称是 Area Under ROC Curve。它衡量的是:

  • 随机抽一个正样本和一个负样本
  • 模型把正样本排在负样本前面的概率有多大

如果记正样本得分为 $s^+$,负样本得分为 $s^-$,那么 AUC 可以理解为:

$$
\mathrm{AUC} = P(s^+ > s^-)
$$

这个解释非常适合推荐系统,因为很多推荐任务本质上就是排序任务。

例如:

  • 点击样本应该比未点击样本得分更高
  • 购买样本应该比曝光未购买样本得分更高

AUC 的优点是:

  • 不依赖具体阈值
  • 更关注整体排序能力
  • 对类别不平衡通常比 Accuracy 更稳

所以在 CTR 预估里,AUC 往往比 Accuracy 更常见。

不过 AUC 也有明显局限:

  • 它衡量的是整体排序
  • 但不特别关注 Top-K 位置

也就是说,一个模型 AUC 很高,不代表它前几个推荐位一定最好。

F1

F1 是 Precision 和 Recall 的调和平均,用来平衡“查得准”和“查得全”。

公式为:

$$
F1 = \frac{2 \cdot \mathrm{Precision} \cdot \mathrm{Recall}}{\mathrm{Precision} + \mathrm{Recall}}
$$

如果 Precision 很高但 Recall 很低,或者反过来,F1 都不会太高。

例如:

$$
\mathrm{Precision} = 0.8,\quad \mathrm{Recall} = 0.4
$$

那么:

$$
F1 = \frac{2 \times 0.8 \times 0.4}{0.8 + 0.4} = 0.533
$$

F1 的意义是:

  • 不希望模型只顾着精准,结果漏掉大量正样本
  • 也不希望模型只顾着召回,结果引入大量噪声

不过在推荐系统里,F1 没有 AUC、NDCG 那么常用。因为推荐更常见的是排序问题,而 F1 更像是一个固定阈值下的分类指标。

NDCG

NDCG 是推荐系统和搜索排序里非常常见的排序指标。它特别适合回答一个问题:

  • 相关 item 不只是“有没有排进去”
  • 而是“有没有排在足够靠前的位置”

DCG

DCG 的全称是 Discounted Cumulative Gain。它的思想是:

  • 排名越靠前,贡献越大
  • 排名越靠后,价值要打折

如果第 $i$ 个位置的相关性记作 $\mathrm{rel}_i$,那么 DCG 可以写成:

$$
\mathrm{DCG@K} = \sum_{i=1}^{K} \frac{2^{\mathrm{rel}_i} - 1}{\log_2(i+1)}
$$

这里的分母 $\log_2(i+1)$ 就是在做位置折损。

如果相关性是二值的,也就是:

  • 相关记作 1
  • 不相关记作 0

那么公式会退化成更简单的形式。

IDCG

不同用户的相关 item 数量可能不同,所以单独看 DCG 不方便横向比较。于是需要一个“理想排序”下的 DCG,记作 IDCG:

$$
\mathrm{IDCG@K} = \sum_{i=1}^{K} \frac{2^{\mathrm{rel}_i^*} - 1}{\log_2(i+1)}
$$

其中 $\mathrm{rel}_i^*$ 表示理想排序下第 $i$ 个位置的相关性。

NDCG

NDCG 就是把 DCG 归一化:

$$
\mathrm{NDCG@K} = \frac{\mathrm{DCG@K}}{\mathrm{IDCG@K}}
$$

这样它的取值通常在 $[0,1]$ 之间,越接近 1 越好。

NDCG 的优点非常适合推荐排序:

  • 它关注位置,前面的错排惩罚更大
  • 它允许相关性有等级,不一定只能是 0/1
  • 它适合评估 Top-K 排序质量

例如:

  • 点击、加购、购买可以赋予不同相关性等级
  • 同样命中 3 个正样本,排在第 1、2、3 位显然比排在第 8、9、10 位更好

这正是 NDCG 想表达的东西。

MRR

MRR 的全称是 Mean Reciprocal Rank。它特别关注:

  • 第一个正确结果出现得有多靠前

先定义某个用户的第一个相关结果的排名为 $\mathrm{rank}_u$,那么该用户的倒数排名为:

$$
\mathrm{RR}_u = \frac{1}{\mathrm{rank}_u}
$$

对所有用户取平均,就得到 MRR:

$$
\mathrm{MRR} = \frac{1}{|U|}\sum_{u \in U}\frac{1}{\mathrm{rank}_u}
$$

例如:

  • 如果第一个正确结果排第 1 位,那么 RR = 1
  • 如果排第 2 位,那么 RR = 0.5
  • 如果排第 10 位,那么 RR = 0.1

MRR 很适合下面这类场景:

  • 用户通常只会点第一个最相关结果
  • 系统更关心“第一个命中出现得够不够早”

比如:

  • 问答系统
  • 搜索建议
  • 单目标检索

但在推荐系统里,如果我们关心的是“前 20 个里整体好不好”,那 NDCG 往往比 MRR 更合适。因为 MRR 只看第一个相关结果,后面的命中不会继续加分。

不同指标怎么选

推荐系统里没有哪个指标是“万能”的,关键看你评估的是哪一层。

1. 召回阶段

更常看:

  • Recall@K
  • Precision@K

因为召回层的重点是:

  • 不要漏掉太多好 item
  • 在有限候选数里尽量保留有效结果

2. 排序阶段

更常看:

  • NDCG@K
  • MRR
  • AUC

其中:

  • NDCG@K 适合看整体 Top-K 排序质量
  • MRR 适合看第一个命中位置
  • AUC 适合看整体 pairwise 排序能力

3. CTR 预估或二分类任务

更常看:

  • AUC
  • LogLoss
  • F1

其中 AUC 最常见,因为它不依赖阈值,而且在样本极不平衡时通常更稳。

一个直观总结

可以把这些指标粗略理解成下面几类:

  • Precision:推荐出去的东西有多准
  • Recall:用户喜欢的东西找回来了多少
  • F1:Precision 和 Recall 的平衡
  • AUC:整体排序能力强不强
  • NDCG:前排位置排得好不好
  • MRR:第一个正确结果出现得早不早

如果只记一句话,那么可以记成:

  • 召回看 Recall@K
  • 排序看 NDCG@K
  • CTR 看 AUC

当然,真实系统里通常不会只看一个指标,而是会把多个指标放在一起看。因为一个模型可能:

  • AUC 更高,但 Top-K 更差
  • Recall 更高,但 Precision 明显下降
  • NDCG 更高,但覆盖率变差

所以评估的关键,不只是“哪个指标高”,而是:

  • 这个指标是否真的对应你当前业务阶段的目标