您的位置:首页 > 其它

推荐系统实践学习笔记(一)

2016-10-02 21:26 302 查看
写在前面:这几天学习了一下《推荐系统实践》这本书,出于兼顾学生读者和工程师读者的考虑,作者在理论上讲得不算太深,但是非常系统、全面。由于看得比较快,其中的方法没有来得及一一实现,打算写几篇博客记录一下,便于日后有空时翻看实践。

个性化推荐系统的应用

相信个性化推荐系统对每一个经常使用互联网的人来说都不陌生,购物时有个性化商品推荐、听歌/看电影时有猜你喜欢的歌曲/电影推荐、逛论坛时有你想看的个性化热帖推荐……随着信息技术的飞速发展,人们逐渐走进了信息过载的时代,从大量的信息中找出自己感兴趣的东西成了一件困难的事情。一个好的推荐系统,可以在用户面前展示他感兴趣的东西,为商家推广产品,为平台(网站或手机应用)带来流量……可以说是实现了三方的共赢。

那么问题来了,推荐系统向用户推荐物品的依据有哪些呢?其中哪一种又是最优的?如何评价一个推荐系统是好是坏呢?

推荐系统评测

实验方法

在推荐系统中,主要有三种评测推荐效果的实验方法:离线实验,用户调查和在线实验。

离线实验

离线实验通过日志系统获得用户行为数据,生成数据集,将数据集划分成训练集和测试集,在训练集上训练模型,测试集上进行预测,最后对预测结果进行评测。

离线实验的优点是,不需要用户的实时参与,可以快速地进行大量不同算法的测试;它的主要缺点是无法获得点击率、转化率等很多商业上关注的指标,离线实验的指标和商业指标还存在着差距,比如高预测准确率不等于高用户满意度。

用户调查

用户调查是推荐系统评测的一个重要工具,很多离线时没有办法评测的与用户主观感受有关的指标都可以通过用户调查获得。选择测试用户时,需要尽量保持测试用户的分布与真实用户的分布相同,同时要尽量保证是双盲实验(实验人员和用户事先不知道测试的目标),避免实验结果受主观成分的影响。

用户调查的优点是可以获得体现用户主管感受的指标,弥补离线实验的不足,同时相对在线实验风险较低;它的主要缺点是招募测试用户代价大,因此会使测试结果的统计意义不足,此外,在很多时候设计双盲实验非常困难,而且用户在测试环境下的行为和真实环境下可能有所不同。

在线实验

在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试,AB测试是一种常用的在线评测算法的实验方法,它通过一定的规则将用户随机分成几组,并对不同组的用户采用不同的算法,然后通过统计不同组用户的各种不同的评测指标比较不同算法。



上图是一个简单的AB评测系统:用户进入网站后,流量分配系统(由后台实验人员配置)决定用户是否需要被进行AB测试,然后用户浏览网页,浏览网页时的行为都会被通过日志系统发回后台数据库,实验人员在后台统计日志数据库中的数据,通过评测系统生成不同分组用户的实验报告,并比较和评测实验结果。

总结

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

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

评测指标

用户满意度

用户满意度是评测推荐系统的最重要指标,它可以通过用户调查获得,设计问卷时要注意考虑到用户在各方面的感受。对于在线系统,用户满意度主要由对用户行为的统计得到:设置用户反馈按钮,或者用点击率、用户停留时间和转化率等指标度量用户的满意度。

预测准确度

预测准确度度量了一个推荐系统预测用户行为的能力,是最重要的推荐系统离线评测指标。对于不同研究方向的离线推荐算法,预测准确度的指标也不相同,主要有两种:

1、评分预测

评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算,对于测试集中的一个用户u和物品i,令rui是用户u对物品i的实际评分,而r’ui是推荐算法给出的预测,那么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))


2、个性化(TopN)推荐列表

TopN推荐列表的预测准确率一般通过准确率和召回率度量:



其中R(u)是推荐列表,T(u)是用户在测试集上的行为列表。

通常来说,TopN推荐比评分预测更符合实际应用。

覆盖率

覆盖率描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例:



其中R(u)为用户u的推荐列表。

个性化的推荐系统应当不仅仅能够向用户推荐那些热门的物品,同时可以发掘适合用户的非热门物品,一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。

