人工智能时代前沿技术社区

首页 > 人工智能 > 热点

玖富算法工程师 李严鹏 :《智能运营中的机器学习实践》

9月15日FMI-2018人工智能与大数据高峰论坛圆满落幕,玖富李严鹏老师从用户流失预测、用户购买预测以及强化学习探索三个方面进行了分享。飞马

作者: | 2018-09-18 14:44:18

DSC_7797.JPG

9月15日FMI-2018人工智能与大数据高峰论坛圆满落幕,玖富李严鹏老师从用户流失预测、用户购买预测以及强化学习探索三个方面进行了分享。

飞马网将其内容整理如下:

大家好,今天给大家带来的是智能运营中机器学习实践,我在玖富主要是理财端大数据机器学习相关的实践。今天分享的题目主要是用户流失预测,用户购买预测以及我们现在正在做的像强化学习的探索。

首先我们简单看一下用户流失预测实践,大家都知道,现在这个行业,像P2P行业,倒闭潮很多,理财用户心态不是很稳固,导致一些小平台倒闭,原因在于一些行业,像广告做的比较好的,因为一些状况引起暴雷,还有一些小的平台用户流失,这对用户的心理造成很大的影响,当然对我们玖富也会造成一点点的影响,因为我们玖富的业务包括像理财以及消费分期、医美分期,还有证券等业务。我们的用户随着行业的发展形势也有一些用户流失的速度相对以前快一些,所以在我们理财端这边的大数据应用,我们的运营方给了我们一个很艰巨的需求,我们要提前准确的预知用户在未来一段时间他们流失的情况,这个流失也就是他最终彻底的离开了我们的平台,而不在我们的平台继续投资。

这样我们有一个目标定义,我们怎样去定义流失的用户,在这里把我们所有的用户,对他们最后一笔订单,每天做一次筛选,把最后一笔订单在未来第四周到期用户筛选出来,作为一个样本选择,然后来看这批用户在未来一个月是否会有购买行为,为什么我们会把目标定义成在未来的第四周到期的用户筛出来,我们希望有足够的时间,我们有三周的时间让运营方做一些很好的精准运营动作,及时挽回即将要流失的用户。

在特征工程方面,我们通常会把行为表,用户的行为特征,比如用户每天登录APP访问的时长、次数,用户页面深度,用户在APP方面的行为都有一些处理,每天通过日志记录时时获取用户行为轨迹。还有一些基础的特征,除了把登录时长次数和访问深度作为基础特征以外,还有比例的特征,我们做了一些按天加权处理,因为我们在样本的时候一般选择一个用户在最近半年内一段时间的表现,而最近半年,他从最近半年到最近一周他们的行为是不一样的,因为随着时间的推移,人的行为会不断的改变,所以我们在这里也是做了一个按天加权的处理。

第二个特征是订单表,我们的用户在历史的累计的特征上,我们会采取他们购买金额相关的特征,以及购买的产品,购买的时间,像有些用户他们有时候购买的理财产品和时间是非常固定的,比如像很多用户在月末最后一天,或者月初前两天,或者月中的十号十五号,很多用户是比较正常的中产阶级,这样我们的运营方会设计一些关于发泄日的活动理财产品。

第三,他们有一个再投资的相关特征,因为在我们的体系下,我们的产品层面会有一个再投资的选择,当多少用户即将到期了,我们会给用户提供一种方案,有一个按纽让你选择,是否继续将到期的订单进行再投资,你可以选择投资三个月、九个月等等。

第四,退出的相关特征,包括它的累计和退出方面的次数以及退出金额相关,我们可以做出一些特征。

第三大块,我们用户的基础特征,包括用户基本的年龄、性别、地域,地域是按照省份来划分的,有时候我们的用户在地域的表现上有很强的特性。还有一个是风险系数,在P2P行业,每注册一家新的P2P平台,或者互联网金融的投资平台,每个用户在注册的时候都会做一个风险调查,自我评估一下可能承受的风险水平,这个主要来源于用户自我的评价。

还有用户的注册,他的注册时间以及他的来源渠道,我们的用户会通过不同的渠道,会被我们引流进来,像安卓APP端,各大品牌引流,还有APP信息,以及用户朋友相关的特征,在这里朋友相关的特征主要是因为我们的平台活动有时候有一个邀请好友的奖励,我们能够拿到一个用户邀请了哪些好友,这些好友有什么样的表现,我们会把好友投资的意愿程度以及他们退出的情况做成一系列特征,供我们建模使用。

