问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

推荐系统评测方法与指标详解

创作时间:
作者:
@小白创作中心

推荐系统评测方法与指标详解

引用
CSDN
1.
https://blog.csdn.net/CQ112617/article/details/144030064

推荐系统是现代互联网应用中不可或缺的一部分,从电影推荐到商品推荐,从新闻推荐到音乐推荐,推荐系统在提高用户体验和商业价值方面发挥着重要作用。然而,如何评估推荐系统的性能是一个复杂的问题。本文将详细介绍推荐系统的评测方法和指标,帮助读者全面了解推荐系统的效果评估。

1. 推荐系统实验方法

1.1 三种评测推荐效果的实验方法

1.1.1 离线实验

离线实验的方法一般由如下几个步骤构成:

  1. 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集;
  2. 将数据集按照一定的规则分成训练集和测试集;
  3. 在训练集上训练用户兴趣模型,在测试集上进行预测;
  4. 通过事先定义的离线指标评测算法在测试集上的预测结果。

1.1.2 用户调查

用户调查的优缺点也很明显。
优点是可以获得很多体现用户主观感受的指标,相对在线实验风险很低,出现错误后很容易弥补。
缺点是招募测试用户代价较大,很难组织大规模的测试用户,因此会使测试结果的统计意义不足。此外,在很多时候设计双盲实验非常困难,而且用户在测试环境下的行为和真实环境下的行为可能有所不同,因而在测试环境下收集的测试指标可能在真实环境下无法重现。

1.1.3 在线实验

在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试,将它和旧的算法进行比较。
AB测试的优点是可以公平获得不同算法实际在线时的性能指标,包括商业上关注的指标。AB测试的缺点主要是周期比较长,必须进行长期的实验才能得到可靠的结果。因此一般不会用AB测试测试所有的算法,而只是用它测试那些在离线实验和用户调查中表现很好的算法。

以下是AB测试的流程图

一般来说,一个新的推荐算法最终上线,需要完成上面所说的3个实验。

  • 首先,需要通过离线实验证明它在很多离线指标上优于现有的算法。
  • 然后,需要通过用户调查确定它的用户满意度不低于现有的算法。
  • 最后,通过在线的AB测试确定它在我们关心的指标上优于现有的算法。

1.2 评测指标

1.2.1 用户满意度

用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。

1.2.2 预测准确度指标

由于离线的推荐算法有不同的研究方向,因此下面将针对不同的研究方向介绍它们的预测准确度指标。

1.2.2.1 评分预测

评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。对于测试集中的一个用户u和物品i,令rui是用户u对物品i的实际评分,而r^ui是推荐算法给出的预测评分,那么RMSE的定义为:

RMSE = sqrt(∑u,i∈T|rui - r^ui| / |T|)

MAE采用绝对值计算预测误差,它的定义为:

RMAE = sqrt(∑u,i∈T|r^ui - rui| / |T|)

假设我们用一个列表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))
1.2.2.2 TopN推荐

网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:

推荐结果的准确率定义为:

下面的Python代码同时计算出了一个推荐算法的准确率和召回率:

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推荐的准确率和召回率,一般会选取不同的推荐列表长度N,计算出一组准确率/召回率,然后画出准确率/召回率曲线(precision/recall curve)

关于评分预测和TopN推荐的讨论

电影推荐的目的是找到用户最有可能感兴趣的电影,而不是预测用户看了电影后会给电影什么样的评分。因此,TopN推荐更符合实际的应用需求。也许有一部电影用户看了之后会给很高的分数,但用户看的可能性非常小。因此,预测用户是否会看一部电影,应该比预测用户看了电影后会给它什么评分更加重要。

1.2.2.3 覆盖率

覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:

覆盖率为100%的系统可以有无数的物品流行度分布。为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。第一个是信息熵:

这里p(i )是物品i的流行度除以所有物品流行度之和。

第二个指标是基尼系数(Gini Index):

这里,ij是按照物品流行度p()从小到大排序的物品列表中第j个物品。下面的代码可以用来计算给定物品流行度分布后的基尼系数:

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)