但是上面的定义过于粗略,为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有物品都出现在推荐列表中,且出现次数相差不大,那么推荐系统发现长尾的能力就很好。信息熵Gini系数也可以用来定义覆盖率:



其中p(i)是物品i的流行度除以所有物品流行度之和,ij是按照物品i流行度p()从小到大排序的物品列表中第j个物品。

多样性

多样性描述了推荐列表中物品两两之间的不相似性,假设s(i,j)定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:



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

其它评测指标还有新颖性、惊喜度、信任度、实时性、健壮性等,在这里就不一一列举。

用户行为数据

用户行为数据在网站上最简单的存在形式就是日志,日志中记录了用户的各种行为,比如网页浏览、点击、购买、评论、评分等等。

用户行为在个性化推荐系统中一般分为显性反馈行为隐性反馈行为。显性反馈行为包括用户明确表示对物品的喜好的行为,比如给物品评分,而隐性反馈行为是指那些不能明确反应用户喜好的行为,比如页面浏览行为。隐性反馈数据比显性反馈不明确,但其数据量更庞大。

此外,用户活跃度和物品流行度的分布都服从长尾分布,随着用户活跃度(物品流行度)的下降,用户数量(物品数量)逐渐下降,但不会迅速坠落到零,而是极其缓慢地贴近于横轴,粗看上去几乎与横轴平行延伸。



仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法,比如基于领域的算法、隐语义模型、基于图的算法等等,下面对这几种方法分别进行介绍。

基于邻域的算法

基于邻域的算法是推荐系统中最基本的算法,分为两大类,一类是基于用户的协同过滤算法,一类是基于内容的协同过滤算法。

基于用户的协同过滤算法(UserCF)

计算用户相似度

基于用户的协同过滤算法通过找到和目标用户兴趣相似的用户集合,找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

通过余弦相似度计算两个用户的兴趣相似度



如果对两两用户都利用余弦相似度计算,在用户数很大时消耗的时间将会非常多,因此可以首先筛选出兴趣物品集合交集不为零的用户对,然后再对这些情况除以分母计算兴趣相似度。

利用UserCF筛选用户感兴趣的物品

得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品,下面的公式度量了UserCF中用户u对物品i的感兴趣程度:



其中S(u,k)包含和用户u兴趣最接近的K个用户,wuv是用户u和用户v的兴趣相似度,N(i)是对物品i有过行为的用户合集,rvi代表用户v对物品i的兴趣,使用单一行为的隐反馈数据时,所有的rvi=1。K值需要通过离线实验,选择在预测数据集上预测效果最好时所对应的值。

相似度计算改进

对一件冷门物品有过相同行为比对一件热门物品有过相同行为更能说明两个用户兴趣相似,比如,同时购买《数据挖掘导论》的用户显然比同时购买《新华字典》的用户喜好更相近。因此,需要对相似度公式进行如下的改进:



该公式通过1/log1+|N(i)|惩罚了用户u和用户v共同兴趣列表中的热门物品i,实验表明,改进的UserCF算法的各预测指标都有所提升。

基于物品的协同过滤算法(ItemCF)

计算物品相似度

基于物品的协同过滤算法是向用户推荐与他们过去喜欢过的物品相似的物品。那么首先需要计算物品之间的相似度,可以由下面的公式计算:



|N(i)|和|N(j)|分别是喜欢物品i和物品j的用户数,分母之所以这样设计,是为了减轻热门物品会和很多物品相似的可能性。

和UserCF算法类似,ItemCF算法在计算物品相似度时为了避免两两物品之间都需要进行计算,首先建立用户-物品倒排表,对于每个用户,将他物品列表中的物品两两在共现矩阵中加1,最后将矩阵归一化就可以得到物品之间的余弦相似度。

利用ItemCF筛选用户感兴趣的物品

得到物品之间的相似度之后,ItemCF通过以下公式计算用户u对一个物品j的兴趣:



其中S(j,K)包含和物品i最接近的K个物品,wji是物品i和物品j的相似度,N(u)是用户喜欢的物品合集,rui代表用户u对物品i的兴趣,使用单一行为的隐反馈数据时,所有的rui=1。

相似度计算改进

