手把手带你做推荐(一):推荐分类和样本构造

窦融 2017-07-17 318 标签: 逻辑回归个性化推荐算法设计

导语

继上篇《个性化推荐101》之后,同学们反馈还不够详细,可能对没有做过推荐的同学初上手还是不知所措,或者会踩不少坑,故根据自己的经验分三篇出一个系列更加详细的指导文档(主要针对有监督二分类问题),一步步带大家入门,做推荐并不难,但是要做好也确实不易,欢迎大家一起学习一起进步。

一、推荐分类

从自身接触较多的推荐场景,我把推荐分为两类吧,

1、出号码包:这类场景一帮是针对某一具体事件,通过算法模型预测给出一批高潜的号码包,用于精细化运营。比如CLM中的拉新、拉活、拉回流和流失预警,针对某个或某类活动的高潜参与号码等等。这里我姑且把它也算做推荐的一类,因为严格说来它是推荐的一个特殊场景,因为推荐一般是1对多的情况,而号码包这类场景更多的是1对1。

2、个性化推荐:真正意义上的推荐,1对多的场景,在复数的物品中找出最可能符合用户喜好的推荐给他,所以看得出个性化推荐的效果和落地是最直接的,因为我能直接把用户喜欢的物品推给他而得到数据层面的落地,但是号码包一般还需要配合具体的运营策略进行再加工,所以落地较后者是不够直接,不够高效的,当然也能通过个性化推荐的方式去出号码包,这个后面也会讲到。

二、推荐步骤

1、 第一步:充分了解清楚推荐场景。这是很关键但是很容易被忽视的一步,很多同学接到一个推荐项目就马上开始搭特征训练模型了,其实在这之前你应该充分和需求方反复沟通清楚她们的诉求,比如标的群体是什么、事件或推荐的物品是什么、最终能以什么样的形式落地以及她们需求的目标和期望的效果是怎样的等等。只有都搞清楚了每个细节,才能对你要做的推荐有个大概的把握,才好规划下面应该要怎么去做好。

2、第二步:提取训练样本。作为模型搭建的第二步,着实关键,一个不精确的训练样本,会严重影响最终预测或推荐效果的可用性,而这里样本的正确选择,直接取决于对推荐场景的理解是否到位。下面讲讲具体方法:

(a)我们用的推荐算法更多是有监督的学习,就拿LR(逻辑回归)这类二分类算法为例,有监督的意思是我们是从已知去预测未知。首先针对一批用户群体,我们已经知道了他们针对这个推荐场景下的行为结果(标签),对于二分类问题也就是1或0(正样本或负样本),如参与了活动或没有参与,点击了游戏或没有点击等等,一般情况下有行为的用户作为正样本,当然也并不绝对,如流失预警中,流失用户是作为正样本的,因为我们的目标是预测可能会流失的用户。所以正负样本的选择取决于你的目标是什么。

(b)好,搞清楚了你的正负样本分别是什么后,再来看看应该分别选多少正负样本(正负样本比例),这里可能有两种不同的情况:

  • i. 正样本是少数。比如活动的参与、游戏的点击等等,这类情况正样本较负样本一般是极少的,所以我们就需要在充分保留正样本的基础上来选负样本,所以这类情况建议保留全部正样本,再按1:X的比例去选择负样本,X具体是多少并没有严格规定,可根据数据量适当决定,一般建议4、5比较合适。

  • ii. 正样本是多数。比如流失预警,流失用户作为正样本占大多数,负样本的留存的是少数,那这种情况就需要对正样本做一个抽样,再按1:X的方式去选取负样本。