最后是模型训练,我们采用的是工业界比较流行的XGboost算法,我们对比的方法是LR、Deep&wide模型,我们的XGboost预测效果比较好,所有的模型基础会用LR做基本模型,然后像XGB、LGB等等做这样的提升,另外给一个Deep&Wide模型,是谷歌提出的,把你的理想特征当做一个LR的单层,把你得出来的特征跟Y的特征进行逻辑回归的预测。

刚刚介绍了用户流失的预测实践,也说了常见的方法,接下来是用户购买预测实践,我们既然用经典模型的方法做实践。另外我们还给出了我们团队自己设计的深度学习的解决方案。首先看一下业务需求,在我们的业务需求里,我们的运营方会提出一个需求,我们能不能知道我们的用户在未来一段时间有一些理财产品的购买倾向,如果他购买,请问他会购买哪一个产品,因为在我们理财领域,我们的产品不是特别多,不像电商产品有很多,他们的产品总共几个,比如三个月、六个月、九个月,12个月,24个月,48个月,一般是七八个产品。

这样我们希望能出一个模型,能够准确的预测未来每个用户对每个产品购买的倾向,他们才能更好的做一些运营动作的优化。

在这里我们的目标定义很简单,因为我们的理财产品总共七八个,如果有七个产品,我们的目标值是八个,还包括用户一段时间不购买的产品,在这里遇到一个问题,如果一个用户在未来的一个礼拜,他既购买了三个月,也购买了6个月,购买了一年,那么我们应该怎么把这个样本定义成一个标签,在这里我们是基于一种业务的考量,我们希望我们的用户更加倾向于购买我们的高价值产品,这个高价值体现在我们产品的期限,我们当然希望所有的用户都去购买两年期,四年期,花更多的钱买理财产品,这是我们的最终目标,确实很难达成,我们按照这个趋势做需求规划。

这里问题就来了,我们的这个模型的设计是定义成分类模型还是回归模型。如果定义成一个分类模型,有七个产品,我们定义成八分类,这个一点毛病都没有,如果是回归问题,七个产品,每个产品都有一个很强的属性,他们的时间属性,因为不同的产品的期限不一样,我们希望用户购买更长期的产品。

当你预测一个用户在未来购买了三个月的产品,或者购买了一年的产品,或者是九个月的产品,你预测他会购买九个月产品,他真实的标签是未来一个月购买的一年期,你预测是9个月和三个月,他的效果是完全不一样的,因为你从分类角度来看,这个效果是完全一样的,因为分类错了。如果你转化成回归问题,9个月跟12个月更加接近,预测的意愿程度更加客观的表达意愿的真实表现。在这里并没有采取一种标准的分类问题,我们定义成了一个回归问题,我们把整个标签分别设立成零、一二三四一直到八这个区间内。

最后是样本选取,我们用的是最近半天内有投资的用户,一个用户在最近半年内既没有投资也没有登录过我们的APP,在这半年内都没有活跃过,我们依然认为他在未来一个月也不会投资,所以在样本选取里我们用的是最近半年有过投资的用户。

特征工程这一块,我们依然把流失模型的特征部,像action的行为特征订单特征,我们都会加进来,不同于流失模型,我们还会引入其他特征,像产品特征,因为我们要预测用户他们在产品层面上的购买形象,所以也会增加一些产品的特征,比如产品的期限,产品的利率和产品风险状况,因为我们看到我们的产品有哪些监管人,他的信用表现等特征都会做成数据放在模型里。另外还有活动特征,我们经常搞一些理财活动,比如贷款,周年庆的活动,我们产品的设计会不断的改变,在产品属性的特征上有不同的改变,所以这一块会加入到多少模型当中来。

最后一个是我们卡券的特征,在我们的理财用户,大家如果投资会看到,你的平台除了购买,他有时候会发一些优惠券,包括本金券和加金券,满五千减60,这是本金券,加金券是不限额,当你投资任何期限给你年化收益加金的比例,把优惠券的特征加进来,包括类别、利息以及投资金额的限制等等。

最后采用XGboost的方法,我们对比了LR和LightGBM,其实在效果上没有太大的差距,因为这两个算法已经是行业内做数据挖掘比较主流的算法了。

接下来是我们团队给出了另外一个基于深度学习整体的解决方案,关于基于深度学习,有时候我们也会想在数据挖掘领域,我们数据结构如果应用深度学习,基本上做的也是一些回归和分类的经典套路,但是他们的效果并不是特别的好,在做比赛或者活动的时候我们发现表现效果很差。我们如果用深度学习做,我们怎样做一些改进?在这里我们充分考虑了传统学习的局限性,首先是特征工程方面,如果C端用户建模,我们会拿用户累计或者特征,但是他很难考虑时间属性,比如你统计这个人过去三天五天七天,但是你为什么不统计六天七天,这是特征的冗余。

