推荐系统评测
什么才是好的推荐系统?这是推荐系统需要解决的首要问题。一个完整的推荐系统一般存在3个参与方:用户、物品系统者和提供推荐系统的网站。
推荐系统的实验方法
在介绍推荐系统的指标之前,首先看一下获取这些指标的主要实验方法。主要有3种:即离线实验、用户调查和在线实验
1.离线实验 离线实验的方法一般由如下几个步骤组成 (1)通过日志系统获取用户行为数据,并按照一定格式生成一个标准的数据集 (2)将数据集按照一定的规则分成训练集和测试集 (3)在训练集上训练用户兴趣模型,在测试集上进行预测 (4)通过离线标准评测算法在测试机上的预测结果 缺点是无法获取商业上的指标,并且离线实验和商业指标上存在差距。
2.用户调查
用户调查是需要一些真实的用户,在推荐系统上完成一些任务,根据他们的答案和行为了解系统的性能。可以完成离线时没有办法评测的用户的主观感受,因为高预测率并不等于高用户满意度。但是这种方式成本比较高,同时还要保证样本用户的可靠性。
3.在线实验
在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试,将它和旧的算法进行比较。AB测试的优点是可以公平获得不同算法实际在线时的性能指标,包括商业上关注的指标。AB测试的缺点主要是周期比较长,必须进行长期的实验才能得到可靠的结果。因此一般不会用AB测试测试所有的算法,而只是用它测试那些在离线实验和用户调查中表现很好的算法。 一般来说,一个新的推荐算法最终上线,需要完成上面所说的3个实验。
首先,需要通过离线实验证明它在很多离线指标上优于现有的算法。
然后,需要通过用户调查确定它的用户满意度不低于现有的算法。
最后,通过在线的AB测试确定它在我们关心的指标上优于现有的算法。
评测指标
评测指标可用于评价推荐系统各方面的性能
1.用户满意度
用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标。但是,用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
用户调查获得用户满意度主要是通过调查问卷的形式。用户对推荐系统的满意度分为不同的层次。GroupLens曾经做过一个论文推荐系统的调查问卷,该问卷的调查问题是请问下面哪 句话最能描述你看到推荐结果后的感受?
推荐的论文都是我非常想看的。
推荐的论文很多我都看过了,确实是符合我兴趣的不错论文。
推荐的论文和我的研究兴趣是相关的,但我并不喜欢。
不知道为什么会推荐这些论文,它们和我的兴趣丝毫没有关系。
由此可以看出,这个调查问卷不是简单地询问用户对结果是否满意,而是从不同的侧面询问用户对结果的不同感受。比如,如果仅仅问用户是否满意,用户可能心里认为大体满意,但是对某个方面还有点不满,因而可能很难回答这个问题。因此在设计问卷时需要考虑到用户各方面的感受,这样用户才能针对问题给出自己准确的回答。
在在线系统中,用户满意度主要通过一些对用户行为的统计得到。比如在电子商务网站中,用户如果购买了推荐的商品,就表示他们在一定程度上满意。因此,我们可以利用购买率度量用户的满意度。此外,有些网站会通过设计一些用户反馈界面收集用户满意度。
2.预测准确度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标,从推荐系统诞生的那一天起,几乎99%与推荐相关的论文都在讨论这个指标。这主要是因为该指标可以通过离线实验计算,方便了很多学术界的研究人员研究推荐算法。
一般我们的离线推荐算法有两个不同的方向,一个是评分预测,另一个是TopN推荐
- 评分预测
很多提供推荐服务的网站都有一个让用户给物品打分的功能。那么,如果知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。
评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。
def RMSE(records):
return math.sqrt(sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records])/float(len(records)))
def MAE(records):
return sum([abs(rui-pui) for u,i,rui,pui in records])/ float(len(records))
- TopN推荐
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
推荐结果的准确率定义为:
def PrecisionRecall(test, N):
hit = 0
n_recall = 0
n_precision = 0
for user, items in test.items():
rank = Recommend(user, N)
hit += len(rank & items)
n_recall += len(items)
n_precision += N
return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]
关于评分预测和TopN推荐的讨论:
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量
评分预测一直是推荐系统研究的热点,绝大多数推荐系统的研究都是基于用户评分数据的评分预测。这主要是因为,一方面推荐系统的早期研究组GroupLens的研究主要就是基于电影评分数据MovieLens进行的,其次,Netflix大赛也主要面向评分预测问题。因而,很多研究人员都将研究精力集中在优化评分预测的RMSE上。 对此,亚马逊前科学家Greg Linden有不同的看法。2009年, 他在Communications of the ACM网站发表了一篇文章 ,指出电影推荐的目的是找到用户最有可能感兴趣的电影,而不是预测用户看了电影后会给电影什么样的评分。因此,TopN推荐更符合实际的应用需求。也许有一部电影用户看了之后会给很高的分数,但用户看的可能性非常小。因此,预测用户是否会看一部电影,应该比预测用户看了电影后会给它什么评分更加重要。