社会学领域有一个著名的马太效应,即所谓强者更强,弱者更弱的效应。如果一个系统会增大热门物品和非热门物品的流行度差距,让热门的物品更加热门,不热门的物品更加不热门,那么这个系统就有马太效应。比如,首页的热门排行榜就有马太效应。进入排行榜的都是热门的物品,但它们因为被放在首页的排行榜展示有了更多的曝光机会,所以会更加热门。相反,没有进入排行榜的物品得不到展示,就会更不热门。搜索引擎的PageRank算法也具有一定的马太效应,如果一个网页的某个热门关键词排名很高,并因此被展示在搜索结果的第一条,那么它就会获得更多的关注,从而获得更多的外链,PageRank排名也越高。

评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。如果G1是从初始用户行为中计算出的物品流行度的基尼系数,G2是从推荐列表中计算出的物品流行度的基尼系数,那么如果G2 > G1,就说明推荐算法具有马太效应。

1.2.2.4 多样性

推荐结果需要具有多样性
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设s(i, j)∈[0,1]定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:

而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:

1.2.2.5 新颖性

评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。

但是,用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。

1.2.2.6 惊喜度

如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。

1.2.2.7 信任度

对于基于机器学习的自动推荐系统,同样存在信任度(trust)的问题,如果用户信任推荐系统,那就会增加用户和推荐系统的交互。特别是在电子商务推荐系统中,让用户对推荐结果产生信任是非常重要的。同样的推荐结果,以让用户信任的方式推荐给用户就更能让用户产生购买欲,而以类似广告形式的方法推荐给用户就可能很难让用户产生购买的意愿。

度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推荐系统的推荐结果。

提高推荐系统的信任度主要有两种方法。首先需要增加推荐系统的透明度(transparency),而增加推荐系统透明度的主要办法是提供推荐解释。只有让用户了解推荐系统的运行机制,让用户认同推荐系统的运行机制,才会提高用户对推荐系统的信任度。其次是考虑用户的社交网络信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐解释。这是因为用户对他们的好友一般都比较信任,因此如果推荐的商品是好友购买过的,那么他们对推荐结果就会相对比较信任。

1.2.2.8 实时性

推荐系统的实时性包括两个方面。首先,推荐系统需要实时地更新推荐列表来满足用户新的行为变化。比如,当一个用户购买了iPhone,如果推荐系统能够立即给他推荐相关配件,那么肯定比第二天再给用户推荐相关配件更有价值。很多推荐系统都会在离线状态每天计算一次用户推荐列表,然后于在线期间将推荐列表展示给用户。这种设计显然是无法满足实时性的。与用户行为相应的实时性,可以通过推荐列表的变化速率来评测。如果推荐列表在用户有行为后变化不大,或者没有变化,说明推荐系统的实时性不高。

实时性的第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。而对于新物品推荐能力,我们可以利用用户推荐列表中有多大比例的物品是当天新加的来评测。

1.2.2.9 健壮性

算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。

在实际系统中,提高系统的健壮性,除了选择健壮性高的算法,还有以下方法。

  • 设计推荐系统时尽量使用代价比较高的用户行为。比如,如果有用户购买行为和用户浏览行为,那么主要应该使用用户购买行为,因为购买需要付费,所以攻击购买行为的代价远远大于攻击浏览行为。
  • 在使用数据前,进行攻击检测,从而对数据进行清理。
1.2.2.10 商业目标

不同的网站具有不同的商业目标。比如电子商务网站的目标可能是销售额,基于展示广告盈利的网站其商业目标可能是广告展示总数,基于点击广告盈利的网站其商业目标可能是广告点击总数。因此,设计推荐系统时需要考虑最终的商业目标,而网站使用推荐系统的目的除了满足用户发现内容的需求,也需要利用推荐系统加快实现商业上的指标。

1.2.2.11 总结

获取各个指标的途径
对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:
最大化预测准确度
使得 覆盖率 > A
多样性 > B
新颖性 > C
其中,A、B、C的取值应该视不同的应用而定。

1.3 评测维度

一般来说,评测维度分为如下3种。
用户维度主要包括用户的人口统计学信息、活跃度以及是不是新用户等。
物品维度包括物品的属性信息、流行度、平均分以及是不是新加入的物品等。
时间维度包括季节,是工作日还是周末,是白天还是晚上等。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号