怎么做好一个推荐系统

我一直自诩是菜刀流的工程师,作为一个非科班出身的数据小码农,竟也操刀过三个推荐系统的项目了。这三个推荐系统,用户群不同,业务场景不同,连地域和文化也有些差别。所以近来总在琢磨,推荐系统的缘起千人千面,纷繁万变的细节当中,能不能汇聚出一些普遍共性?有没有一个普适的标准,回答什么是一个真正出色的推荐系统?有没有哪些不二法则,是构造一个推荐系统所不可或缺的?我希望迈出这一步,把之前想过的梗、跳过的坑以及卑微的沉思亮出来,等待真正的高人点拨一二。

推荐系统的先决条件

这其实是最容易被忽视的一个问题。尤其在这几年大数据的概念炒得火热,推荐系统也就成了某些人眼中的仙丹妙药,不管三七二十一,先上了再说。在我看来,推荐系统至少需要评估下面三个可行性:

要有足够的数据

一种常见的错误思路是,我的社区不够活跃,上个用户推荐系统加强活跃吧。如果你抱着这样的想法,我只能恭喜你选择了一种艰苦卓绝的逻辑。推荐系统是数据挖掘的一种应用,而没有数据,通常都不会产生什么有价值的挖掘。

要有丰富的内容

推荐系统起源于亚马逊的图书推荐。但有没有人细想过,为什么亚马逊是第一个吃螃蟹的人?因为贝佐斯把书店搬到网上后,他发现自己拥有了全世界最多的图书,在一家库存数百万种图书的虚拟书店里,你根本无法依赖任何一个店员帮你的顾客推荐新书。而另一种常见的错误思路是,在内容未丰富的前提下就急着上推荐系统。事实上,只有内容极大丰富的时候,才可能有被无用户差别排行榜埋没的优质内容,个性化需求才能体现出商业价值。如果你的内容在一万以下,我会建议你使用单一的热门排行榜;十万以下,我会建议你使用分类的热门排行榜,十万以上,才慢慢有推荐系统的可行性。

要有用户分众

数据充分了、内容丰富了,还得掂量下用户的口味能不能产生足够的分众。推荐系统之所以在电商、音乐和社区等领域有成功的应用,最主要的因素是这类产品的用户有足够的分众。而越是大而全的领域,用户的分众越明显,推荐的效果越好。好比淘宝的推荐颇受赞赏,而唯品会的推荐多被吐槽,道理就在这儿。如果你说你正在做同志社区或情趣电商,我会心里一凉。

推荐系统的问题

先决条件通过了,我们来讨论「术」的问题,你可以把这节的内容当作「跳坑实录」来读。

热门和长尾的矛盾

第三种错误的思路在于,推荐系统以提升点击率为目标,而往往横向对比之下,个性化推荐的指标往往不如热门排行榜。对此一小部分算法人员铤而走险,希望用热门混杂长尾的方法去得江山抱美人,而在我看来,推荐系统有且仅有一个目标,满足用户的个性化需求。至于你说点击不如推热门?那把排行榜留着呗,那才是赚点击率的地方。

基于内容还是协同过滤

推荐系统的本质在于加强联结,或者说,给用户源源不绝发现新东西的机会。所以协同过滤(或者往更宽泛的范围,矩阵分解也算)都是在利用联结的信息,从而取得比基于内容更好的推荐效果。但是,了解你所拥有的内容,作为辅助的算法,绝对能使推荐的质量大幅上升。但是算法人员面临的现状往往是,很难得到格式化的内容标签,一个可行的思路是,请用户来为内容打标签,参照豆瓣和淘宝。另一个决定选择的因素是数据特征,如果用户行为集中而稀疏,那么意味着你必须更多依赖内容的信息。

负样本的问题

协同过滤是基于统计的算法,并不需要负样本的信息,但如果是基于机器学习的算法,训练的过程是需要负样本的。有的产品只有用户的隐反馈(比如播放、购买),即用户无法表达对一个内容的厌恶,那么你只有创造负样本了。在这一块,最好的思路是,选择热门的但用户没有行为的样本,因为热门的内容更有机会让用户看到,用户看到多次但没点击,那就更可能是不喜欢。

冷启动的问题

应对冷启动的策略要按照业务场景区分,如果是用户看了一个内容,要给他推荐其他的内容,那么可以利用内容特征的相似度;如果是对一个新用户推荐,条件允许的话,可以请用户表达自己的偏好,或者依赖社交网络的信息,实在不行,只能推热门了。

推荐系统的实施

我希望把实施中的一些Keypoint单独罗列,大家都懂的东西,暂时不讲。

借助更多信息

我的风格是做推荐之前一定要把产品用坏,来确定能获取到哪些用户行为和用户数据,能获取的尽量获取。比如,用QQ邮箱的和用Gmail邮箱的用户肯定有些不一样,对不?

研究数据之间的相关性

这就是熵的概念。如果两个数据相关性是1,那么肯定有一个没什么用处。用好回归,你会少很多运算量。

弄清你的业务场景

有的人会把业务场景叫做「推荐的上下文」,事实上推荐算法的许多细节都会被业务场景影响,比如以物推物的场景就会更适合采用ItemBased,一个一个展现的可以考虑加入点随机性,首页推荐应该多放新品,等等。

定义好你的目标

我习惯了做事之前目标先行,目标错了跑得再快也没用。推荐算法的长期目标应该是提升用户的活跃(注意,不是活跃率),而对于短期指标,应该着重在几点:有没有更多的内容被发现?热门排行榜的更新是否加快?用户对于推荐的点击是否在一个比较活跃的水平(再次,我反对一概而论)?如果是UGC的产品,用户有没有因为更容易被发现而积极地上传内容?当然,这些指标都必须被量化。

良好的引导

记得之前去听百分点科技的演讲时,他们提到会有人专门去研究推荐系统的引导,甚至有时候引导比推荐的内容更重要,深有同感。这也是社交推荐为什么不需要什么模型却效果很好的原因。记住一点,如果推荐的区域有任何的图片或数字时,想办法让它们更有诱惑力。

收集更多反馈

推荐系统一前一后的数据流都不容轻视,我同样倾向于收集一切与推荐系统有关的数据,比如推荐区域的停留与点击、推荐内容的消费、连续点击推荐内容的链条等等。如果可能的话,请用户对你的推荐给予评价,这也能让你的推荐更有温度。

离线实验

不要迷信离线实验的结果,通常和线上都会差很远。如果之前不存在推荐系统,那么用户很可能根本就没有机会接触到你推荐的内容,也就无从证实。

耐心

推荐系统并不是一个立竿见影的产品,上线之后多花点时间收集数据、调整参数、做更多的分组测试,更重要的是,让你的老板也有耐心。