试想这样一种情况:如果有一个用户从网上购买了数十万本书准备开书店,这数十万本可能覆盖众多领域的书两两之间就产生了相似性,然而用户购买这些书并非出于自己兴趣,因此John S.Breese提出应当惩罚活跃用户对物品相似度的贡献,将计算公式改进为:



同时,对于某些过于活跃的用户,为了避免相似度矩阵过于稠密,通常直接忽略他们的兴趣列表,不纳入相似度计算的数据集。

物品相似度的归一化

如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率、覆盖率和多样性。原因是,物品往往归属于不同的类,类物品之间的相似度往往比不同类物品之间的相似度要高,类物品之间的相似度都变成1,推荐时的多样性和覆盖率就更好了。归一化公式如下:



UserCF和ItemCF的综合比较

UserCF适用于用户较少的场合,因为用户很多时计算相似度矩阵的代价会很大,需要计算物品相似度矩阵的ItemCF则适用于物品数明显小于用户数的场合。

UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。

当用户有新行为时,UserCF算法中推荐结果不一定立即变化,而ItemCF中一定会导致推荐结果的实时变化。

UserCF适用于新闻推荐,主要是由于在新闻网站用户的兴趣比较粗粒度且偏向于热门,同时,新闻的时效性很强,维护物品相似度矩阵代价太大。

ItemCF适用于图书、电影、音乐和电子商务中的推荐,因为在这些网站中用户的兴趣比较固定,个性化推荐的任务是帮助用户发现和他研究邻域相关的物品。

隐语义模型(LFM)

基于兴趣分类方法的核心思想是通过隐含特征联系用户兴趣和物品,判断用户对哪些类的物品感兴趣,再将属于这些类的物品推荐给用户。那么,如何给物品分类,分类的粒度如何确定?如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?又如何确定物品在一个类中的权重呢?

隐语义分析技术基于用户行为统计进行自动聚类,较好地解决了以上几个问题。

LFM是隐语义分析技术中的一种模型,通过以下公式计算用户u对物品i的兴趣:



其中pu,k度量了用户u的兴趣和第k个隐类的关系,qi,k度量了第k个隐类和物品i之间的关系。计算这两个参数,需要一个训练集,对于每个用户u,训练集里都包含了用户u喜欢和不感兴趣的物品,通过学习这个数据集,就可以获得模型参数。

训练集采样

在隐性反馈数据集中,只有正样本,没有负样本。那么就需要在用户没有行为的物品中进行负样本的采用,经过实验,发现对负样本的采样应该遵循以下原则:对于每个用户,要保证正负样本的平衡,对每个用户采样负样本时,选取热门但用户没有行为的物品。

采样完成后可以得到一个用户-物品集K={(u,i)},如果(u,i)是正样本,则rui=1,否则rui=0。

优化损失函数

对于采样完成的训练集,需要优化如下损失函数来找到最合适的参数p和q:



最小化损失函数采用的是随机梯度下降法。

基于图的模型

基于图的模型首先需要将用户行为表示成二分图模型,令G(V,E)表示用户物品二分图,其中V由用户顶点合集VU和物品顶点合集VI组成,E为连接用户节点和物品节点的边的集合,用户节点和物品节点相连说明该用户对相连的物品产生过行为。

度量顶点之间相关性的方法有很多,主要有:两个顶点之间的路径数,两个顶点之间路径的长度,两个顶点之间的路径经过的顶点。



基于随机游走的PersonalRank算法

了解了二分图模型的基本概念,下面介绍一种计算图中顶点之间相关性的方法。

假设要给用户u进行个性化推荐,可以从用户u对应的节点vu开始在用户物品二分图上进行随机游走,游走到任何一个节点时,首先按照概率决定是继续游走还是停止这次游走并从vu节点重新开始游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。

这种方法可以表示成如下公式:



PersonalRank算法可以通过随机游走进行比较好的理论解释,但该算法在时间复杂度上有明显的缺点,可以通过将PR转化成矩阵的方法进行改进。

总结

首先感叹一下,写完这篇博客真心不轻松啊,这还仅仅是《推荐系统实践》前两章的内容。不过,写博客的过程等于是又把书看了一遍,的确起到很好的巩固作用。接下来,我会用几个数据集将这篇博文中提到的推荐算法实现、测试一下(加深对公式的理解),后续也会继续更新后几章的内容,对机器学习基础算法的学习同样不能落下……不说了看书去啦>_<
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息