本文为项亮《推荐系统实践》一书的学习笔记
用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
用户调查获得用户满意度主要是通过调查问卷的形式。
这个指标是最重要的推荐系统离线评测指标。
评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。
对于测试集中的一个用户u和物品i,令是用户u对物品i的实际评分,而
是推荐算法给出的预测评分
假设我们用一个列表records存放用户评分数据,令records[i] = [u, i, rui, pui],其中rui是用户u对物品i的实际评分,pui是算法预测出来的用户u对物品i的评分,那么下马的代码分别实现了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推荐。TopN推荐的预测准确率一般通过准确率(precision)和召回率(recall)度量。
令R(u)是根据用户在训练集上的行为给用户做出的推荐列表,而T(u)是用户在测试集上的行为列表。
比如有一个训练集为(苹果,香蕉,橘子,草莓,哈密瓜,西红柿,黄瓜),用户选中其中几样,以此训练,
测试集为(梨子,菠萝,龙眼,黑莓,白菜,冬瓜)
根据用户在训练集上的行为:
给用户做出的推荐列表为R(u) =(梨子,菠萝,龙眼),用户在测试集上的实际行为列表T(u) =(梨子,黑莓,白菜,冬瓜)
那么R(u)和T(u)的交集为1,R(u)=3,T(u)=4,故准确率为1/3,召回率为1/4
覆盖率(Coverage)描述一个推荐系统对物品长尾的发掘能力。最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。
假设系统的用户集合为U,总物品集合为I ,推荐系统给每个用户推荐一个长度为N的物品列表R(u):
可以通过研究物品在推荐列表中出现的次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率比较高,而如果这个分布比较陡峭,说明这个推荐系统的覆盖率比较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。
第一个是信息熵:
这里p(i)是物品i的流行度除以所有物品流行度之和。
第二个指标是基尼系数(Gini Index):
这里,是按照物品流行度p从小到大排序的物品列表中的第j个物品。
评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。
用户的兴趣是广泛的,一个经常看动漫的用户也可以喜欢其他类型的视频。为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域,即推荐结果需要具有多样性。
多样性描述了推荐列表中物品两两之间的不相似性。假设定义了物品i和物品j之间的相似度,那么用户u的推荐列表R(u)的多样性定义为:
而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。
评测新颖度最简单的方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。
惊喜度是指出乎用户意料的,推荐用户认知范围外的物品给用户且令用户满意。
目前没有什么公认的惊喜度的指标定义方式。
两个不同的信任系统,尽管推荐结果可能相同,但是用户可能会选择更让他信任的那个。比如京东和淘宝推荐同样的物品给用户,假如用户更多在淘宝上消费的话,用户可能会更倾向于使用淘宝推荐的物品。
在新闻类网站上,例如今日头条和微博,物品具有很强的实时性。比如一条新闻,系统需要第一时间推送给用户。推荐昨天的新闻显然不如推荐今天的新闻。
推荐系统的实时性包括两个方面。首先,推荐系统需要实时的更新推荐列表来满足用户新的行为变化。第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。
推荐系统会面对各种各样的作弊行为,针对推荐系统的规则来设计一些作弊行为,以此来攻击推荐系统。而健壮性是指衡量一个推荐系统抗击作弊的能力。
算法健壮性的评测主要利用模拟攻击。
在实际的系统中,提高系统的健壮性,除了选择健壮性高的算法,还有以下方法。
1. 设计推荐系统时尽量使用代价比较高的用户行为。如在用户的购买行为和浏览行为中,显然购买行为的代价更高。
2. 在使用数据时,进行攻击检测,从而对数据进行清理。