摘自:http://www.infoq.com/cn/articles/user-portrait-collaborative-filtering-for-recommend-systems
我们会从一个真实的案例出发,虽然我们做了很多的推荐系统的案例,但毕竟不能把客户的数据给大家看,所以我们用了一份公开的数据,这份数据和我们之前讲的场景是相似的。这份数据来自于 Kaggle,叫做 Criteo 点击率预估比赛。
数据预览
首先我们看数据的样子,第 1 列 col_1 代表的是广告有没有被点击,1 代表被点击,0 代表没有被点击。然后我们看第 2 列到第 14 列,都是数值型的特征,因为这份数据已经被匿名化了,所以我们可能也不知道这些数值代表什么意思,也许是这个用户的 PV,或者标签的权重,不过我们也不需要知道。然后看第 15 列到 40 多列,这些都是离散的特征,这些特征都做了哈希化,都做了匿名处理。
(点击放大图像)
这个数据有 3000 万行 40 多列,按照我们传统的做法,进行特征工程以及 one-hot 编码后,会有 4000 多万个特征。真实的业务数据中,训练数据体积会更大,往往达到上亿,同时原始特征数量会达到上百,因为为了好的个性化效果,我们会使用诸如 GPS 坐标、手机型号、ip 地址、最近浏览内容等等精细化的特征,并进行非常极致的特征工程,这样的模型在特征工程之后的特征数会达到数亿甚至几百亿。这样规模的机器学习训练,挑战的不仅是算法,更是如何在成本可承受的计算资源上进行训练和实时预估。
开发这样一个规模的可以并行运行的系统的挑战更加大,即使 BAT 这样的大公司也会养一个百人的团队,只为了做好机器学习模型训练和预估的工程实现。下面我们会看到利用第四范式的先知平台去做这件事情,会大大降低我们开发和运维一个在线机器学习系统的成本,让我们更加聚焦在业务本身。下面我们会看到在先知平台上对这份数据的建模会非常简单。
数据拆分
首先我们把这份数据拆成了训练集和测试集,以 9:1 的方式。当然这可能是不太合适的拆分方法,因为真正训练一个机器学习模型,它的拆分是按照时间排序后再拆的,就是用前面的时间来训练模型,然后用这个模型来预测点击。这样训练和测试在时间上是正交的,那么模型如果在这种实验设计下有好的效果,这个效果就会有时间平移性,上线后就会有好的效果。当然,为什么我们在这里没有使用按照时间排序拆分的方式,是因为参考了一篇论文的做法,这样同样的做法结果可比。在真实的业务中,不建议大家按照这种方式来处理数据。
特征工程、模型选择和评估
然后就是做特征工程了,一般来说大家可能觉得很难,但只需要告诉电脑哪个是 Label,其他的直接默认配置就好了。但天下没有免费的午餐,特征简单处理,我们要有更强的模型,所以我们用了线性分型分类器。
(点击放大图像)
一般来说,推荐系统中会有离散特征和连续特征,当我们用逻辑回归这种宽的离散线性模型的时候,我就会遇到一个很大的问题,就是我需要对特征进行分段,这样才能学到连续特征的非线性结构。比如说用户年龄对点击率的影响,它并不是线性上升的,它可能会上升到 30 岁,然后就下降了,甚至有更复杂的模式,这些是非线性的特性。所以我们可以用机器对连续的特征做自动搜索分段,这样的预处理效率就大大提高了。线性分形分类器就是做的这样的事情,基本上我花了不到 5 分钟,就跑出了 0.796 的 AUC。
当然这里进一步说一下,评估上线的时候,不能只是看 AUC。例如说,我要看的是 User AUC,或者每一刷的 AUC,因为模型的排序能力,一部分来自于对每个用户个性化的识别能力,另一部分来自于对用户本身的识别能力。比如说有些用户就是什么都爱点,什么都点,而有些用户基本只看标题不点开。我们把这样的人分开,对个性化推荐是有帮助的。所以我最终应该看的是,在每一个用户身上的 AUC,甚至是每一次展现的 AUC,当然先知也提供了工具,就不多赘述了。特征组合
但我还是想让这个模型更好,怎么办呢?在做推荐系统的时候,特征工程最重要的处理方法是特征组合。比如说有两个特征,一个是性别,另一个是新闻的色情等级。我们可能会注意到,男同志比较喜欢火爆的新闻,女同志可能正好相反。我把色情等级作为一个特征,可能两边的喜好不同导致最终这个特征整体对点击率的影响和一个随机数一样,它就不是好的特征,没有预测能力。
但如果我把这些特征组合起来,我就对这些空间有更细致的分割能力,我就会做出很好的效果。性别、用户 ID 和新闻色情等级组合起来,是新闻推荐非常有用的特征。进一步说,假如我们有 100 个特征,那么特征两两组合的空间,就是 一万个,这是个很大的工作量。
。。。
Q2: 推荐系统,都有哪些方案解决冷启动问题,百万级用户的推荐系统,一般用什么样的框架
周开拓: 推荐系统冷启动是个很大的话题,可能这里只能给大家一些简单的例子。冷启动分为用户的冷启动和整个推荐系统的冷启动,整个推荐系统的冷启动就是在搭建推荐系统之前,我能否已经收集了一些用户行为的数据,如果有的话,可以构造一些弱一点的模型,比如说用 CF、SVD、热度这样的方法对内容做一些初步的排序和筛选,同时配合一些简单的基于 query 的策略,比如最新、最热、最多评价等等先构造一个差一点但是比随机强很多的推荐列表。如果数据基础更好,也可以用其他场景的数据来构造 label、样本来进行建模。而用户的冷启动,归根结底就是在用户进入产品之后,尽快有效地获取他的信息,一方面可以通过产品的手段来实现,一方面可以通过第三方数据合作的方式来实现,比如说这个人如果是微博注册的话,如果你能够收集到一些公开的微博数据,就会对冷启动很有帮助。关于架构的话,刚才已经介绍很多了,您可以参考。
Q6: 特征组合的方式是什么?怎么拼接在一起?
周开拓: 特征组合其实很简单,比如一个特征叫做身高,分高矮,一个特征区分穷富,还有一个特征叫做帅和不帅。那么高富帅就是一个组合特征,他对人的描述能力就强于之前任何一个单独的特征。