那么接下来:基于已知的 x 和 y,我们要为机器学习构造样本。什么是一条样本?一个样本代表机器学习预测的一个最小粒度的事件。当你把一条内容展现给用户,用户点击或不点击,这就代表了一个最小粒度的事件,就是一条样本。再比如说我们给用户展示了 10 条新闻,用户对应每个新闻点击或者不点击,就是 10 条样本。
推荐系统的场景思考
样本构造还需要考虑场景的问题,比如说我们会遇到一个问题,屏幕的大小是不一样的,同样展示 10 条新闻,我怎么知道用户有没有看到它。如果没有看到就不应该作为一条样本。这时候就有两种解决方案,第一种解决方案是把用户真正看到的纳入进来,因为前端是你设计的,所以你会知道哪些内容是用户的可见范围内。 当然这会让客户端变得更重一些。
第二种是一个比较简单的方法,把内容的位置作为一个特征。因为我们知道,同样是一屏幕展现 10 行内容,即便是一样的内容,用户也会选择一个他舒服的位置去点,这个可能是偏中上的位置。所以当新闻在第三个位置被点击的时候,这可能是一个容易被点击的位置,但不一定代表这个新闻比其他新闻要好。那我们怎么办?我们就要通过某些手段,把这些偏置吸收掉,所以我们会把位置、屏幕大小等作为特征,通过特征工程的方法来吸收这个偏差,变成无偏的模型。
这时候有些人可能会问,这不是穿越吗?因为在给出预测的时候,是不知道内容最终的位置信息的。但这相当于把偏差的锅由位置来背了,这是机器学习推荐系统中的一个策略。
刚才我们已经构造好特征了,现在给大家讲怎么建模。大家可能会认为,前面的部分是快的,真正做机器学习,做特征工程、模型调参等,这些是慢的。但是今天我们会看到,在成熟的工业界里面,其实前面要花的时间会多很多,后面的内容在成熟的工具下会变得简单。
在先知上完成推荐系统的建模流程
我们会从一个真实的案例出发,虽然我们做了很多的推荐系统的案例,但毕竟不能把客户的数据给大家看,所以我们用了一份公开的数据,这份数据和我们之前讲的场景是相似的。这份数据来自于 Kaggle,叫做 Criteo 点击率预估比赛。
数据预览
首先我们看数据的样子,第 1 列 col_1 代表的是广告有没有被点击,1 代表被点击,0 代表没有被点击。然后我们看第 2 列到第 14 列,都是数值型的特征,因为这份数据已经被匿名化了,所以我们可能也不知道这些数值代表什么意思,也许是这个用户的 PV,或者标签的权重,不过我们也不需要知道。然后看第 15 列到 40 多列,这些都是离散的特征,这些特征都做了哈希化,都做了匿名处理。

这个数据有 3000 万行 40 多列,按照我们传统的做法,进行特征工程以及 one-hot 编码后,会有 4000 多万个特征。真实的业务数据中,训练数据体积会更大,往往达到上亿,同时原始特征数量会达到上百,因为为了好的个性化效果,我们会使用诸如 GPS 坐标、手机型号、ip 地址、最近浏览内容等等精细化的特征,并进行非常极致的特征工程,这样的模型在特征工程之后的特征数会达到数亿甚至几百亿。这样规模的机器学习训练,挑战的不仅是算法,更是如何在成本可承受的计算资源上进行训练和实时预估。
开发这样一个规模的可以并行运行的系统的挑战更加大,即使 BAT 这样的大公司也会养一个百人的团队,只为了做好机器学习模型训练和预估的工程实现。下面我们会看到利用第四范式的先知平台去做这件事情,会大大降低我们开发和运维一个机器学习系统的成本,让我们更加聚焦在业务本身。下面我们会看到在先知平台上对这份数据的建模会非常简单。运维体系 实时计算平台
数据拆分
首先我们把这份数据拆成了训练集和测试集,以 9:1 的方式。当然这可能是不太合适的拆分方法,因为真正训练一个机器学习模型,它的拆分是按照时间排序后再拆的,就是用前面的时间来训练模型,然后用这个模型来预测点击。这样训练和测试在时间上是正交的,那么模型如果在这种实验设计下有好的效果,这个效果就会有时间平移性,上线后就会有好的效果。当然,为什么我们在这里没有使用按照时间排序拆分的方式,是因为参考了一篇论文的做法(https://arxiv.org/abs/1703.04247),这样同样的做法结果可比。在真实的业务中,不建议大家按照这种方式来处理数据。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-77174-2.html
对这种日子是满意的