第二,非常高度依赖于人工的特征工程,如果你采用LAI、TGD也好,你要造一堆的X,你要通过人工做,整个项目中基本上把90%甚至95%的时间花在人工的特征工程。

第三,特征工程的复杂性,因为你上线无论用什么,分布式计算也好,其实都很复杂,有极少部分的特征,特征的复杂度很大,计算成本时间和资源消耗也很大。通过这些考量,我们提出一种端到端的方案进行提升和改进。

首先是我们的数据结构,从传统的数据来看,我们的数据结构是一个DataFre,我们有N个样本,一堆X,我们可以做一些分类或者预测,但是如果把一个用户看作一个DataFre,行是时间属性,列还是Futer(音),一个用户是一张表,这样对我们数据保存是很大的困难,Shape是我们在建模过程中定义的时间周期在我们的工作中把时间周期定义成90天,如果定义成180天也可以,在大量实验中,在我们数据体系下我们发现定义90天是一个比较合理的选择,在我们的体系下我们的N是90天的维度,K是特征维度。

第二,数据存储,数据存储基于两个方面,一个是基于内存,你的数据存储相比传统的机器学习,要造相同的特征出来,存储要扩大N倍,因为我们用N倍时间维度,一张表是90行,我整体的数据量要扩大90倍。

第二,基于硬盘,一个用户一张特征表,把特征数据放在硬盘,通用做法是N×K是向量,然后成为一个文档格式,当你真正做的时候会发现,这样会占用大量的磁盘存储,我们当时做了超过一万个样本的时候,我们的硬盘存储空间已经超过一百多个G,也是非常恐怖的,这也是在实际的工业流程上不允许的操作。所以在这里提出一种改进的方案,我们对他做了特征变化的改进方案,这里通常多少特征包含两部分,连续特征和类别特征,连续特征包括长尾数字特征和非长尾数字特征。

我们提出一种方案,我们把长尾的数字特征倍数化,使他转化成一个偏正向分布的,非长尾特征直接用一个标准化的处理。 

第三,类别特征,比如他只有两个类别或者三个类别,我们直接把他处理,如果类别特别多,这里我们给到的方案是转换,我们把特征作为一个数据维度,作为一个标准差和均值,都转化成0到1的精度,这样不会有特别多的损失,但是我们最终是一张照片,我们的照片格式最高的值是255,0-1×255,这样得到255的区间,但是这还是浮点的数据,我们做了一个千分位的阶段,我们的特征损失,我们也承认他有一个特征的精度损失,我们采用一个千分位的阶段损失。在这里我们把它保存PNG的,因为我不能把它保存JPEG,因为它在存储的时候通过空间的变换特征更扭曲,所以我们保存的是PNG,因为PNG读进来数据不会改变。

一张照片保存的数据存储才几十B,如果保存一个文本文档,是一个文本结构的数据,整个样本文本数据存储,除了考虑到每一个数值的存储,还考虑到文档结构的存储,他的存储空间非常大。我们的存储压力相对于文档存储,压力基本上缩小了一百倍以上。

这一块是我们设计的CNN神经网络的方式,现在我们的样本是一张照片,高是时间维,宽是特征维,我们可以用CNN的方法,但是这里也是做了一些改进,比如我们用了attention的机制,我们的照片放进去用了一个卷积,这里我们的卷积核很特殊,传统的图象计算,卷积核一般是从左往右,从下往上,但是从这里从下往上卷,因为我们做数据挖掘知道,我们希望特征是独立的不同分布的,这样你如果作为卷积核,从左往右卷,每一次卷都是局部的特征,干嘛不每次卷所有的特征,卷积核高的话是时间窗,这样从上往下卷,每次卷全部的特征,对不同的时间窗口卷积学习,通过第一次的卷积学习局部的时间属性。

通过第一层之后,第二层加了一个Attention,卷积只能学习到一个局部的时间窗口的属性,如果你通过多层卷积可以学习到全局空间,如果通过多层卷积可能会造成影响,我们尽量使网络结构更简单。Attention本身是一个一维的向量,我们对第一层的时间进入一个向量做Attention,使得这个Attention注意到全局时间维度模式的变化。

Attention之后的线索依然不会变,我们再用三合一的卷积,最后用Gmaxpool进行最大的池化,最终我们把它做一个输出,因为我们输出的都是零到八的正数。

这是我们的效果,我们的效果比XGB和LGB好一些,通过我们的精确调参,在数据分类方面已经很高了,我们精心做了一个调参,效果好了1%左右的精度。

