一、什么是推荐系统?
背景: 随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载(information overload)的时代,为了解决信息过载的问题,有无数科学家和工程师提出了很多天才的解决方案,其中代表性的解决方案是分类目录和搜索引擎。
分类目录网站有国外的DMOZ、国内的Hao123等。这些目录将著名的网站分门别类,从而方便用户根据类别查找网站。但是随着互联网规模的不断扩大,分类目录网站也只能覆盖少量的热门网站,越来越不能满足用户的需求。
搜索引擎可以让用户通过搜索关键词找到自己需要的信息。但是,搜索引擎需要用户主动提供准确的关键词来寻找信息,因此不能解决用户的很多其他需求,比如当用户无法找到准确描述自己需求的关键词时,搜索引擎就无能为力了。
和搜索引擎一样,推荐系统也是一种帮助用户快速发现有用信息的工具。和搜索引擎不同的是,推荐系统不需要用户提供明确的需求,而是通过分析用户的历史行为给用户的兴趣建模,从而主动给用户推荐能够满足他们兴趣和需求的信息。因此,从某种意义上说,推荐系统和搜索引擎对于用户来说是两个互补的工具。搜索引擎满足了用户有明确目的时的主动查找需求,而推荐系统能够在用户没有明确目的的时候帮助他们发现感兴趣的新内容。推荐系统的基本任务是联系用户和物品,解决信息过载的问题。
为什么需要个性化推荐系统?《长尾理论》 指出,传统的80/20原则(80%的销售额来自于20%的热门品牌)在互联网的加入下会受到挑战。主流商品往往代表了绝大多数用户的需求,而长尾商品往往代表了一小部分用户的个性化需求。因此,如果要通过发掘长尾提高销售额,就必须充分研究用户的兴趣,而这正是个性化推荐系统主要解决的问题。
推荐系统工作的几种方式:(以看电影为例)
1.社会化推荐:通过朋友或者身边的人进行推荐
2.基于内容推荐:通过分析用户曾经看过的电影找到用户喜欢的演员和导演,然后给用户推荐这些演员或者导演的其他电影。
3.基于协同过滤(collaborative filtering)的推荐:找到和自己历史兴趣相似的一群用户,看看他们最近在看什么电影,那么结果可能比宽泛的热门排行榜更能符合自己的兴趣。
推荐算法的本质是通过一定的方式将用户和物品联系起来,而不同的推荐系统利用了不同的方式。可以发现推荐系统就是自动联系用户和物品的一种工具,它能够在信息过载的环境中帮助用户发现令他们感兴趣的信息,也能将信息推送给对它们感兴趣的用户。
二、推荐系统有哪些应用?
领域包括电子商务、电影和视频、音乐、社交网络、阅读、基于位置的服务、个性化邮件和广告等。
三、推荐系统的评测
什么才是好的推荐系统?这是推荐系统评测需要解决的首要问题。一个完整的推荐系统一般存在3个参与方:用户、物品提供者和提供推荐系统的网站。
一个好的推荐系统设计,能够让推荐系统本身收集到高质量的用户反馈,不断完善推荐的质量,增加用户和网站的交互,提高网站的收入。因此在评测一个推荐算法时,需要同时考虑三方的利益,一个好的推荐系统是能够令三方共赢的系统。
所以,好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣,但却不那么容易发现的东西。同时,推荐系统还要能够帮助商家将那些被埋没在长尾中的好商品介绍给可能会对它们感兴趣的用户。这也正是《长尾理论》的作者在书中不遗余力介绍推荐系统的原因。
评测指标
下面将介绍各种推荐系统的评测指标。这些评测指标可用于评价推荐系统各方面的性能。这些指标有些可以定量计算,有些只能定性描述,有些可以通过离线实验计算,有些需要通过用户调查获得,还有些只能在线评测。
1.用户满意度
用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标。但是,用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。用户调查获得用户满意度主要是通过调查问卷的形式。
2.预测准确度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标,从推荐系统诞生的那一天起,几乎99%与推荐相关的论文都在讨论这个指标。这主要是因为该指标可以通过离线实验计算,方便了很多学术界的研究人员研究推荐算法。
在计算该指标时需要有一个离线的数据集,该数据集包含用户的历史行为记录。然后,将该数据集通过时间分成训练集和测试集。最后,通过在训练集上建立用户的行为和兴趣模型预测用户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。
预测准确度指标有哪些?
评分预测:预测用户对物品评分的行为称为评分预测。评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。对于测试集中的一个用户u和物品i,令 r u i r_{ui} rui是用户u对物品i的实际评分,而 r ^ u i \hat{r}_{ui} r^ui是推荐算法给出的预测评分,那么RMSE和MAE的定义为:
R M S E = ∑ u , i ∈ T ( r u i − r ^ u i ) 2 ∣ T ∣ RMSE=\frac{\sqrt{\sum_{u,i\in T}^{}\left ( r_{ui}-\hat{r}_{ui}\right )^{2}}}{\left | T \right |} RMSE=∣T∣∑u,i∈T(rui−r^ui)2
M A E = ∑ u , i ∈ T ∣ r u i − r ^ u i ∣ ∣ T ∣ MAE=\frac{\sum_{u,i\in T}^{}\left | r_{ui}-\hat{r}_{ui}\right |}{\left | T \right |} MAE=∣T∣∑u,i∈T∣rui−r^ui∣
关于RMSE和MAE这两个指标的优缺点, 认为RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。研究表明,如果评分系统是基于整数建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差。
#python代码实现
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推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
R e c a l l = ∑ u ∈ U ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∈ U ∣ T ( u ) ∣ Recall=\frac{\sum_{u\in U}\left | R(u) \bigcap T(u)\right |}{\sum_{u\in U}\left | T(u)\right |} Recall=∑u∈U∣T(u)∣∑u∈U∣R(u)⋂T(u)∣
P r e c i s i o n = ∑ u ∈ U ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∈ U ∣ R ( u ) ∣ Precision=\frac{\sum_{u\in U}\left | R(u) \bigcap T(u)\right |}{\sum_{u\in U}\left | R(u)\right |} Precision=∑u∈U∣R(u)∣∑u∈U∣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 推荐的讨论
评分预测一直是推荐系统研究的热点,绝大多数推荐系统的研究都是基于用户评分数据的评分预测。这主要是因为,一方面推荐系统的早期研究组GroupLens的研究主要就是基于电影评分数据MovieLens进行的,其次,Netflix大赛也主要面向评分预测问题。因而,很多研究人员都将研究精力集中在优化评分预测的RMSE上。
3.覆盖率
覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。
假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:
C o v e r a g e = ∣ ⋃ u ∈ U R ( u ) ∣ ∣ I ∣ Coverage=\frac{\left | \bigcup_{u\in U}R(u)\right |}{\left | I\right |} Coverage=∣I∣∣⋃u∈UR(u)∣
从上面的定义也可以看到,热门排行榜的推荐覆盖率是很低的,它只会推荐那些热门的物品,这些物品在总物品中占的比例很小。一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。
可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。
第一个是信息熵:这里p(i)是物品 i 的流行度除以所有物品流行度之和。
H = − ∑ i = 1 n p ( i ) l o g p ( i ) H=-\sum_{i=1}^{n}p(i) log p(i) H=−∑i=1np(i)logp(i)
第二个指标是基尼系数(Gini Index):
G = 1 n − 1 ∑ j = 1 n ( 2 j − n − 1 ) p ( i j ) G=\frac{1}{n-1}\sum_{j=1}^{n}(2j-n-1)p(i_{j}) G=n−11∑j=1n(2j−n−1)p(ij)
这里, i j i_{j} ij是按照物品流行度p()从小到大排序的物品列表中第j个物品。下面的代码可以用来计算给定物品流行度分布后的基尼系数:
#python代码计算基尼系数
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)
那么,推荐系统是否有马太效应呢?推荐系统的初衷是希望消除马太效应,使得各种物品都能被展示给对它们感兴趣的某一类人群。
评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。如果G1是从初始用户行为中计算出的物品流行度的基尼系数,G2是从推荐列表中计算出的物品流行度的基尼系数,那么如果G2 > G1,就说明推荐算法具有马太效应。
4.多样性
因此给用户的推荐列表也需要满足用户广泛的兴趣,即具有多样性。
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设
s ( i , j ) ∈ [ 0 , 1 ] s(i,j)\in[0,1] s(i,j)∈[0,1]定义了物品i和 j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
D i v e r s i t y = 1 − ∑ i , j ∈ R ( u ) , i ≠ j s ( i , j ) 1 2 ∣ R ( u ) ∣ ( ∣ R ( u ) ∣ − 1 ) Diversity=1-\frac{\sum_{i,j\in R(u) ,i\neq j}s(i,j) }{\frac{1}{2}\left | R(u) \right |(\left | R(u) \right |-1)} Diversity=1−21∣R(u)∣(∣R(u)∣−1)∑i,j∈R(u),i=js(i,j)
而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
D i v e r s i t y = 1 ∣ U ∣ ∑ u ∈ U D i v e r s i t y ( R ( u ) ) Diversity=\frac{1}{\left | U \right |}\sum_{u\in U}Diversity(R(u)) Diversity=∣U∣1∑u∈UDiversity(R(u))
从上面的定义可以看到,不同的物品相似度度量函数s(i,j)可以定义不同的多样性。如果用内容相似度描述物品间的相似度,我们就可以得到内容多样性函数,如果用协同过滤的相似度函数描述物品间的相似度,就可以得到协同过滤的多样性函数。
5.新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品,评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。
通过牺牲精度来提高多样性和新颖性是很容易的,而困难的是如何在不牺牲精度的情况下提高多样性和新颖性.
6.惊喜度
惊喜度和新颖度的区别? 如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。因此提高推荐惊喜度需要提高推荐结果的用户满意度,同时降低推荐结果和用户历史兴趣的相似度。
思考:评测指标之间的权重应该怎么进行分配?怎么利用这些指标来评测最好的推荐系统