声明推荐效果的离线评估
召回率:准确率:覆盖率
声明内容摘自:项亮,《推荐系统实战》。侵删。
推荐效果的离线评估现阶段有三类评估推荐效果的方法:离线实验、用户调查、在线实验。本文主要是基于离线实验阐述一些具体的方法。
记R(u)为对用户u推荐的N个物品,记T(u)为用户喜爱/点击了的物品,那么做推荐系统的精度为。
召回率:R e c a l l = ∑ N ∣ R ( u ) ∩ T ( u ) ∣ ∑ N ∣ T ( u ) ∣ Recall= frac{sum_{N}|R(u) cap T(u)|}{sum_{N}|T(u)|} Recall=∑N∣T(u)∣∑N∣R(u)∩T(u)∣
准确率:P r e c i s i o n = ∑ N ∣ R ( u ) ∩ T ( u ) ∣ ∑ N ∣ R ( u ) ∣ Precision= frac{sum_{N}|R(u) cap T(u)|}{sum_{N}|R(u)|} Precision=∑N∣R(u)∣∑N∣R(u)∩T(u)∣
根据公式,召回率描述的是有多少比例的用户—物品评分记录包含在最终的推荐列表中,而准确率描述的是最终的推荐列表中有多少比例是发生过的用户—物品评分记录。
下面给出两种评测方法的代码(python):
# 召回率 def Recall(train, test, N): hit = 0 all = 0 for user in train.keys(): tu = test[user] rank = GetRecommendation(user, N) for item, pui in rank: if item in tu: hit += 1 all += len(tu) # 区别在这行 return hit / (all * 1.0) # 准确率 def Precision(train, test, N): hit = 0 all = 0 for user in train.keys(): tu = test[user] rank = GetRecommendation(user, N) for item, pui in rank: if item in tu: hit += 1 all += N # 区别在这行 return hit / (all * 1.0)覆盖率
除了评测推荐算法的精度,很多推荐系统还会计算算法的覆盖率(反映了推荐算法发掘长尾的能力),覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。
C
o
v
e
r
a
g
e
=
∣
U
u
∈
U
R
(
u
)
∣
∣
I
∣
Coverage= frac{|U_{u in U}R(u) |}{|I|}
Coverage=∣I∣∣Uu∈UR(u)∣
如果所有的物品都被推荐给至少一个用户,那么覆盖率就是100%。
下面给出代码(python):
# 覆盖率 def Coverage(train, test, N): recommend_items = set() all_items = set() for user in train.keys(): for item in train[user].keys(): all_items.add(item) rank = GetRecommendation(user, N) for item, pui in rank: recommend_items.add(item) return len(recommend_items) / (len(all_items) * 1.0)



