yoho!buy注册概率预估


GRU 部分的demo代码:model.py,注意,其中上传的lr_classification.py并没有做wide&deep设计


前言

本文主要介绍yoho!buy大数据团队在深度学习传统应用方向上的一些实践和思考。传统用户行为预估方向上,如何根据用户的行为数据,对用户行为建模,进而预测用户的购买行为,点击行为,注册行为等等一直以来都受到工业界及学术界的关注。相对而言,就用户注册概率的预测受限数据获取的局限性、传统的计算模型的时效性等原因并没有很多可参考的研究案例。我们想和大家分享的「yoho!buy基于GRU+LR算法下的用户注册概率预估」,基于循环神经网络的框架,充分的利用了用户在app上的行为信息,保证了高效的结果反馈速度,兼备算法框架良好的延拓性能。

注册概率预估定义

注册概率预估,即预估用户下载app后,浏览app过程中主动注册的可能性。通过识别出有注册倾向的人群,辅助以人为介入的方式(优惠、折扣,关怀等),可以提高用户实际注册的概率。

基本的注册概率预估算法设计的流程如下:

数据整理节点:在于收集用户行为信息,包括地理位置,当时的时间,用户来源的渠道,用户点击行为等等;模型计算节点:在于根据数据整理节点的结果判断用户的注册概率高低;计算结果推送节点:在于根据不同注册概率用户采取不同的营销策略,个性化引导用户注册。

目前注册概率预估主要有两大难点:

  • 传统模型难以实时预测:因为缺乏平台忠诚度,用户第一次也有可能是最后一次登陆app之前这段时间是相对暂短,如何压缩用户每一次步操作下的模型计算时间,提高反馈频率是需要考虑的重要问题,而传统模型在这方面的表现比较平庸。
  • 传统模型特征加工复杂:因为用户可能是第一次接触app,在没有注册信息,历史行为信息,完成订单信息等等数据下,利用有限的数据进行的特征处理,如果想要有不错的效果相对而言特征加工过程的复杂程度和难度要比普通的项目更加具有挑战性。

我们通过以Recurrent Neural Network 及 Logistic Regression为基模型,通过Stacking方式,针对性的尝试去解决以上两个注册预估中的难点。其中Recurrent Neural Network最本质的能够work的地方在于,实际上在没有过多特征的时候,对于新用户来说,他的浏览路径实际上就是反映了他对这个app的喜好。

算法设计

Recurrent Neural Network基模型

数据整理部分

无论在Kaggle还是天池大赛上,数据特征工程是非常重要而且繁琐的一个过程:
关于预处理,通常我们会采取:

  • 数据检查,提出异常字符、乱码等数据
  • 缺失值处理,剔除、填充、拟合构造等
  • 方差衡量,剔除方差低的低贡献特征
  • 共线性检查,提高泛化能力
  • 异常检验,剔除错误异常数据

在数据预处理结束之后,我们还会在更新完的数据集上进行特征筛选:

  • 基于自变量与因变量之间的交互熵
  • 基于模型中的特征贡献程度(Xgboost里面的importance/Lasso、Ridge中的参数绝对大小)
  • 基于预训练模型中的特征参数的显著性
  • 基于自变量之间的相关性

在数据特征筛选结束之后,我们还需要进行特征组合寻找最大方差下的新的特征,还会通过PCA/LDA/t-SNE/FM等寻找是否可以进行降维或者升维,交叉特征构造等等。通常无论是在离线训练还是线上预测中,对特征的加工处理过程都是非常耗时的,极有可能在用户已经离开app后,用户的注册概率还没有算出来。

我们利用Recurrent Neural Network来解决注册预估的时候,我们需要做的数据整理就非常的轻松,只需根据用户浏览的顺序,将用户浏览的页面编号Item_Page,同时记录用户浏览的先后顺序Time_Rank:

构造如下的数据形式:

User_Imme Item_Page Time_Rank
012939003331092 92374573284354 1518422132
012939003331092 82374573771273 1518422142
012939003331092 92374573284354 1518422147
078939002221093 66774573284354 1518422247
078939002221093 66774573284442 1518422249

数据处理过程,只需要按照用户的浏览先后顺序进行排序即可,大大的降低了耗时,对整体算法的实效性上不会产生任何影响。因此,我们甚至可以在用户每一次产生动作之后就对其的注册概率进行重新判定,得到用户的浏览流对应的注册概率波动情况。

