做推荐系统时,一个很常见的问题是:模型到底该怎么评估?
如果只是看 loss,往往是不够的。因为推荐系统真正关心的通常不是“概率有没有拟合好”,而是:
- 正样本能不能被排到前面
- 用户真正感兴趣的 item 能不能被召回
- 前几个推荐位里有没有足够多的好结果
所以推荐系统的评估指标,很多时候本质上是在回答两个问题:
- 模型能不能把正样本排在负样本前面
- 模型能不能把用户真正想看的内容放到 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 更高,但覆盖率变差
所以评估的关键,不只是“哪个指标高”,而是:
- 这个指标是否真的对应你当前业务阶段的目标