推荐系统实践 0x03 评测指标
评测指标
评测指标可以评测推荐系统各个方面的性能,有些是可以定量计算的,而有些只能定性描述。有些可以通过离线实验计算,有些需要通过用户调查获得,还有些只能在线评测。接下来我们将对各个评测指标进行介绍。
用户满意度
用户满意度无法进行离线计算,只能通过用户调查以及在线实验获得。如果是在线实验当中,可以通过用户购买推荐商品的购买率对用户满意度进行度量。或者使用“满意”、“不满意”的按钮进行反馈。一般情况下,我们可以通过点击率、用户停留时间和转化率等指标度量用户的满意度。
预测准确度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标。预测准确度通过在训练集上建立用户的行为和兴趣模型预测用户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。预测准确度有各种不同的研究方向,也就有不同的预测准确度指标。
评分预测
预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。 评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。测试集中物品\(u\)和用户\(i\),以及用户\(i\)对物品\(u\)的评分为\(r_{ui}\),预测的评分为\(\hat{r}_{ui}\)。那么均方根误差RMSE计算为
平均绝对误差(MAE)公式为
我们用records来记录用户、物品、真实评分和预测评分,用比较简单的代码来表示RMSE为
def RMSE(records):
return math.sqrt(\sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records]) / float(len(records)))
用代码表示MAE为
def MAE(records):
return sum([abs(rui-pui) for u,i,rui,pui in records])/ float(len(records))
值得一提的是,关于RMSE和MAE这两个指标的优缺点, Netflix认为RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。研究表明,如果评分系统是基于整数建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差。
TopN推荐
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)或者召回率(recall)度量。
令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)]
覆盖率
覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。覆盖率是一个内容提供商会关心的指标。一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。需要统计推荐列表中不同物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。
在信息论和经济学中有两个著名的指标可以用来定义覆盖率。 这里\(p(i)\)是物品\(i\)的流行度除以所有物品流行度之和。可以简单认为是物品\(i\)出现的概率或者频率。
物品的流行度指对物品产生过行为的用户总数。这里作者竟然放到了后面一章进行解释。
第一个是信息熵:
第二个就是基尼指数:
用代码来写就是
def GiniIndex(p):
j=1
n = len(p)
G = 0
for item, weight in sorted(p.items(), key=itemgetter(1)):
G += (2 * j - n - 1) * weight
return G / float(n - 1)
基尼系数用来刻画系统对物品的流行度是否平均,如果物品的流行度很平均,那么基尼系数就会越小,如果物品流行度相差很大,那么基尼系数就会很大。基尼系数也是用来刻画马太效应的指标,即所谓强者更强,弱者更弱的效应。热门的物品会更加热门,冷门的物品也会就会更加冷门。
如果推荐算法的计算出来的物品流行度的基尼系数要大于原本用户行为中物品流行度的基尼系数,那么也就是说推荐算法具有马太效应。
多样性
为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴 趣领域,即推荐结果需要具有多样性。如果我们使用\(s(i,j)\)来代表物品\(i\)和物品\(j\)的相似度。那么用户\(u\)的推荐列表多样性定义为
这里稍微说一下我对这个公式的理解,分数线上方是两两物品的相似性的总和,分数线下方是从所有物品中任意取两个的组合数,再用1减去这个相似性的公式就得到了多样性的公式。
再对所有用户的推荐列表多样性取平均就是推荐系统的多样性。不同的物品相似度度量函数\(s(i,j)\)可以定义不同的多样性。
新颖性
新颖的推荐不应该给用户推荐那些他们已经看过、打过分或者浏览过的视频。评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。
用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。
惊喜度
惊喜度是什么,又和新颖度有什么区别呢。新颖度通常存在用户已知的某些物品和结果,与历史兴趣相关联,如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。是一种定性的度量。提高推荐惊喜度需要提高推荐结果的用户满意度,同时降低推荐结果和用户历史兴趣的相似度。目前惊喜度获得了学术界的部分讨论,但是仍然不够成熟,这里也就不展开细说。
信任度
如果用户信任推荐系统,那就会增加用户和推荐系统的交互。在实际的业务场景当中,同样的推荐结果,以让用户信任的方式推荐给用户就更能让用户产生购买欲, 而以类似广告形式的方法推荐给用户就可能很难让用户产生购买的意愿。想要提高用户对系统的信任度,首先要提高系统的透明度,也就是提供一些推荐解释、利用好友的一些行为信息再解释等等。
实时性
有些物品,如微博、新闻等具有很强的时效性,需要在物品还具有时效 性时就将它们推荐给用户。实时性的表现有两个方面:
- 推荐系统需要实时地更新推荐列表来满足用户新的行为变化。如在购买新的硬件之后能够立即推荐相应的配件信息。
- 能够将新加入系统的物品推荐给用户。体现了推荐系统处理物品的冷启动能力。
健壮性
健壮性指标衡量了一个推荐系统抗击作弊的能力。算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。
除了选择健壮性高的推荐算法外,还有
- 设计推荐系统时尽量使用代价比较高的用户行为
- 在使用数据前,进行攻击检测,从而对数据进行清理
总结
离线实验 | 调查问卷 | 在线实验 | |
---|---|---|---|
用户满意度 | x | √ | o |
预测准确度 | √ | √ | x |
覆盖率 | √ | √ | √ |
多样性 | o | √ | o |
新颖性 | o | √ | o |
惊喜度 | x | √ | x |
测评维度
- 用户维度
主要包括用户的人口统计学信息、活跃度以及是不是新用户等。 - 物品维度
包括物品的属性信息、流行度、平均分以及是不是新加入的物品等。 - 时间维度
包括季节,是工作日还是周末,是白天还是晚上等。
文章转载请注明出处,喜欢文章的话请我喝一杯咖啡吧!在右边赞助里面哦!谢谢! NoMornings.