《推荐系统实战》读书笔记
1.亚马逊允许用户禁用推荐理由,只要是出于隐私的考虑;
2.提供用户对推荐结果的反馈方式:加入到购物车、加入到心愿单、给书打分、我已经拥有、对内容没兴趣;
一、推荐系统评测
完整的推荐系统一般存在3个参与方:用户、物品提供者和提供推荐系统的网站。一个好的推荐系统是能够令三方互赢的系统。为了全面评测推荐系统对三方利益的影响,常用的评测指标包括:准确率、覆盖率、新颖度、惊喜度、信任度、透明度等。
1.推荐系统实验方法
离线实验(offline experiment):
优点:不需要有对实际系统的控制权、不需要用户参与实验、速度快,可以测试大量算法;
缺点:无法计算商业上关注的指标:点击率、转化率等;离线实验的指标和商业指标存在差距。
用户调查(user study):
优点:可以获得很多体现用户主观感受的指标,相对在线实验风险很低,出现错误后很容易弥补。
缺点:招募测试用户代价大,很难组织大规模的测试用户,因此测试结果的统计意义不足;另外,用户测试环境下的行为和真实环境的行为可能不同。
在线实验(online experiment):AB测试是常用的一种在线评测算法的实验
优点:可以公平获得不同算法实际在线时的性能指标,包括商业上关注的指标。
缺点:周期比较长,必须进行长期的实验才能得到可靠的结果。
2.评测指标
- 用户满意度;主要通过调查问卷的形式获得(通过用户调查或者在线实验获得,没有办法离线计算)。可以用点击率、用户停留时间、转化率等指标度量用户的满意
- 预测准确度:度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标。
根据离线推荐算法不同的研究方向,针对不同的方向有不同的预测准确度指标:
1)评分预测:预测用户对物品的评分的行为
评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。RMSE加大了对预测不准的用户评分的惩罚(平方项的惩罚)。如果评分系统是基于整数建立的,对预测结果取整会降低MAE的误差。
2)Top N推荐:给用户一个个性化的推荐列表
Top N推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
3)覆盖率(coverage):描述一个推荐系统对物品长尾的发掘能力。
覆盖率最简单的定义:推荐系统能够推荐出来的物品占总物品集合的比例。
细化推荐系统发掘长尾的能力:如果所有物品出现在推荐列表中,且出现次数差不多,那推荐系统发掘长尾能力就好。因此,基于信息论和经济学的指标,来定义覆盖率:信息熵、基尼指数
4)多样性:描述了推荐列表中物品两两之间的不相似性。
多样性和相似性是对应的。推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值。
5)新颖性:指给用户推荐那些他们以前没有听说过的物品。
评测新颖度的最简单方法是利用推荐结果的平均流行度,因此,越不热门的物品越可能让用户觉得新颖。
6)惊喜度(serendipity)
如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
7)信任度
度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推荐系统的推荐结果。
提高推荐系统的信任度方式:增加推荐系统的透明度,主要办法是提供推荐解释。另一种是利用用户的社交网络信息,利用好友信息给用户推荐。
8)实时性
9)健壮性:衡量了推荐系统抗击作弊的能力。
10)商业目标
离线实验的优化目标是:
最大化预测准确度
使得 覆盖率>A
多样性>B
新颖性>C
其中,A/B/C的取值应该视不同的应用而定。
3.评测维度
增加评测维度的目的就是知道一个算法在什么情况下性能最好。这样可以为融合不同推荐算法取得最好的整体性能带来参考。
一般来说,评测维度分为如下3种:
用户维度:主要包括用户的人口统计学信息、活跃度及是不是新用户等
物品维度:包括物品的属性信息、流行度、平均分及是不是新加入的物品等
时间维度:包括季节,是工作日还是周末,是白天还是晚上等
二、用户行为数据
显性反馈行为包括用户明确表示对物品的喜好行为。视频网站,只有用户特别不满或者特别满意时才会评分,此设计两级评分就可以;评论网站,用户因精力都放在评论上,这时多级评分系统就是必要的。
隐性反馈行为指那些不能明确反映用户喜好的行为。最具代表性的就是页面浏览行为。
用户行为的统一表示 | |
user id | 产生行为的用户的唯一标识 |
item id | 产生行为的对象的唯一标识 |
behavior type | 行为的种类(比如是购买还是浏览) |
context | 产生行为的上下文,包括时间和地点等 |
behavior weight | 行为的权重(如果是观看视频的行为,那么这个权重可以是观看时长;如果是打分行为,这个权重可以是分数) |
behavior content | 行为的内容(如果是评论行为,那么就是评论的文本;如果是打标签,就是标签) |
一般来说,不同的数据集包含不同的行为,目前比较有代表性的数据集有:
- 无上下文信息的隐性反馈数据集:每一条行为记录仅仅包含用户ID和物品ID。Book-Crossing【http://www2.informatik.uni-freiburg.de/~cziegler/BX/ 】
- 无上下文信息的显性反馈数据集:每一条记录包含用户ID、物品ID和用户对物品的评分。
- 有上下文信息的隐性反馈数据集:每一条记录包含用户ID、物品ID和用于对物品产生行为的时间戳。Last.fm数据集【https://www.dtic.upf.edu/~ocelma/MusicRecommendationDataset/lastfm-1K.html 】就是这种类型的数据集
- 有上下文信息的显性反馈数据集:每一条记录包含用户ID、物品ID、用户对物品的评分和评分行为发生的时间戳。Netflix Prize【https://netflixprize.com/ 】提供的就是这种类型的数据集。
- 用户行为分析
用户活跃度和物品流行度的分布:互联网上的很多数据分布都满足一种称为Power Law的分布,也称长尾分布。f(x)=axk
物品的流行度:指对物品产生过行为的用户总数。
用户的活跃度:指用户产生过行为的物品总数。
用户活跃度和物品流行度的关系:新用户倾向于浏览热门的物品,点击首页的热门物品;老用户会逐渐开始浏览冷门的物品。
仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。比如基于邻域的方法(neighborhood-based)、隐语义模型(latent factor model)、基于图的随机游走算法(random walk on graph)。业界最广泛应用的算法是基于邻域的方法。基于邻域的方法主要包括下面两种算法:
基于用户的协同过滤算法:这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品
基于物品的协同过滤算法:这种算法给用户推荐和他之前喜欢的物品相似的物品。
- 实验设计和算法评测
实验用的的数据集:https://grouplens.org/datasets/movielens/ (选用其中的中等大小数据集)。
该部分重点研究的是隐反馈数据集中的TopN推荐问题,因此忽略数据集中的评分记录。TopN推荐的任务是预测用户会不会对某部电影评分,而不是预测用户在准备对某部电影评分的前提下会给电影评多少分。
实验设计
K折交叉验证的主要原因是为了防止某次实验的结果是过拟合的结果,但如果数据量够大,模型够简单,为了快速通过离线实验初步地筛选算法,也可以进行一次实验。
评测指标
召回率:召回率描述有多少比例的用户-物品评分记录包含在最终的推荐列表中。
准确率:准确率描述最终的推荐列表中有多少比例是发生过的用户-评分记录。
覆盖率:覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明算法越能够将长尾中的物品推荐给用户。
新颖度:以推荐列表中物品的平均流行度度量推荐结果的新颖度。在计算平均流行度时对每个物品的流行度取对数的原因是物品的流行度分布满足长尾分布,在取对数后,流行度的平均度更加稳定。
- 基于邻域的算法
基于用户的协同过滤算法
主要包含两个步骤:
(1)找到和目标用户兴趣相似的用户集合。协同过滤算法主要利用行为的相似度计算兴趣的相似度。可以使用Jaccard公式 或者通过余弦相似度来计算 。
(2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户
选择合适的相似用户数对于推荐系统的精度比较重要。
缺点:
1)随着网站用户数目越来越大,计算用户兴趣相似度矩阵越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系;
2)基于用户的协同过滤很难对推荐结果作出解释。
基于物品的协同过滤算法
目前业界应用最多的算法。基于物品的协同过滤算法并不是利用物品的内容属性计算物品之间的相似度,而是通过分析用户的行为记录计算物品之间的相似度。
基于物品的协同过滤算法可以利用用户的历史行为给推荐结果提供推荐解释。
主要包含两个步骤:
(1)计算物品之间的相似度
(2)根据物品的相似度和用户的历史行为给用户生成推荐列表
相似度矩阵的归一化不仅可以增加推荐的准确度,也可以提高推荐的覆盖率和多样性。
UserCF算法和ItemCF算法比较
UserCF算法的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF算法的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户的兴趣传承。
- 隐语义模型
隐语义模型(Latent factor model,LFM),它的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品。 在LFM中,重要的参数有4个:
- 隐特征的个数F;
- 学习速率alpha
- 正则化参数lambda;
- 负样本/正样本比例ratio。
当数据集非常稀疏时,LFM的性能会明显下降。
- 基于图的模型
将用户行为表示为二分图模型后,下面的任务就是在二分图上给用户进行个性化推荐。一般来说,图中顶点的相关性主要取决于下面3个因素:
- 两个顶点之间的路径数;
- 两个顶点之间路径的长度;
- 两个顶点之前的路径经过的顶点;
而相关性高的一对顶点一般具有如下特征:
- 两个顶点之间有很多条路径相连
- 连接两个顶点之间的路径长度都比较短;
- 连接两个顶点之间的路径不会经过出度比较大的顶点。
三、推荐系统冷启动问题
如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统,就是冷启动问题。
- 冷启动问题分类
冷启动问题(cold start) 主要分3类:
- 用户冷启动:用户冷启动主要解决如何给新用户做个性化推荐的问题。当新用户到来时,没有新用户的行为数据,因此无法根据他的历史行为预测其兴趣,从而无法借此给他做个性化推荐。
- 物品冷启动:物品冷启动主要解决如何将新的物品推荐给可能对它感兴趣的用户这一问题。
- 系统冷启动:系统冷启动主要解决如何在一个新开发的网站上(还没有用户、也没有用户行为,只有一些物品的信息)设计个性化推荐系统,从而在网站刚发布时就让用户体验到个性化推荐服务这一问题。
对于上述3种不同的冷启动问题,有不同的解决方案。一般来说,可以参考如下解决方案:
- 提供非个性化的推荐:非个性化推荐的最简单例子就是热门排行榜,我们可以给用于推荐热门排行榜,然后等到用户数据收集到一定的时候,再切换为个性化推荐。
- 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化。
- 利用用户的社交网络账号登陆(需要用户授权),导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品。
- 要求用户在登陆时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐那些和这些物品相似的物品。
- 对于新加入的物品,可以利用内容信息,将它们推荐给喜欢过和它们相似的物品的用户。
- 在系统冷启动时,可以引入专家的知识,通过一定的高效方式迅速建立起物品的相关度表。
- 利用用户注册信息
用户的信息分三种:
- 人口统计学信息:包括用户的年龄、性别、职业、民族、学历和居住地。
- 用户兴趣的描述:有一些网站会让用户用文字描述他们的兴趣;
- 从其他网站导入的用户站外行为数据:比如用户通过豆瓣、新浪微博的账号登陆,就可以得到用户同意的情况下获取用户在豆瓣或者新浪微博的一些行为数据和社交网络数据。
基于注册信息的个性化推荐流程基本如下:
(1)获取用户的注册信息;
(2)根据用户的注册信息对用户分类;
(3)给用户推荐他所属分类中用户喜欢的物品。
基于用户注册信息的推荐算法其核心问题是计算每种特征的用户喜欢的物品。给用户推荐热门物品并不是推荐系统的主要任务,推荐系统应该帮助用户发现他们不容易发现的物品。
两个包含人口统计学信息的推荐系统数据集:
BookCrossing数据集:http://www2.informatik.uni-freiburg.de/~cziegler/BX/
-
- BX-User.csv: 包含用户id,位置和年龄
- BX-Books.csv: 包含图书的ISBN、标题、作者、发表年代、出版社和缩略。
- BX-Book-Ratings.csv: 包含用户对图书的评分信息。
Last.fm数据集:https://www.dtic.upf.edu/~ocelma/MusicRecommendationDataset/lastfm-360K.html
- 选择合适的物品启动用户的兴趣
解决用户冷启动问题的另一个方法是在新用户第一次访问推荐系统时,不立即给用户展示推荐结果,而是给用户提供一些物品,让用户反馈他们对这些物品的兴趣,然后根据用户反馈给提供个性化推荐。需要解决的首要问题就是如何选择物品让用户进行反馈。
一般来说,能够用来启动用户兴趣的物品需要具有以下特点:
-
- 比较热门:用户需要知道指定物品是什么东西;
- 具有代表性和区分性:启动用户兴趣的物品不能是大众化或老少皆宜的,因为这样的物品对用户的兴趣没有区分性。
- 启动物品集合需要有多样性:提供具有很高覆盖率的启动物品集合。
- 利用物品的内容信息
物品冷启动需要解决的问题是如何将新加入的物品推荐给对它感兴趣的用户。物品冷启动在新闻网站等时效性很强的网站中非常重要,因为那些网站中时时刻刻都有新加入的物品,每个物品必须能够在第一时间展现给用户,否则经过一段时间后,物品的价值就大大降低了。
- 发挥专家的作用
四、利用用户标签数据
研究用户给物品打标签的行为,探讨如何通过分析这种行为给用户进行个性化推荐。
1.标签系统中的推荐问题
标签系统中的推荐问题主要有以下两个:
- 如何利用用户打标签的行为为其推荐物品(基于标签的推荐)?
- 如何在用户给物品打标签时为其推荐合适该物品的标签(标签推荐)?
为了研究上面的两个问题,我们首先需要解答下面3个问题:
- 用户为什么要打标签?
社会维度,功能维度
- 用户怎么打标签?
- 用户打什么样的标签?
表明物品是什么
表明物品的种类
表明谁拥有物品
表达用户的观点
用户相关的标签
用户的任务
2.基于标签的推荐系统
3.给用户推荐标签
4.基于图的标签推荐
五、利用上下文信息
上下文包括用户访问推荐系统的时间、地点、心情等,对于提高推荐系统的推荐效果是非常重要的。
1.时间上下文信息
时间信息对用户兴趣的影响表现在以下几个方面:
- 用户兴趣是变化的
- 物品也是有生命周期的
- 季节效应
在给定数据集后,可以通过统计如下信息研究系统的时间特性:
- 数据集每天独立用户数的增长情况
- 系统的物品变化情况
- 用户访问情况
度量网站中物品的生命周期指标:
- 物品平均在线天数
- 相隔T天系统物品流行度向量的平均相似度
推荐系统每天推荐结果的变化程度被定义为推荐系统的时间多样性。时间多样性高的推荐系统中用户会经常看到不同的推荐结果。
提高推荐结果的时间多样性需要分两步解决:
1)需要保证推荐系统能够在用户有了新的行为后及时调整推荐结果,是推荐 结果满意用户最近的兴趣;
2)需要保证推荐系统在用户没有新的行为也能够经常变化一下结果,具有一定的时间多样性。
如果用户没有行为,如何保证给用户的推荐结果具有一定的时间多样性?一般的思路有以下几种:
1)在生成推荐结果时,加入一定的随机性
2)记录用户每天看到的推荐结果,然后在每天给用户进行推荐时,对他前几天看到过很多次推荐的结果进行适当的降权
3)每天给用户使用不同的推荐算法。然后在每天用户访问推荐系统的时候随机挑选一种算法给他进行推荐。
2.地点上下文信息
六、利用社交网络数据
获取社交网络数据的途径:电子邮件、用户注册信息、用户的位置信息、论坛和讨论组、即时聊天工具、社交网站
一般来说,有3种不同的社交网络数据:
- 双向确认的社交网络数据
- 单向关注的社交网络数据
- 基于社区的社交网络数据
社会化推荐之所以受到很多网站的重视,缘于以下优点:
- 好友推荐可以增加推荐的信任度
- 社交网络可以解决冷启动问题
熟悉度可以用用户之间的共同好友比例来度量。
社会化推荐中关键的操作就是拿到用户所有好友的行为数据,然后通过一定的聚合展示给用户。
1.基于邻域的社会化推荐算法
2.基于图的社会化推荐算法
3.信息流推荐
六度原理:社会中任意两个人都可以通过不超过6个人的路径相互认识。如果转换为图的术语,就是社交网络图的直径为6。
七、推荐系统实例
目前流行的一些推荐系统界面的共性:
- 通过一定的方式展示物品
- 推荐界面提供推荐理由
- 推荐界面提供一些按钮让用户对推荐结果反馈
一般来说,需要实时存取的数据存储在数据库和缓存中,而大规模的非实时数据存储在分布式文件系统(如HDFS)中。
用户的特征种类,主要包括:
- 人口统计学特征
- 用户行为特征
- 用户的话题特征
推荐系统的推荐任务主要有:
- 将最新加入的物品推荐给用户
- 将商业上需要宣传的物品推荐给用户
- 给用户推荐不同种类的物品
- 给用户混合推荐
- 对不同的产品推荐不同新颖度的物品
- 考虑到用户访问推荐系统的上下文
推荐系统的架构
推荐系统需要由多个推荐引擎组成,每个推荐引擎负责一类特征和一种任务,而推荐系统的任务只是将推荐引擎的结果按照一定的权重或优先级合并、排序然后返回。
推荐引擎使用一种或几种用户特征,按照一种推荐策略生成一种类型物品的推荐列表。
一个特征向量由特征以及特征的权重组成,在利用用户行为计算特征向量时需要考虑以下因素:
- 用户行为的种类
- 用户行为产生的时间
- 用户行为的次数
- 物品的热门程度
候选物品集合的目的是保证推荐结果只包含候选物品集合中的物品。
一般来说,过滤模块主要过滤:
- 用户已经产生过行为物品
- 候选物品以外的物品
- 某些质量很差的物品
排名模块:
- 新颖性排名:目的是给用户尽量推荐他们不知道的、长尾中的物品
- 多样性:让推荐结果覆盖尽可能多的用户兴趣。(一种提高多样性的方法是将推荐结果按照某种物品的内容属性分成几类,然后在每类中选择该类中排名最高的物品组合成最终推荐列表;另一种是控制不同推荐结果的推荐理由出现的次数)
- 时间多样性:主要为了保证用户不要每天来推荐系统都看到同样的推荐结果。
- 用户反馈模块
八、评分预测问题
我们希望能够给用户一个分数表明我们认为用户是否会喜欢某个物品,而这个分数也可以帮助用户决策是否要看某个物品。
对于和时间无关的预测任务,可以均匀分布随机地划分数据集;如果是和时间相关的任务,那么将用户的旧行为作为训练集,将用户的新行为作为测试集。