推荐系统从零到一

可以说是全拜谷歌吹起了「大数据」这阵春风,近几年业界对于数据挖掘人才的需求持续高涨,而推荐系统一直是数据挖掘岗位的必修课。一联系到数据挖掘,总会给人高深莫测的错觉,以为推荐系统也是数学神童的专属领域。万万没想到,自己并不是数据挖掘科班出身,也谈不上数学功底有多好(本科考高数也就在生死边缘),竟然也操刀了三个业务场景不同、用户规模千差万别、甚至连地域和文化也跨度很大的推荐系统,而且评价指标和用户反馈还颇为正面。可见推荐系统没有那么曲高和寡(至少不需要去进修个数学博士,笑),我相信如果一个出色的程序员理解了推荐系统的方法论,那么他就能在短时间内做出一个有实效的能提升平台活跃的推荐系统。

推荐系统的本质是行为的关联

推荐系统的核心是为用户提供个性化的内容。而实现的方式不外乎根据用户的历史行为去预测未来的潜在点击。一个成功的推荐系统,一般要从两个维度体现它的价值:一是帮助用户发现没接触过但会喜欢的有新鲜感的内容;二是提升平台的点击活跃程度,让长尾内容得到更充分的曝光

如果把推荐系统比做一桌丰盛的菜肴,食材将来自于全平台用户的历史行为,历史行为所表达的是用户对于内容的一种喜好程度,有可能是点击、收藏、下载、评论、点赞等。不管算法选型如何,推荐系统的工作流程是一致的:通过单一用户的历史行为揣摩该用户的喜好,然后搜索全平台的用户行为,根据用户喜好的相关程度对内容进行排序。而排序的标准取决于算法:基于内容(以Item为特征)、基于用户(以User为特征)还是矩阵分解(以矩阵分解后的隐含变量为特征)。所以,推荐系统的本质是关联单一用户与全平台用户的行为,为其找到「臭味相投」的人所喜好的内容,这样就是「协同过滤」中「协同」二字的含义。

并不是所有场景都需要个性化

这是最关键但却最容易被忽视的问题。大数据风一来,推荐系统就成了许多Boss眼中包治百病的仙丹妙药,不管三七二十一,一定要在产品前期上线推荐系统。但以我的经验,推荐系统要取得成功,至少要具备以下3个先决条件:

  1. 要有足够大的数据。一个常见的误区是,社区不够活跃,上了推荐系统没准会增加活跃吧?而实际上缺乏数据就很难有精准的推荐(用户关联过于稀疏),自然也不会带来多少可观的点击。
  2. 要有丰富的内容。数据大并不代表内容就足够丰富,点击都集中在少数的内容也是有可能的。推荐系统的鼻祖是亚马逊的图书推荐,有没有人细想过,为什么亚马逊是第一个吃螃蟹的人?当时贝佐斯把书店搬到网上后,发现亚马逊拥有了全世界最多的图书,在一家库存数百万种图书的线上书店里,你根本无法依赖编辑去为顾客推荐新书,所以才有了推荐系统诞生的土壤。事实上,只有内容极大丰富的时候,才可能有被无用户差别排行榜埋没的优质内容,个性化的需求才能出现需求到商业价值的跨越。如果内容的量级在一万以下,单一的热门排行榜足以满足大部分用户发现内容的需求;一万以上十万以下,分类的热门排行榜足以满足不同喜好用户发现内容的需求,十万以上,推荐系统的必要性才开始凸显
  3. 要有用户分众。数据充分了、内容丰富了,并不代表推荐系统就水到渠成,还得掂量下用户喜好能不能形成产生足够的分众。推荐系统之所以在电商、音乐和社区等领域有成功的应用,主要因素就是这类产品的用户有足够的分众。目标用户越是大而全,分众越明显,推荐的满意度越高。不用看数据,也能猜到淘宝的推荐会比唯品会的效果好太多,因为上淘宝的用户喜好差异度会远大于唯品会。