我们的用户可以大致可分为铁粉用户和普通用户两种。从用户的注册概率分布就可以很清晰的看出:铁粉用户浏览目的明确,寻找自己关注的商品,一旦找到立马注册下单,所以铁粉用户的时间流较短,注册概率呈现上升趋势,注册概率均值较高,需要我们运营手段干涉的情况较少;而普通用户属于无明确目的的浏览,所以注册概率的波动较大,注册概率均值较低,但是一旦察觉到用户有高概率注册的行为却未注册且注册概率持续下降时立刻进行营销引导,多次营销尝试后用户成功注册。

模型计算部分

整体的模型框架概览如下:

我们试图通过循环网络部分提取出用户的浏览行为的汇总信息,再通过Logistic Regression部分融合用户基础信息,以行为特点+基础特征猜测用户每次浏览是属于随便点点还是认真挑选。

Recurrent Neural Network部分

1.循环单元结构

在循环神经网络模块中,我们采取了Gated Recurrent Unit (GRU)代替普通RNN作为最小循环单元进行计算,以此来避免梯度消失等问题:

隐藏状态计算如下:



对比LSTM,GRU只用了两个gates,将LSTM中的输入门和遗忘门合并成了更新门。并且并不把线性自更新建立在额外的memory cell上,而是直接线性累积建立在隐藏状态上,并靠gates来调控,这样就可以大大的加快离线训练的速度,同时在RNN的官方论文中,我们看到了实测的效果如下:

很明显的可以看到:虽然GRU减少了一个门的存在,但是效果与LSTM相当,但是几乎每次测试的test效果都要优秀于传统方法,同时GRU是真的肉眼可见的比LSTM快。综合考虑了计算速度及最后计算结果的准确程度,我们选择了多层GRU模型而并非是以输入门、输出门、遗忘门为信息传递的LSTM模型。

2.循环网络结构

整体上看,网络结构也是非常简单的。如上图,先将用户浏览的所有商品进行embedding操作,然后根据用户每个商品的浏览顺序构建时序序列,进行多层的GRU模型训练,最后再以前馈网络传递,softmax后得到用户下次点击每个商品的概率,再根据预测结果Output Second Items 和 Real Second Items修正多层GRU layer中的参数。

通过已经训练好的循环网络,我们根据新用户浏览商品的顺序,得到用户每次浏览的后一次浏览每个商品的概率(output scores)及用户前N次浏览信息的trend,seasonality的汇总(隐藏状态GRU States)。与此同时,我们可以通过控制GRU layer的层数及优化多次隐藏状态GRU States的拼接方式控制整体模型框架的复杂程度。

3.用户数据构造

用户数据训练过程常常采用如上图这样的最小批处理。每一个Session就可以看作是一个用户,每一个i可以看作是一个商品,商品i的下标代表着商品的浏览顺序。

input中,每一行表示的为多个用户正常的浏览顺序中的起始商品,比如Session1用户浏览顺序:i1.1–>i1.2–>i1.3–>1.4中的i1.1,i1.2,i1.3;对应的,在output中,每一行代表多个用户在input位置的下一次浏览内容,比如Session1用户浏览顺序:i1.1–>i1.2,i1.2–i1.3,i1.3–>i1.4中的i1.2,i1.3,i1.4;当input中的一个的用户或者说是一个的Session的点击信息被全部使用后,追加一个新的用户或者说是Session的点击信息,同时通过控制同时计算的用户或者说Session的个数,直到所有的Session信息都被使用完一遍,这样就构造完成了一个由用户的上次点击结果预测用户的下次点击结果的循环神经网络。

这样设计避免了通常的神经网络构造在用户行为上应用中的两个问题:

  • 固定滑动窗口导致大量用户信息不能获取完整
  • 拆分用户的浏览行为计算导致循环网络在信息理解上的歧义

4.损失函数选取

关于损失函数的选取,我们这边主要推荐两种方案:基于贝叶斯后验优化(BayesianPersonalizedRanking,BPR)和第一准则(TOP1):

  • 贝叶斯后验优化(BayesianPersonalizedRanking,BPR)是一个近似矩阵分解的方法,我们分别选取当前用户当前商品的下一个真实浏览的商品作为Positive Item,随机抽样的商品作为Negative Item,具体表达形如:
    ,其中Ns即为随机采样个数,
    中k为i时对应Positive Item的真实计算得分,K为j时对应Negative Item,保持i=Positive Item不变,计算所有抽样出来的Negative Item作为j进行计算即可。
  • 第一准则(TOP1)是我们自己设计的一个近似排序的方法,我们想要真实的Positive Item所计算出来的结果尽可能的接近1,Negative Item计算出来的结果尽可能的接近0,所以我们要保证采样出来的Negative Item比Positive Item在当前计算方式下的得分要低,所以,我们可以设计损失函数如下:
    ,最末项增加了个正则项修正拟合程度。

除此之外,《SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS》中还提到了POP,S-POP,Item-KNN,BPR-MF等方法,可单独了解。