接下来是我们团队目前做的一些基于强化学习的探索,在强化学习这一块主要探讨一个问题,优惠券推荐排序的问题,在优惠券推荐排序这一块,我们通常用一些经典的,像推荐算法方面的应用,当然在这一块我们想尝试一些其他的方法,如果把优惠券推荐引擎,把这个代理看成一个智能体,用户是一个要操作的环境,我们对这个环境做一个动作,这个过程对我们优惠券来说是一个设计决策问题,因为对我们的用户在不同的时间派发不同的卡券。

如果从强化学习的建模视角来看,我们把整个过程看作Episode,这是初始状态到终止状态,我们把整个状态做成一个样本的链路。这样会把历史过去所有的日志记录拉出来,我们把所有的卡券表的时间窗,分别给每一个用户做一个训练,我们分别在不同的时间,我们的卡券和属性做成一个训练,这样把这个状态进行串联,这个End是状态终止行为,我们的终止状态通过大量时间做数据分析,我们是定义成一种用户连续两次投资并且未超过历史最大单笔投资,或者进行了购买。因为我们这么来看这个最终只有胜或者败,在理财这一块很难评估是胜还是败了,难道等用户流失了才是败吗,所以我们采取了一种间接的转变,我们定义用户连续两次投资,并没有超过历史最大单笔投资。

关于这个我们要设计,是什么样的思路设计我们的算法,首先是我们基于概率学习还是价值学习,基于概率学习,我们的卡片有N种,我们的模型输出,我们概率最大的动作派发给用户,这是基于概率学习,另一方面,如果是基于价值学习,我们的模型会输出每一个卡券价值的大小,我们会选择价值最大的那个给用户进行开发卡券。我们现在用的是基于价值学习,我们在定义数据结构的时候把每个用户的价值定义,把他们的年化金额作为他们的价值,所以在这里我们采用的是价值学习,我们可以让网络直接进行下一次迭代,直接跟我们的价值做MSE,这样你可以很合法的训练网络,而我们许多采取基于概率,基于概率的话还是要设置基于价值体系评估。

第二,在我们的游戏当中整个游戏从开始到结束,这个过程叫分布更新,如果单步走的话是单步更新,我们不知道用户的终止点在哪里,所以我们采用单步更新。最后是离线学习还是在线学习,我们只需要每隔三天跑一次就行了,而且我们的数据落库也是隔天落库的,我们只能做离线学习。

我们设计了一个方法,我们采用了DQN,这是目前做深度学习比较流行的方法,每一次的动作,价值汇报,总汇报是当前动作回报,下一步动作回报,每一个回报有一个衰减系数,得到一个未来得回报,这是动态运筹的思想。

我们如果把这个G组合到,用价值函数拟合,在当前状态下有一个期望,我们把这个期望展开会得到下面的公式,相当于Rt1后面是Gt1,这样做一个期望展开,展开会得到最后一个结论,你的强化学习未来的价值预估,你当前状态做的动作得到的回报,以及下一步预估状态的价值回报,通过一个∑的系数回复,∑系数是0-1,如果是0就有标准见得问题。我们的∑系数是0-1的区间,∑趋近1的话说明模型对未来的更重要,如果是0说明更看中当前的价值。

DQN,状态,我们会把用户每天的画像作为状态,我们通过画像看出每个用户的行为表现,动作的话是我们目前设计的一个卡券的形式,我们有N种优惠券,本金券,我们有N+1种动作。最后,奖赏,如果我们的动作一旦触达,我们会按照日志记录搜索,如果他按照我们的触达奖赏,我们会把奖赏为购买产品年化价值,他会考虑产品期限问题,也考虑产品投资问题,我们不仅仅希望用户投的钱越来越多,我们也希望投更长期限的产品,我们从利益角度考虑,最终采用的是用户购买的年画价值。如果你购买的话,我们给他年化价值,如果不购买,我们依然给他设定为零,如果有负奖励,会损失的比较剧烈。

这是我们DQN的架构,我们用的结构也不是特别深,也是非常单一,我们的特征方面,首先用的是框特征,把很多内里特征进行一个计算,另外是层面特征,把连续性的变量进行计算,第三是产品和优惠券,在这一块特征体现出来,最终做一个Concat,然后做一个全连接,最终输出50个动作,输出的是50个动作的价值而不是概率,因为我们最后并没有一个概率函数,我们用的是没有任何的函数,因为我们最终输出的就是一个价值,通过这个价值进行下一步迭代,然后进行我们的策略去回调,以上是我今天讲的内容,因为这是我们目前进行中的项目,所以并没有给出效果表现,后续还会在结构方面和特征方面做一些精细化的调参设计,谢谢大家。

想要获取大会PPT的朋友可以扫码关注公众号。获取方式:扫码进入公众号——底部导航栏回复关键词"ppt"进行查阅哦!

微信图片_20180530151141.jpg