读《推荐系统实践》
网络上有很多开源的推荐系统实现,细节请参考这里。下面是《推荐系统实践》中引用的推荐系统设计建议:
- 确定你真的需要推荐系统。推荐系统只有在用户遇到信息过载时才必要
- 确定商业目标和用户满意度之间的关系,要平衡企业的长期利益和短期利益之间的关系
- 选择合适的开发人员
- 忘记冷启动的问题。互联网上有任何你想要的数据。只要用户喜欢你的产品,他们就会不断贡献新的数据
- 平衡数据和算法之间的关系。使用正确的用户数据对推荐系统至关重要。对用户行为数据的深刻理解是设计好推荐系统的必要条件,因此分析数据是设计系统中最重要的部分。数据分析决定了如何设计模型,而算法只是决定了最终如何优化模型
- 找到相关的物品很容易,但是何时以何种方式将它们展现给用户是很困难的。不要为了推荐而推荐
- 不要浪费时间计算相似兴趣的用户,可以直接利用社会网络数据
- 需要不断地提升算法的扩展性
- 选择合适的用户反馈方式
- 设计合理的评测系统,时刻关注推荐系统各方面的性能
什么是推荐系统
推荐系统的基本任务是联系用户和物品,帮信息的消费者与生产者解决信息过载的问题。如上图所示,推荐系统中常使用三种方式关联用户和物品。和搜索系统相比,推荐系统更多应用于用户没有明确需求的时候
推荐系统存在于各类不同的系统中,例如:电子商务(京东、亚马逊)、视频音频(Youtube、抖音)、社交(twitter推荐好友)、个性化阅读(腾讯新闻)、基于位置的服务(Foursquare )、个性化邮件(邮件按重要程度分组)、计算广告学(Facebook 分发广告)等等。虽然应用场景不同,但有些工具是通用的,比如:类似的商品、买过的也买过、打包销售、推荐理由等等
系统评价
准确的预测并不代表好的推荐,好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野, 帮助 用户发现那些他们可能会感兴趣,但却不那么容易发现的东西
一个推荐系统的性能需要从多个不同的角度进行评测,例如:用户满意度、准确度、覆盖度、新颖度、惊喜度、信任度、透明度、实时性、健壮性(防作弊,使用代价高的用户行为)等,实验方法有离线、用户调查和在线 AB 实验,简介可以参考这里
相关性算法
UserCF & ItemCF
UserCF & ItemCF 都是基于领域的算法
同一个师门师弟一般找师兄推荐书籍是基于用户的协同过滤(User Based Collaboration Filter)推荐算法的典型实例,同一个师门有相同的专业和课题,专业上需要阅读的书籍自然相同或者类似
随着用户量的增加,基于用户的协同过滤算法所需要的计算量越来越大。相比于用户,物品的属性变化没那么频繁,所以可以计算物品之间的关联度,推荐与用户购买商品类似的商品,这类方法被称为基于物品的协调过滤
对比
- 基于物品的推荐可以提供解释性更好的推荐理由,比如:因为你买过…
- UserCF 的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而 ItemCF 的推荐更加个性化,反映了用户自己的兴趣传承。UserCF 适合新闻类推荐,同时抓住了热点与时效性
惩罚机制
为避免热门物品对推荐效果的影响,推荐算法一般会对热门物品引入惩罚
隐含语义模型
隐含语义模型的的核心思想是通过隐含特征( latent factor) 联系用户兴趣和物品
上面介绍的 ItemCF/UserCF 都是基于用户行为的推荐。隐含语义可以利用更多的数据对物品进行分类,比如通过机器学习算法对歌曲、电影和用户进行分类,然后寻找与用户喜欢物品类别相同的物料进行推荐
使用机器学习算法对物品进行分类后类别可能不太好解释,但机器可以发现人不易察觉的物品类别
基于图的模型
将用户行为表示为二分图模型后,推荐算法的任务就是在二分图上给用户进行个性化推荐。如果将个性化推荐算法放到二分图模型上,那么给用户 u 推荐物品的任务就可以转化为度量用户顶点 vu 和与 vu 没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高
图中顶点的相关性可以通过几个方面进行判断:两个顶点之间的路径数、两个顶点之间路径的长度和两个顶点之间的路径经过的顶点。如上图所示,用户 A 和物品 c、e 没有边相连,但用户 A 和物品 c 和 e 有最短长度为 3 的路径相连,通过路径的长度,可以判断用户和物品的关联度
推荐系统框架
数据是推荐系统的灵魂。互联网行业中,用户的行为一般以日志的形式记录与保存,如上图所示。下图是更为详细的推荐系统框架图
下面对上图中部分模块的功能做简单的介绍
- 过滤
- 因审查或者质量原因,部分物品不能展示
- 用户过去一段时间内看过一些物品,或者说用户明确表示不喜欢的物品,应该过滤。可以使用曝光队列
- 排名
- 提升推荐结果的新颖性、多样性等属性
数据
利用推荐系统可以获得一些不太直观的关联关系,比如:啤酒和尿布
冷启动
推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣,因此大量的用户行为数据就成为推荐系统 的重要组成部分和先决条件。对于新的用户、物品或者系统,在没有积累数据的情况下如何实现个性化推荐就是冷启动需要解决的问题
常见的冷启动策略有如下方法:
-
提供非个性化的推荐,非个性化推荐的最简单例子就是热门排行榜
-
利用用户的注册信息
- 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化。相同地域的人相关性比不同地域的人要强;女性和男性关注的物品很大程度上也不同
- 利用用户提供的兴趣描述,例如起点用户注册时会询问用户的阅读偏好:玄幻、仙侠、武侠等等
- 从其他网站导入用户的一些信息,这个需要用户授权。腾讯拥有视频、音频和阅读等不同产品线,如果用户只使用 QQ 或者微信号进行登录,则用户在不同产品的行为可以互通
- 注册时给出一些热门物品,让用户选择是否喜欢,随后可以进行推荐
-
利用用户的社交网络账号登录(需要用户授权),导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品
-
对于新加入的物品,可以利用内容信息,将它们推荐给喜欢过和它们相似的物品的用户
-
在系统冷启动时,可以引入专家的知识,通过一定的高效方式迅速建立起物品的相关度表
- 以起点为例,书籍等类别很多时候由专业的编辑给出
用户行为
用户行为数据分为两大类:显性反馈(用户评分等)和隐性反馈(网页浏览与访问时间等)。从用户行为数据可以获得一些通用的结论,比如:
- 长尾效应(Power Law),长尾适用于用户和物品的活跃度
用户标签
给用户推荐拥有其喜欢特征的物品也是推荐的一种方式,以书籍为例,用户喜欢的特征可能有作者、出版社、主题和关键词等等
标签是一种无层次化结构的、用来描述信息的关键词,它可以用来描述物品的语义。根据给物品打标签的人的不同,标签应用一般分为两种:一种是让作者或者专家给物品打标签;另一种是让普通用户给物品打标签,也就是UGC(User Generated Content,用户生成的标签)。下图截取自豆瓣书籍标签,常用标签是系统推荐给用户的标签,一般用于提升标签质量
使用标签体系进行推荐有其自身的特色,例如并不是所有的标签都能用来推荐,比如“不喜欢”标签。下图源自豆瓣读书中的豆瓣猜,标签云推荐给出了一定的推荐解释
上下文信息
上下文包括用户访问推荐系统的时间、地点、心情等,对于提高推荐系统的推荐系统是非常重要的。比如,一个卖衣服的推荐系统在冬天和夏天应该给用户推荐不同种类的服装。上下文影响用户兴趣的例子有很多,比如用户上班时和下班后的兴趣会有区别,用户在平时和周末的兴趣会有区别,用户和父母在一起与和同学在一起时的兴趣有区别,甚至用户在上厕所时阅读的文章和在办公桌旁阅读的文章也是不同的
时间效应
用户的兴趣是变化的(推荐系统等实时性很重要) / 物品有其生命周期 / 季节效应
地点上下文信息
不同地区的用户兴趣有所不同,用户到了不同的地方,兴趣也会有所不同。在中关村逛街逛累了,希望寻找美食时,你可能会考虑几个因素,包括距离、价位、口味和口碑,而在这些因素里,最重要的因素可能是距离。因此,很多基于位置的服务(LBS)软件都提供了推荐附近餐馆和商店的功能
社交信息
根据调查显示,90% 的用户相信朋友对他们的推荐,获得用户的社交信息,就可以向其推荐其朋友喜欢的物品
社交信息的获取途径有:
- 用户注册信息(邮件、公司、学校等)
- 用户的位置信息(国家、民族、区域等)
- 论坛、讨论组、聊天工具、社交网站(微信、QQ和脸书等)
用户的社交信息也可以分为两大类:社会图谱(微信)和兴趣图谱(Twitter)