1.1 什么是推荐系统
information overload, 信息过载。比如你想看一部电影,打开豆瓣一搜,百年来上映的电影随你挑,这时候你很难做出一个选择,需要一个人或者一个工具为你做出推荐。
推荐系统的目的是解决两方面的问题,一是让用户发现对自己有价值的信息,另一方面是让信息出现在对自己感兴趣的用户面前。
搜索引擎和推荐系统对于用户来讲是互补的工具。搜索引擎满足了用户有明确目的时的主动查找需求,而推荐系统则是在用户没有明确目的时帮助他们发现感兴趣的东西。
推荐系统可以更好地发掘物品的长尾(long tail),即一些很冷门的项目。比如购物时,主流商品代表了绝大多数用户的需求,而长尾商品则代表小部分人的个性化需求,在互联网日益发展的今天,这些长尾商品常常也能带来巨大的销售额。
我们以看电影为例,可能用如下几种方式决定看啥
- 让朋友推荐。在推荐系统中这称为社会化推荐(social recommendation)
- 通过分析用户曾经看过的电影找到他喜欢的演员、导演等来给用户推荐相同演员、导演参与的其他作品。这叫做基于内容的推荐(context-based)
- 还有就是找一找与自己兴趣相似的用户,看看他们最近都看了啥。这叫做基于协同过滤的推荐(collaborative filtering)
1.2 个性化推荐系统的应用
1.2.1 Amazon
亚马逊商城中就有推荐算法的应用。一种是根据你浏览过的or喜欢的商品,推荐类似的其他商品;此外,它还会根据你的 Facebook 好友关系,把你朋友喜欢的东西推荐给你。这两种方法分别叫做 item-based 和 user-based。
此外,亚马逊还有相关推荐列表。当你买完一个商品后,它提供买过这个商品的其他人还买了什么,以及浏览过这个商品的人买了什么。这两种推荐的区别在于使用了不同的用户行为。此外,亚马逊以及一些国内的电商还使用了打包销售(cross selling):当你想要买一个商品时,电商会推荐给你相关的物品,如果你一起买的话,会有折扣。
1.2.2 电影和视频网站
Youtube 和 Hulu 等网站也有个性化的视频推荐系统。
1.2.3 个性化音乐网络电台
音乐的推荐显得有些特殊,它包含许多很好的特性使得它非常适合用来推荐
- 物品空间大
- 每首歌的消费代价小
- 种类丰富
- 每首歌耗时少
- 物品重用率高。用户经常会反复听同一首歌
- 上下文相关。用户的口味受到自己的心情、周围的环境等众多因素影响
- 次序重要
- 很多播放列表资源。每个用户会创建很多的个人播放列表
- 不需要用户全神贯注
- 高度社会化。好友之间频繁推荐自己喜欢的音乐
1.2.4 社交网络
包括给用户推荐好友等。
1.2.5 个性化阅读
1.2.6 基于位置的服务
位置是一种很重要的上下文信息,推荐给用户离他很近且感兴趣的服务时,他更容易去消费。
1.2.7 个性化邮件
1.2.8 个性化广告
广告推荐是以广告自身为核心的,目标是寻找它的潜在受众。目前的个性化广告投放技术主要分为3种
- 上下文广告。分析用户正在浏览的网页内容进行推荐
- 搜索广告。分析用户在当前会话中的搜索记录,判断用户的搜索目的
- 个性化展示广告。根据用户的兴趣来投放不同的展示广告
1.3 推荐系统测评
一个完整的推荐系统一般存在3个参与方:用户、提供推荐系统的网站、物品提供者。好的推荐系统应该兼顾三方,力求三方共赢。
1.3.1 推荐系统实验方法
- 离线实验(offline experiment)
离线实验的核心要素是全程在线下进行。一般是先构建数据集,然后划分为训练集和测试集,随后在训练集上训练、在测试集上测试,最后通过预先定义的指标在线下对算法在测试集上的表现进行评价。它的缺点在于无法计算CTR等商业指标。 - 用户调查(user study)
由于离线指标和商业指标往往存在着很大的差距,最准确的评估方式应该是做线上的测试,但是风险比较大,所以上线之前一般会做一次用户调查的测试。
用户调研能获得比较真实的用户体验的反馈,通常也会带来昂贵的开销,高昂的成本导致很难大规模地进行用户调查,而小规模的调研结果常常不具有统计意义。 - 在线实验(online experiment)
在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试。
它通过一定的规则将用户随机分成几组,并对不同组的用户采用不同的算法,然后通过统计不同组用户的各种不同的评测指标比较不同算法,比如可以统计不同组用户的点击率,通过点击率比较不同算法的性能。
1.3.2 评价指标
- 用户满意度
只能通过用户调查或者在线实验获得。
在用户调查中,满意度主要是通过问卷等的形式获取。而在在线实验中,用户满意度主要通过一些对用户行为的统计得到。 - 预测准确度
这是一种常用的离线方法。对数据集做训练&测试的划分,然后进行评估。它有几个可选用的具体指标- 评分预测。用模型去拟合 user 对 item 的评分,用 RMSE, MAE 等损失函数。
- TopN 推荐。根据用户的兴趣给出一个个性化推荐的列表,然后计算 Precision/Recall 等指标
- 覆盖率
覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。
C o v e r a g e = ⋃ u ∈ U R ( u ) I Coverage=\frac {\bigcup_{u\in U} R(u)} {I} Coverage=I⋃u∈UR(u)以图书推荐为例,出版社可能会很关心他们的书有没有被推荐给用户。覆盖率为100%的推荐系统可以将每个物品都推荐给至少一个用户。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。
另外,我们还常用信息熵和基尼系数来度量覆盖率
H = − ∑ i = 1 n p ( i ) l o g ( p i ) G = 1 n − 1 ∑ j = 1 n ( 2 j − n − 1 ) p ( i j ) \begin{aligned} H=&-\sum_{i=1}^np(i)log(p_i) \\ G=&\frac 1 {n-1} \sum_{j=1}^n (2j-n-1)p(i_j) \end{aligned} H=G=−i=1∑np(i)log(pi)n−11j=1∑n(2j−n−1)p(ij)
i j i_j ij是按照物品流行度p()从小到大排序的物品列表中第j个物品。 - 多样性
假设 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 =\not j } s(i,j)} {\frac 1 2 |R(u)|(|R(u)|-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 {|U|} \sum_{u\in U}Diversity(R(u)) Diversity=∣U∣1u∈U∑Diversity(R(u)) - 新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。 - 惊喜度
如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
假设一名用户喜欢周星驰的电影,然后我们给他推荐了一部叫做《临歧》的电影(该电影是1983年由刘德华、周星驰、梁朝伟合作演出的,很少有人知道这部有周星驰出演的电影),而该用户不知道这部电影,那么可以说这个推荐具有新颖性。但是,这个推荐并没有惊喜度,因为该用户一旦了解了这个电影的演员,就不会觉得特别奇怪。
- 信任度
如果用户很相信一个推荐系统,那么他们购买商品的欲望or可能性会更强。就类似于你一个靠谱的朋友向你推荐的电影更容易让你买票。
提升推荐系统的信任度有两种常用方法。一是透明化,让推荐系统为推荐结果提供解释/理由;另一种是让用户的好友提供推荐理由。 - 实时性
一方面是系统要实时地更新推荐列表来满足用户的行为变化,比如用户买完手机后马上就推荐手机壳之类的配件,大概率比第二天再推荐要好;另一方面是说系统要及时地把新加入系统的商品推荐给用户,这考察了系统的冷启动能力。 - 鲁棒性
系统要能应对攻击。比如商品恶意刷单、电影恶意刷分等。
判定鲁棒性的方法主要是注入攻击,我们对数据集加入一定的噪声,如果加入前后系统的推荐结果没有发生大的变化,则认为系统是鲁棒的。
提升系统鲁棒性的鲁棒性有若干常用方法- 一是使用代价比较高的用户行为,比如用户购买记录和用户浏览记录中应尽量使用前者。
- 二是进行攻击检测,对数据集进行清洗然后再进行使用。
- 商业目标
最本质的商业目标就是平均一个用户给公司带来的盈利。
不同的网站具有不同的商业目标。比如电子商务网站的目标可能是销售额,基于展示广告盈
利的网站其商业目标可能是广告展示总数,基于点击广告盈利的网站其商业目标可能是广告点击总数。
1.3.3 评测维度
- 用户维度。人口统计学信息、活跃度等
- 物品维度。属性、平均分等
- 时间维度。季节、工作日等
一个算法可能整体上不太好,但是在某些维度表现还不错,这时候我们就可以根据具体的情况进行算法的融合,提升系统的整体性能。