《推荐系统实战》详细描述了关于推荐系统的数据来源、模型建立和应用实例。每一章节通过实际案例出发,使读者可以从日常生活的角度先对该章节的目标有大致的了解,接着剖析为达到这一目标,需要收集哪些数据、如何建立模型、如何进行模型调优等。是一本非常深入浅出、初学者友好的书籍。
全书架构分为八个部分:
1.好的推荐系统
2.利用用户行为数据
3.推荐系统冷启动问题
4.利用用户标签数据
5.利用上下文信息
6.利用社交网络数据
7.推荐系统实例
8.评分预测问题
下面,对各部分进行详细分析:
一、好的推荐系统:
什么是推荐系统,好的推荐系统有哪些标准?从用户的角度出发,推荐系统是为了帮助用户在过量信息中筛选出符合自己需求的物品,从物品的角度出发,推荐系统可以帮助长尾物品的用户挖掘。总的来说,推荐系统是帮助人物的匹配。推荐内容一般包括几个组成部分:推荐物品的标题及描述,推荐的理由,供用户反馈的通道。使用推荐系统的往往是信息过载现象较为严重的领域,例如社交网站(微博、人人网)、电影视频网站(豆瓣、爱奇艺)、音乐播放器(豆瓣电台、虾米音乐)、阅读娱乐(今日头条、抖音)、电商网站(亚马逊、淘宝)、电子邮件,基于位置的服务(大众点评)、广告(百度、今日头条)等。
好的推荐系统,一般可以从以下几个角度去评判:用户满意度、推荐准确率(用户点击、购买行为)、覆盖率(覆盖的物品)、多样性(不同推荐维度)、新颖度(冷门物品被覆盖)、惊喜度(用户预料之外的好的推荐)、时效性(新物品、新信息)、信任度(用户是否信任推荐结果)、健壮性、商业目标。
二、利用用户行为数据
这一部分,开始进入推荐系统搭建的主体,其中最重要的原料就是用户行为数据。只有在收集了足量的用户数据、并不断根据用户的行为反馈去优化迭代,推荐系统的效果才会越来越好。如果一个系统无法自我进步,成长速度势必是受到限制的。
用户的行为数据分为显性数据和隐性数据,其中显性数据是指用户明确表明了态度喜好的数据,例如收藏、喜欢、评分、购买等,隐性数据则是用户不明确态度的数据,主要是用户的浏览行为,浏览行为容易受到许多因素的干扰,并不能代表用户对其喜好。
用户行为可以从两个维度去总结其规律,一个是用户自身的活跃程度,一个是物品的流行度(被用户关注的程度)。通过大量的数据可以总结出规律:用户活跃度与物品流行度都呈长尾分布,即活跃用户是少数,流行的物品也是少数。而通过的用户活跃度与物品流行度之间的关系进行分析,我们可以发现,用户活跃度越高,越可能对流行度较低的物品产生行为。我们可以基于用户行为进行推荐,这种算法被称为协同过滤算法,而基于以上两点结论,我们产生了两种推荐系统:基于用户和基于物品的协同过滤算法。
有了理论基础,如何根据这一理论去设计具体的算法呢?首先我们定义系统评测的三个指标:
召回率:推荐物品占用户发生行为的物品的比例
准确率:用户产生行为的物品占推荐物品的比例
覆盖率:推荐给所有用户的物品占所有物品的比例
有了评测标准,接下来看算法如何设计,首先是基于用户的协同过滤算法,整体思路是:找到与当前用户喜好相似的用户,将他们喜欢的而当前用户未产生过行为的物品推荐给用户。其中计算用户相似度可以用杰卡德公式或余弦相似度公式(用户间同时有过正反馈的物品/两用户反馈过的物品总量):例如小明和小红同时喜欢过4件物品,小红和小强同时喜欢过5件商品,小明、小红、小强分别给6、7、8件物品做过评价,则与小红更相似的人是小强。
但是,给每个用户进行两两之间的相似度计算太耗时了,比较简单的方法是对物品建立倒排表(即物品和喜欢过该物品的用户之间的矩阵),扫描完所有物品后,我们可以知道用户间共同喜欢的物品,从而计算相似度,并给用户推荐与他最相似的其他用户喜欢的物品。在实际应用中我们发现,某些热门物品喜欢的用户会很多,从而大大增加热门物品在推荐中的出现概率,降低了系统的覆盖率。为了提高对长尾物品的覆盖,我们要对热门物品加一个惩罚系数,降低热门物品的权重。
基于物品的协同算法,则应用更为广泛(因为计算用户之间的相似度太耗时)。其基础算法是计算物品之间的相似度,在根据用户的行为将相似物品推荐给用户。相似度为同时喜欢物品A和B的用户占喜欢物品A的用户比例,来判断物品B是不是可以被推荐给用户的物品A的相似物品。同样的,由于热门物品会导致这一比例非常高,降低系统的覆盖率,所以要对物品B的热门程度进行惩罚。进一步改进这一算法,因为活跃用户更有可能推荐冷门物品,系统会降低不活跃用户的比重,从而提高系统的覆盖率。
综合比较两类算法,基于用户的推荐更社会化,反映了群体中物品的兴趣,而基于物品的推荐则更强调用户个人的兴趣。性能上,用户和物品孰多,则基于该特性的推荐系统的性能会降低。在适用领域上,基于用户的算法更适合时效性强,用户个性化兴趣不明显的领域(新闻),而基于物品的算法更适合长尾物品丰富,用户个性化需求强烈的领域(电商、影视、音乐)。在系统的实时性上,基于用户的算法的立即变化不明显,但基于物品的算法可以立即变化。在冷启动上,从用户和物品两个角度来说,基于用户的推荐系统很难为新用户进行有效的推荐,但新物品可以很快被推荐给相似用户;基于物品的推荐系统不需要新用户产生许多行为就能进行推荐,但新物品需要时间更新其物品相似度矩阵,从而不能被马上推荐给用户。
以上基于用户行为的两种算法,无法解决一种问题:不同领域的两个热门物品,可能相似度很低,但由于用户行为而误将两者当作相似物品。从而引出了我们下一个算法:隐语义模型。
隐语义模型的核心思想是通过隐含特征联系用户兴趣的物品。先得到用户的兴趣分类,从兴趣中挑选可能喜欢的物品。协同过滤算法是基于统计的,而隐语义模型是基于自动聚类的,从用户群的意见出发,发现两个物品是否属于同一类,通过最终聚类的数量来区分不同粒度的分类。有了分类以后,再计算物品所属不同类的权重。当物品对于某一分类的权重较高,且与其他分类有区分度时,可以作为该分类下的典型物品。当用户对典型物品有行为时,即可以确定该用户的兴趣分类。隐语义模型的具体算法有:PLSA、LDA、隐含类别模型、隐含主题模型、矩阵分解。
三、推荐系统冷启动问题
推荐系统冷启动问题主要分为三类:
1.用户冷启动:新用户怎么做推荐
2.物品冷启动:新物品怎么推荐
3.系统冷启动:没有用户行为也没有用户,怎么做推荐
针对以上几类问题,有相应的解决方案:
1.热门物品作为推荐物品。不基于用户具体行为数据作为推荐来源,而是以物品的浏览量、订购量、收藏量、点评量作为推荐来源。这一方案的理论基础是,热门物品粗略的表示了用户整个群体的兴趣,从而能为用户整体进行推荐(区别于个性化推荐)
2.利用注册信息做粗粒度个性化。注册信息包括了年龄、性别、生日、职业、居住地等人口统计学信息。也包括了注册时让用户填写的兴趣描述。同时包括了关联其他社交媒体来进行用户兴趣数据的迁移(如提供微博、豆瓣登录方式,通过用户在微博、豆瓣上的兴趣行为来作为用户分群的标准)。基础算法是通过喜欢物品i的用户集合与具有特征f的用户集合的交集,来计算物品i是否具有特征f,从而将物品i推荐给所有具有特征f的其他用户。
3.注册时让用户进行兴趣反馈,如兴趣类型等。可以选择一些比较类型标签供用户选择,或选择某类型中热门、有代表性和区分度、多样的物品供用户进行选择。如《变形金刚》和《泰坦尼克号》。
4.通过物品标签属性,如作者、导演、演员、论文领域等进行推荐。以解决物品在没有用户行为时也能被推荐的问题。当内容具有很强的内容属性特征时,这样的推荐算法甚至可以超过协同过滤算法,如论文、github等。但如果内容推荐具有很强的个人兴趣喜好特征时,这样的推荐方式会弱于协同过滤算法。
5.专家分类。通过专家给用户进行特征分类,形成另一种多维度、多场景的分类标签,来解决无法通过足够用户行为数据进行统计或聚类的问题。
接下来的第4~6章,都是基于以上系统进行进一步的优化,从而提高推荐系统的各项评测标准。例如增加用户行为数据以外的数据来增加推荐系统的召回率、准确率和覆盖率,如标签数据、上下文数据和社交数据等。下面一一做分析:
四、利用用户标签数据
利用用户标签数据的代表应用有国外的Delicious和CiteULike,分别是对网页和论文打标签。用户为什么会给物品打标签呢?从社会维度来看,是便于上传者组织信息或其他用户查找信息,例如上传者希望通过某个标签,增加其他用户搜索到其上传物品的概率;从功能维度来看,是便于用户自己查找或表达某种信息,例如用户希望通过增加标签来进行信息的管理,或者表达自己对物品的观点。
基础算法其实是通过标签这一媒介,将用户和物品连接在了一起。在为某个用户做推荐的时候,先统计该用户的常用标签,在找到该标签下的热门物品,将用户未发生行为的物品推荐给用户。当然,有些热门标签和热门物品需要被降低权重,从而提高系统覆盖率。
当标签具有数据稀疏的特性时,例如某个标签只被几个用户使用过,某个标签下的物品非常少的时候,可以通过同义词来增加标签的用户和物品数量。如何判断标签之间的相似度呢,可以通过同时出现的物品数量占标签下物品总量的比例来判断两个标签之间是否具有相似性。
五、利用上下文信息:
利用上下文信息,主要是提高推荐系统的准确性,可以理解为推荐系统的场景化,也即根据用户当下所处场景进行符合场景的推荐。常见的上下文信息包括时间、季节、地点、心情、社交状态(是否独处,和谁在一起)、工作状态(是否工作中)等。
时间上下文信息是其中最重要的一种信息,因为越近的行为越能表示用户当下的兴趣,某些物品有生命周期和季节效应。时间特性在分析用户行为系统时,可以从以下三个维度去分析:
1.数据集每天独立用户数的增长情况,是增长、稳定还是流失。由此可以知道整个系统现在所处的周期。
2.系统的物品变化情况:可以理解为物品流行度的衰减情况。如新闻的周期(在几天内维持超高的热度,然后迅速衰减,被其他新闻取代)。同时可以对物品相隔T天流行度进行相似度计算,找出那些具有相同时间特性的物品分类。
3.用户访问情况:用户平均活跃天数。
利用时间上下文信息,可以提高推荐系统的实时性。同时,在短期行为和长期行为重做出平衡,既要及时响应短期行为,同时保持长期行为的延续性。例如音乐推荐系统,用户长期的音乐喜好可能是一致的,但短期内可能对其他音乐类型产生短暂的系统。此时系统既要针对这种短期变化做出立即反映,为用户推荐短期兴趣的相关物品,同时也不能完全抛弃长期兴趣的推荐。
利用时间上下文信息,还能提高推荐系统的多样性。不仅是用户有新行为的时候要及时响应,当用户无新行为的时候也要定期变化推荐结果,特别是对于那些流行度衰减较快的物品,更需要更快的变化推荐结果,将新物品纳入进来。
除了时间上下文,还有一种常用的上下文信息是地点位置。这是因为研究发现,兴趣与地区有关,例如美国和中国的年轻人的兴趣不一样,上海和黑龙江的年轻人的兴趣可能也有较大不同。纳入地点位置信息可以为推荐结果增加地区特性。另外一个理由是,活动范围与地区有关,特别是线下活动(如展览、音乐节、餐馆等),要考虑用户活动范围来进行附近的线下活动的推荐。
六、利用社交网络信息:
利用社交网络信息是基于一个研究结论:好友推荐可以增加推荐系统的信任度。在没有推荐系统的时候,我们拓展物品的选择往往是基于社交网络:比如问问学长和老师哪本书适合当前的课程,问问兴趣相仿的小圈子哪部电影好看、哪家餐厅好吃。
社交信息的获取途径有许多,比如电子邮件、用户注册信息、位置数据、论坛和讨论组、即时聊天工具。社交网站等。获取用户的社交信息后,可以为用户推荐其社交圈子内其他人在看、在买的东西,从而增加系统的信任度,同时也是解决冷启动的一种方式。
以上,我们已经介绍了推荐系统的组成、冷启动、优化方式。下面则要综合上述所有理论,来搭建一套推荐系统了。
七、推荐系统实例
推荐系统的组成如图:

推荐系统需要满足一些任务:将多样的新物品(长尾物品)推荐给用户;运营推广的需求;利用上下文信息使推荐结果更符合系统特性和用户场景。
在了解了推荐系统的基础架构和任务目标后,可以梳理得到推荐系统的流程:

总结:以上是我对《推荐系统实战》一书的读书笔记,主要是为了梳理书中的中心思想和主要观点,省略了很多实操的公式与代码部分(本人非工程师,对实际执行没有需求,当然也是因为公式和代码不是很好打……)。总的来说本书还是对非工程出身的人非常有好的,也可以作为产品运营童鞋们了解推荐系统的来龙去脉,厘清推荐系统要素并设计出合理的产品运营方案,应用到实际工作中去的一本非常好的参考资料。
网友评论