推荐系统的步骤

1. 定义目标

凡事要有成效都必须坚持目标导向,如果一个项目的成果不能被准确衡量,那么前景注定是危险的。推荐系统长期都是为提升平台的活跃度而生的,与团队的商业价值目标是一致的,但短期内两者或许会有冲突:平台的展示位置有限,推荐系统上马后会分流掉热门内容的点击量,而商业价值往往要建立于热门内容之上。所以上马之前一定要与负责确定商业价值的人协商(也许你的CEO、也许是市场团队的头儿),在推荐系统的设计中兼顾到一部分的商业价值目标。关于推荐的评价指标,个人建议可包括下列选项:推荐系统覆盖的内容数量、推荐内容的点击率(A/B测试)、推荐系统上线前后的内容产生量(对于UGC平台)、推荐系统上线前后TOP100内容的变化,同时也要留意推荐内容区域的浏览行为数据(推荐系统本来就是个离产品很近的事),比如停留时间、点击的频次、翻页的频次。

有的平台会在推荐结果的下方提供用户的反馈按钮,但是我建议这种反馈听听就好,不必当真,主要还是看实际的数据表现。用户反馈总是会过分的积极,容易让人忘乎所以。

2. 深入业务

做数据的如果不了解业务,基本就废掉了。我的习惯是做推荐系统之前一定要把产品玩熟用坏,尽量获取更多的用户、内容和行为的数据。打个比方,用QQ邮箱的和用Gmail邮箱注册的用户肯定有些不一样,对不?除了收集数据,熟悉推荐的业务场景(行话叫「推荐的上下文」)也很重要,事实上推荐算法的选型也会受业务场景的影响,比如以物推物的场景就更适合内容特征的算法,一个一个接连展现的可以考虑加入点随机性,首页推荐列表应该多放新内容。

3. 算法选型

既然推荐系统的本质是行为的关联,那么协同过滤(这里把矩阵分解也算协同过滤的一种)都是在利用关联的信息,通常都会比基于内容的推荐效果要好。不过现实中单一的算法都很难获得很高的准确率,适当结合内容自身的属性有助于提升推荐的满意度,举个例子,服饰电商平台中Item的品牌信息对购买者就很关键(所有女人都懂的,对不?),如果能建立起一个User的品牌偏好,或者进一步讲,品牌与品牌之间的关联度,那么爆表的推荐质量简直是手到擒来。如果平台原有的行为数据就是关联很稀疏的,协同过滤就很难发挥所长,这时基于内容的推荐就有用武之地了。

4. 冷启动与负样本

冷启动可分为User的冷启动和Item的冷启动,如果是要对一个新内容推荐相关的其他内容,那么可以多多利用内容特征的相似度;如果是对一个新用户推荐,可以利用起社交网络的信息(比如该用户的QQ好友的喜好);或者推随机的热门内容,再评估用户的点击快速调整(实时推荐的好处出来了);最后的办法也只有给新用户一个表达自己喜好的界面了。

协同过滤是基于统计的算法,并不需要负样本的信息,但如果采取了机器学习的算法,训练的过程是需要负样本的。大部分产品设计的时候不会提供用户的负反馈入口,用户无法表达对某个内容的厌恶,也就是现实数据并不存在负样本。但是负样本其实是可被创造的,我常用的一种做法是选择热门的但没有产生用户喜好的样本,因为平台的热门内容往往有更高的曝光率,用户反复看到但没产生点击,那就潜在的表达了一种厌恶。

一直觉得推荐系统是个业界十分特殊的场景,站在了通往技术、数据、产品和商业四条岔路的交叉口。所以做推荐系统是一个锻炼程序员综合能力的好活,而事实上高深算法是推荐系统中最次要的部分,对于数据和产品敏感的技术人更容易取得成功。

广告:2shou试用过国内外超过10个的主机服务商,Linode是综合评价最高的一个。如果你恰好需要云主机,这是一个邀请链接,让你获得额外的10美元优惠。