Recall(召回率)是用于评估推荐系统性能的一种常见指标
Recall(召回率)是指在所有实际有交互的用户 - 物品对中,推荐系统成功预测出的比例。具体来说,设所有有交互的用户 - 物品对为S,推荐系统预测出的用户 - 物品对为T,则Recall的计算公式为:
r e c a l l = ∣ T ∩ S ∣ ∣ S ∣ recall = \frac{|T \cap S|}{|S|} recall=∣S∣∣T∩S∣
∣ T ∩ S ∣ |T \cap S| ∣T∩S∣ 代表推荐系统预测出的推荐列表和用户真实交互列表的交集个数, ∣ S ∣ |S| ∣S∣ 代表用户有交互过物品的个数,说白了这个指标衡量的是:用户真正喜欢的物品,推荐系统最终能够推荐出来的数目有多少。
这个值是越大越好,也就是希望推荐系统推荐的列表和用户真正喜欢的物品列表尽可能重叠,把用户喜爱的物品从候选池中全部找出来。
为了更明确说明,接下来给出一个具体实例,附加详细代码讲解基于User-Item的召回率如何计算:
def recall(uids, predictions, topk, test_labels):
user_num = 0 # 用户数量
all_recall = 0 # 记录总的召回率
# 分别计算每个用户的召回率
for i in range(len(uids)):
uid = uids[i] # 获得用户的id
prediction = list(predictions[i][:topk]) # 获取推荐给该用户的物品的TopK
label = test_labels[uid] # 该用户的真实喜欢的物品
if len(label) > 0: # 只考虑有历史交互的用户
hit = 0 # 记录召回的物品数量
for item in label:
if item in prediction: # 如果用户喜爱的物品被找回
hit += 1 # 召回的物品数量加 1
all_recall = all_recall + hit / len(label) # 累加每个用户的召回率
user_num += 1 # 用户个数加 1
return all_recall / user_num # 返回平均召回率
- uids:测试用户的userId,是一个集合,指明需要计算哪些用户的召回率,形状为【n,】,样例:【293,4,62,23,841】
- predictions:用户的预测值,也就是给每个用户推荐的物品的id,形状为【n,m】,第一个维度代表用户个数,第二个维度代表物品个数,预测值已经按照分数从大到小进行排序
- topk:给用户推荐物品的个数,从predictions中选择topK个物品作为最终的推荐列表
- test_labels:用户真实的交互记录,是一个二维列表,每个列表保存每个用户与物品的交互,比如test_labels[23]就是取出user23喜欢的物品列表。