声明
内容摘自:项亮,《推荐系统实战》。侵删。
推荐效果的离线评估
现阶段有三类评估推荐效果的方法:离线实验、用户调查、在线实验。本文主要是基于离线实验阐述一些具体的方法。
记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∈U?R(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)
|