Logistics Regression部分

通过Logistics Regression部分提高融合Recurrent Neural Network的潜藏层和传统的用户基础特征,进行一次重排序的操作,个性化的提供用户的注册激励也是非常重要的一环。
整个Recurrent Neural Network部分在一定程度上帮助我们获取到了用户的浏览操作行为中的trend和seasonality(隐藏状态GRU States),但是缺乏考虑外部信息,比如热点爆品,用户区域,用户性别,用户需求等等。最典型的一个例子就是,我们不能向一个浏览了多个中性黑色太阳眼镜的正在试图走酷雅风格的东北女性推送潮牌男性短裤优惠券作为注册激励,很多时候会起到相反的作用。

如何兼顾Recurrent Neural Network部分的潜藏数据与为数不多的用户基础特征数据,并加以融合快速反馈出结果,是需要多方面考虑的:
数据应用

数据类别 数据详解
基础用户画像 人口属性,地点,性别,消费力等
主动行为数据 品类偏好、品牌偏好、行为性别等
文本偏好数据 浏览商品文字描述特征
反馈数据 停留时长,复停留行为,当前时间段等
  • 基础用户画像&主动行为数据:我们可以在用户原始日志中快速清洗出用户的地址,环境,设备等基础信息,结合用户浏览商品的性别+价格+品牌加权预估出用户的性别,消费力等价值属性,品类偏好、品牌偏好、行为性别等基础汇总属性。
  • 文本偏好数据:根据用户的浏览商品,去匹配是否命中了我们预先提取出的注册用户浏览高频关键词,比如“鬼洗”,“典藏”等等及当前的一些热点词汇“小白鞋”,“华莱士”等。

  • 反馈数据:在整个Recurrent Neural Network部分我们考虑的是用户的浏览顺序,但是忽略了用户的浏览质量,用户进入平台后的15s内,A商品重复浏览了3次,停留了9S,B商品重复浏览了1次,停留了1S,商品A的注册激励价值是远远高于商品B的。

通过以上的方式获取到的“用户画像”好处在于快速,再扩充了用户基本属性的同时还能够在规定的时间内完成所有的重排序计算,但是缺点在于一定程度上降低了用户特征刻画的精度。

数据融合

在实际的应用过程中,我们发现,在一定程度上交叉部分高价值的用户特征有助于提高最后的预测结果的准确性,构造的框架图如下:

这边借鉴但是没有完全采用wide&deep的方法,借鉴了对原始用户特征需要通过embedding layer进行处理,比如通过简单的one hot encoding的形式,然后采取特征交叉的方式获取新的用户特征,最后再进行前向传播或者logistics regression;但是此处,在embedding layer的过程中会采取人为限制分箱逻辑去噪(剔除了比如地点归属000ex00f这样的错误数据),在交叉过程中只选取了部分对最后的用户注册影响较大的因素进行交叉,在提升了模型对用户拟合的能力的同时也保证了模型的实效性。

数据流设计

简单的数据执行流如下:

主要步骤如下:

  • Kafka+Flume解析实时点击、搜索、浏览等用户操作日志流,在线进行用户操作数据的抽取
  • 实时解析基础用户环境信息,获取环境特征:手机型号,网络,地址等,实时写入到线上Hadoop/Spark中的HDFS里
  • 根据离线存储在HDFS中的用户操作数据、用户点击流数据和用户是否真实注册的结果离线更新循环网络GRU及LR模型参数
  • 将新的模型参数应用于线上用户数据的预测

最后可得到个人及全站的注册概率变化可视化如下:

可优化方向

  • GRU卷积神经网络的层数优化,由多层隐藏层替代单层隐藏层提高对用户行为的汇总效果
  • Logistics Regression部分可以由多模型bagging替换,降低过拟合的可能
  • 反馈数据清洗,对于有强烈意愿注册的用户进行识别,避免干扰正样本池
  • 推荐内容干扰,那些热门爆款更多的用户看到,而且“被看到”这个行为也加深了它接下去被接连看到的可能性
  • GRU卷积神经网络的构造中,修改上一次操作预测下一次操作为上一次操作预测目标行为(常停留时长的点击、收藏点击等等高价值的行为节点)

总结

传统的机器学习方案给用户行为预估的项目一个基准水平线,而深度学习的出现,一定程度上使得这个上限有所提高,但是以数据为基础,用算法去雕琢,只有将二者有机结合,才会带来更好的效果提升。

以上是yoho!buy团队在实践中的一点总结,当然我们还有还多事情要做,keep learning!最后感谢项目推进过程中所有合作方和项目组同学的付出和努力,感谢各个团队各位老大们的支持!

打赏的大佬可以联系我,赠送超赞的算法资料