(c)解决了正负样本的比例问题之后,就需要去框定你的群体范围,这个其实就是根据第一步的推荐场景来定的。这里存在两个点:

  • i. 取什么样本?比如拉新,那就需要取新用户群体;如果是流失预警,那就需要取还在活跃的用户群体;如果是某个活动,那就需要取在这个活动中有曝光的用户群体。总之取的样本中对正负样本的条件是公平的。

  • ii. 取多长周期?这其实是个比较tricky的问题,可以从以下几方面考虑:

    • 按需求,也就是根据具体推荐场景要求来定。比如需求的推荐场景就是月流失预警,那你的样本周期就选取一个月就好了,因为我们一般月流失的定义就是上月活跃下月流失,所以取一个月就比较自然。

    • 按频率,如果这个推荐场景是频繁做的,且变化比较大的,也就是说你的模型可能需要经常训练的,那可以根据这个变化频率来设定样本周期。比如例行化的活动,这类场景可能变化比较快,需要根据最近的情况来预测后面几天的情况,就可以把样本选取的周期缩短一些,具体还需根据具体场景情况来定。

    • 按数据量,某些场景可能用户的行为是比较稳定的,是可累加的,这类场景就需要考虑样本的数据量了,太大的数据量可能增加计算和存储,所以这里就需要在周期、数据量和你所拥有的计算资源上做一个平衡了。比如游戏推荐场景,用户在某类游戏场景下,对游戏的偏好一般是稳定的,不会随时间发生太大的变动,也就是说可累加,这里就根据数据量来定,一般情况下,如果单日数据量不是特别大,可以考虑覆盖7天的样本量,这样也能抹掉一周不同日带来的一些周期性变化。

(d)最终提取完毕的样本库表字段是这样子的:

  • 号码包
日期分区 用户标识 标签(1或0)
ftime uin label
  • 个性化推荐
日期分区 用户标识 物品标识 标签(1或0)
ftime uin item label

如果最终训练的时候,你的样本表和特征表可以分开输入模型来训练,在样本表时间分区上就有个需要注意的点:处于对例行化的支持,我们加入的日期分区,但对于一次训练来说,这里的日期分区一般只表示为一个日期分区,因此如果样本选取的周期为多天的情况,就需要保留多一个样本表存储保留每天日期分区的样本便于后续关联对应的特征表(因为为了保证不同天样本在特征周期上的一致性,一般会采取每天的样本关联前一天的特征,再合并关联后多天的数据用于模型训练,后面会详细讲到)。

3、第三步:搭建特征。样本准备好了,模型的训练就还剩下特征的搭建和算法的选择了。如果说样本的好坏决定了你的方向正不正,那特征的好坏就决定了你的效果大致高低水平,是整个过程最难最繁琐的一步。所以这里又划分出了大概两种不同倾向的做法:

(a)如果使用的是LR这类线性模型,想要刻画好非线性问题(绝大多数现实中的问题都是非线性的),就需要把特征做的足够复杂和准确,从而引入足够的非线性性来弥补算法本身的局限,使其能够拟合复杂的问题,可以说在这类算法下特征的好坏直接决定了模型的好坏,所以对开发同学在业务和数据上的熟悉和敏感程度要求很高,会花不少时间在特征的选取、组合等操作上。

(b)但如果你对现在的业务不够熟悉对数据不够敏感,是不是就不能搭建一个高效的模型来呢?也并不是,可以使用一些非线性的算法,比如FM、GBDT、XGBoost乃至NN,这些算法本身对特征提取的要求就没有那么高了,甚至能自动筛选出对模型有价值的特征,自动去做组合特征,一定程度上减少人工提取组合特征的工作。

(c)如果在缺乏特征数据的情况下,还可以通过CF(协同过滤)算法,只用用户对物品的1对1的行为数据矩阵来做基于相似度上的推荐,这里又可以大致分为基于用户的CF(user-based)和基于物品的CF(item-based);当然还可以通过word2vec这类文本算法把用户有行为的物品或其他少量特征扩展为高维空间向量,用向量间的相似度去做推荐,以弥补特征不足的现状。这些方法后续会慢慢介绍。

那到底选哪种做法比较好呢?我想更多的人肯定选择 b,能简单的输出效果不就好了!嗯同意,但是b方式并不是说不需要搭特征了,只是对特征的复杂度和精确性要求没有那么高,但是好的特征不是更能事半功倍,所以如果特征搭的好,一个简单的算法可能就会达到很好的效果,毕竟复杂的算法虽然对特征要求不高,但是相应要求的计算量也可能会较大。所以经常听到这样的事实,你用复杂的模型训练了好久出来的效果,可能还没有一个不懂模型的人用经验规则简单排序出来的效果好,说明对业务和数据的敏感在效果提升上的重要性。套用一句话呵呵,算法是死的,特征是活的。所以一开始还是建议同学们从特征入手,了解清楚如何搭建高效的特征,后续配合上合适的算法才能如虎添翼。下篇会着重讲下特征搭建的方式方法。

后续文章计划:

手把手带你做推荐(二):特征搭建

手把手带你做推荐(三):算法选择

相关推荐

个性化推荐101