干货篇 | 神策数据:机器学习在用户画像中的应用
分享嘉宾: 王琛,神策数据用户画像研发部技术负责人
整理出品: AICUG人工智能社区
导读: 在广告投放业务中,目标人群是否精准对投放的转化效果有直接的影响。通过用户标签找到精准度较高的目标人群通常需要丰富的行业经验,而利用基于机器学习技术的相似人群扩展(Lookalike)则提供了另一种方式,通过反复试验和人群扩展,同样可以达到较好的广告投放效果。
本次主要介绍了神策用户画像平台使用机器学习方法解决相似人群扩展方面的探索和实践。
嘉宾介绍: 王琛,神策数据用户画像研发部技术负责人,负责神策用户画像产品的研发工作。在大数据分析处理、分布式系统架构等方面有比较深刻的理解和实践经验,并对机器学习等多个领域都有深入研究。著有《深度学习原理与 TensorFlow 实践》一书。
加入神策数据之前,王琛先生曾任职于百度大数据部高级研发工程师,参与百度用户数据仓库的研发与建设;曾担任百纳信息(海豚浏览器)研发总监、人工智能实验室负责人。王琛先生有 9 年以上大数据从业经验,硕士毕业于英国爱丁堡大学人工智能专业。
目录
1、机器学习在用户画像中的应用场景
2、Lookalike 产品功能设计
3、Lookalike 功能的技术实现
4、总结
01 机器学习在用户画像中的应用场景
首先讲下用户画像,在运营或者营销的场景里面,大家会经常问到各种各样关于增长的问题,比如一个平台运营方要做个活动,那活动的预算应该怎么花?投放什么类型的广告?要怎么在不打扰用户的情况下,又能吸引用户的注意力和兴趣。在这些业务场景里,都离不开用户标签、用户画像这样一个系统。
我们在营销这个场景里面提出了一套基于数据驱动的营销闭环的模型, SDAF模型。这里面主要是四个步骤,Sense、Decision、Action和Feedback。
第一步最主要的就是要对平台的用户产生一些认知。比如我现在运营一个电商类或者社交类的APP,那首先要了解这个平台里的用户的留存、转化等业务指标,对经济状况也要有一些基本的了解。还要分析用户的分布情况,比如男女用户的比例、年龄的结构,他们都有什么样的兴趣偏好,是游戏的、体育的、金融的等等。同时也要了解用户的价值,就是通过广告费带来的这些用户是不是能够产生足够的正向收益。这是作为运营人员首先要对这个平台做的一些认知。
在经过足够的深入分析以后,就能够根据平台用户的特点和业务的目标制定一些运营策略,这个就是Decision。如果目前平台的支付转化率比较低,那可能就要做一些产品上的改进。如说是留存率比较低,那可能要做一些运营方面的活动,比如营销活动或者打卡这种活动。如果某个渠道来的用户价值特别高,那可能就要在这个渠道上面加大广告投放力度。所以根据运营策略的不同,就需要通过正确的触达方式,给正确的人,发送他想要看到的一些内容。选人这个步骤就需要用到用户标签这个体系。
在Action运营活动落地触达用户之后,用户也会产生一些新的行为。比如点击了这个广告,或是购买了我们的商品,或是做了一些其他类型的转化。那我们通过事件采集,就可以得到用户对这个运营活动的反馈,分析这些反馈。比如分析这个运营活动的效果,拉来了多少新用户,产生了多少转化,根据这个结果就可以进入到下一轮的闭环。再做一个进一步的运营计划。这就是整个数据驱动的运营闭环,SDAF闭环。
用户画像在整个这个闭环里都有参与和贡献,其中最重要的一环,也是发挥最大价值的地方是筛选出最合适的投放目标人群,也就是Lookalike相似人群扩散。
Lookalike这个功能最早是Facebook提出的,简单来说就是广告主想要在Facebook上面投广告,他们根据已有的留存用户的特点,用尽可能少的钱来找到更多的新用户。这些新用户跟原来的老用户尽可能的相似。我们认为他们可能具有同样的偏好兴趣,同样对这个产品有兴趣,找出来这样的客户。对于这个广告主来说最好的每一次广告展现都能有用户转化,但是这是非常难达到的。所以以往是需要非常有经验的运营专家来做人群圈选这件事情。但这种运营专家在市场上是非常稀缺的,需要大量经验和对整个市场的这些认知。所以大家开始寄希望于通过机器学习算法能达到类似的效果,以降低运营的门槛,提升运营的质量。所以Lookalike其实也被看作是一整套的方法论。除了广告投放、拉新这样的场景,在其他场景里也会有一些应用。比如做流失用户预测,或是帮助分析用户的付费转化,在全部用户的大盘里面找到付费意愿最高的那些用户。
02 Lookalike产品功能设计
我们在做Lookalike的时候,最希望解决的其实是产品的设计。因为我们是一家产品公司,我们做的产品卖给客户后,希望他们能自助的使用我们平台,尽可能少的人工介入。我们的产品和工具是给不懂技术的用户在用的,所以我们产品在易用性、可理解性、可解释性这些方面都是第一位的。我们希望把机器学习算法里边一些非常复杂的概念,包装成大家都能理解的产品,这点在整个产品设计过程中,相对是比较难的。
除了产品设计以外,我们还要把算法做得尽可能的准确,并且计算性能尽量的高。因为我们的产品都是私有化部署在客户提供的机器上,一般机器资源都相对有限,可能只有三台或者五台服务器这样的一些计算资源,也没有GPU这种设备。我们希望尽可能的保持算法的简洁性,在好的交互体验上面尽量保证预测的准确性。
接下来看看我们的产品到底怎么设计。比如我现在想对上海地区的用户推一些金融类的广告。
第一步就是挑选种子人群。我要投放金融类的广告,最好的种子用户就是那些曾经看过金融类广告并且有转化的那些用户,这些就是我真正想要触达的目标用户,作为正向种子。负向种子用户就是那些从来都对金融不感兴趣,或者是看了很多次广告都不转化的,这些我们就不在他身上过多的投入了。
选好种子人群以后,就会选相似特征。选相似特征就是在机器学习算法里面,带入更多的人为先验知识,缩小整个搜索空间,同时也降低计算的成本。
第三步就是选择要扩散的目标人群,比如要找上海地区的所有目标人群。
做完这些配置,产品就开始计算,得到这个目标用户跟种子用户之间的相似度。比如在这个例子里边,我们评估了3800多万人,跟种子人群的平均相似度只有5%,但是这个不重要,重要的是我们找这里边跟种子用户相似度最高的那一批人。比如定义相似度大于80% 的人,那这些就是我们的目标用户,我们就要把广告投在他们上面。
除了人群相似度,我们还会得特征的影响指数。比如我前面选择了七八个特征,那哪些特征是跟这个相似度判断关联性最大、影响度最大的呢?这里边可能会通过机器学习,校正一些我们原来的先验知识。比如我本来认为这个特征它会影响比较大,但实际上并没有。我们会通过算法来识别出这样一个特征,最后保留更重要的特征,并且尝试引入新的特征,让下一次的相似人群的扩散效果更好。
03 Lookalike功能的技术实现
前面讲了下我们这个产品到底怎么设计的,下面讲下我们是怎么定位这样一个技术问题。前面的相似人群扩散其实是定义成了监督学习的问题,更具体来说,就是一个二分类的问题。我们让用户选择了正向种子人群和负向种子人群,这实际上是一个数据标注的过程。接下来就是把这个样本分成了正样本和负样本,而最终的训练目的是得到一个二分类器。
我们在整个机器学习算法里面用了GBDT。GBDT在推荐类这样的产品里面有很多的应用,在历史上也有比较好的表现。
输入就是底层数据里面得到的用户属性、用户标签这些数据。整个的训练过程的目标是为持续提高二分类的准确率,同时也得到ROC曲线的变化结果。
最终预测的输出是对目标人群的分类预测结果,并且输出这个特征的权重值。
我们的数据源在底层是存成了这样一张用户表。用户表它首先有一个用户ID,每一列是一个用户的属性或者标签。这个二维表的每一个属性或者标签都可以看成用户的一个维度。所以每一行实际上都是一个样本。这个表有一个特点,它是一个稀疏矩阵,也就是每一个用户都有大部分的属性或者标签是空值。
我们在数据预处理时会对数据做几件事,首先会对这些数据做一些筛选,去掉里面只有唯一值的这种特征,比如平台所有用户都是来自于北京的,那这样的征实际上是没有意义的。另外就是筛去缺失值超过一定比例的特征,就是它大部分都是空值。
在做了这些数据的筛选,然后会做一个One-Hot的编码。这里会根据我们底层数据的类型来做不同的处理。比如布尔型的值,它就会编码成0者1。数值型的,就会进行归一化处理。字符串的,我们会把这个字符串类型的取值当作一个枚举来处理,这里面会取出来出现次数前n的这样一个值,按出现次数来做一个排序,其中每一个值或者每一个枚举作为一个分类。这样剩下的其值都归为一类,所以就会有n+1个分类。在One-Hot编码里边就会有n+1位来做这样的一个编码,把它按类别来分。时间类型的,是转化成时间戳后做归一化处理,跟数值类型是类似的。另外还有一种是集合类,处理方法跟字符串的处理方式类似,也是取前N个出现次数最多的值,做分类的One-Hot的编码。输出就很简单了,就是0到1之间的一个分类的概率。
介绍一个我们用户的实际的例子。这是一个游戏类的客户,他们想用我们的功能做流失用户的预测,进而降低流失概率,提升用户的付费比例。
目标数据就是我们是要预测活跃用户在七月的流失概率。就是看七月份到底有哪些活跃的用户即将要流失掉。我们用前两个月的数据作为训练样本,来预测七月的流失概率。正例是五月份他是活跃用户,但六月份他不是活跃用户,就是六月份他已经流失掉了。负例是五月份是活跃用户,并且六月份还仍然是活跃的。我们找的目标就是七月份即将要流失的。这里选择的特征比较多的是事件发生的次数,比如说登录、签到、完成游戏里面的一些任务、参加抽奖、掉装备或者是达成了某些成就的这些特征。
带入到我们产品里跑出来的结果预测,我们设定了一个值,判断流失的概率大于70%,它会流失。七月后,我们再来看这个数据,得到一个准确率和一个召回率。发现我们最后的准确率能做到69%,也就是我们预测里面有69%的用户是真的是流失了。召回率是最后真正流失的用户里我们预测到了其中的88%。所以还是达到了一个相对比较高的准确率的。
对客户他知道预测出来的这些用户即将要流失,那他要怎么去挽留这些用户,这是他更关心的。所以我们有一个特征的权重,也就是特征影响指数。这里面做了个大概示例,最后发现之前运营认为的日常任务,像每日打卡、签到这种活动对留存率是影响比较高的,但实际上最后发现是物品的产出和物品的消耗,像金币、装备、各种物品对游戏的留存率是影响最高的。所以作为一个游戏运营方,他就可以通过调整物品的爆出率,或者物品的获取方式,来提高留存率。
我们做的Lookalike这个功能实际上还是比较基础的,还有很多问题没有解决,包括产品易用性的问题。像前面选择正样本、负样本的时候,还是有比较高的使用门槛的,我们要选择事件,选择用户发生了什么行为,选择用户没有发生什么行为,这个还是比较难的。
另外就是比较难选特别合适的一个维度,虽然能带入一部分的先验经验,但是没办法完全的把经验融入在我们这个产品的功能里面,也没办法特别好的调优。而且一般的机器学习算法,尤其是跑在CPU上的时候,整个的训练过程还有预测过程都是比较久,运算过程比较长,并且这个运算过程由于没办法手动调优的情况下,可能很容易失败。比如它的内存爆了,或者中间可能计算失败,或者数据处理的不太对,所以很容易挂。
技术问题的话,比如我们没办法对一些超参数做自动化的调优。数据的预处理可能也会存在一些精度的缺失,可能会导致一些欠拟合或是过拟合。
我们最后的目标是以一个二分类的准确率为评估指标。如果以广告投放的点击率、转化率这些指标作为判断依据的话,可能在这上面也没有特别好的优化。机器的计算的性能还是受机器配置影响比较大的,这些都是我们已知的一些问题,我们也在想办法不管是产品上还是技术上都做一些优化。
后面我们也提供了一个无监督学习的办法,就是我们只计算相似度这样一个标签。用户表是一个二维表,第一列是用户ID,后面每一列都是一个属性或者是标签。所以我们现在就是想根据种子人群来直接计算目标用户与种子用户之间的相似度。这样就不用分正向种子用户或是负向种子用户了,他就是一个人群包。我们就把这个问题变成了一个无监督学习的问题。就是用一个向量来表示整个的用户特征,表示一条样本,并计算它们之间的余弦相似度,或是其他的一些相似度。
这里我们是这么做的。在产品里面我们让用户选择他所有的属性、所有的标签。这个时候用户是很大的,可能有一千万的用户,甚至是一个亿的用户,它的用户的属性和标签可能也很多,可能有三百、五百甚至上千这样的维度,所以整个数据量是很大的。
我们在做计算的时候,首先要做的是数据的降维,将所有的样本数据降至K维。这个K我们是做了一定的计算的,我们对种子人群先跑一遍PCA算法,根据这个特征对原始信息的保留度,我们选择了是80%,这个80%有可能是十个维度或者二十个维度,也有可能是只有五个维度,这个会有所保留。在整个数据降维过程中,如果计算数据量是过大的,比如他的种子用户选择了十万人,这十万人跑PCA的时候很容易把内存撑爆。我们就会先对这十万人做一个抽样,抽样以后来辅助我们选择这个降维的维度配置。选好了后,我们对全部的用户使用incremental PCA的算法,它能够对内存有很好的控制。用这样一个方法,能兼顾性能和准确度,也能保证真的能算出来,不至于被机器的资源所限制。
相似度计算,我们计算扩散集,也就是目标人群里边每一个用户距离种子用户里边最临近的十个用户的余弦相似度,再取一个平均,作为这个用户对种子人群相似度的取值。
这里用了facebook开源的faiss向量搜索引擎。它是一个比较高效的向量搜索的引擎,用它可以分批的进行相似用户的检索。这里还有一些异常值的处理,当这个计算的用户他离我们目标级的中心点大于三个标准差的时候,我们就认为它是一个非法用户,或者算是一个异常值,把它从这个目标集里边直接剃掉,它的相似度可能就是零。
这是我们一个无监督学习的方法,这个功能现在也已经上线了,现在正在推出试用,让我们的客户来验证下在相似人群扩散这个场景里面有没有帮助。
04 总结
前面就是我们在Lookalike这个功能上面做的一些尝试,技术上主要是两种尝试:一种是有监督学习的,一种是无监督学习的。我们在产品上面也做了两种的方式:一种是前面提到的选择正向用户、负向用户,最后判断它的相似度。另外一种就是直接计算这个相似度的标签,把相似度作为一个标签存在整个系统里面。
总结一下,Lookalike在用户画像、人群圈选这个领域,是非常重要的一个功能,在运营的日常工作中也是经常遇到的。第二,Lookalike在实现上面其实有很多种方案,但在实际的使用中,可能大部分场景还都需要人工的调优处理,才能真正的达到一定的准确度或者是可解释度。所以人工调优在现在这个阶段可能还是必不可少的,没办法完全做到自动化,完全做到智能化。另外智能产品,机器学习类的产品,它的设计其实是一项非常具有挑战性的工作,需要同时兼顾算法技术,还有用户的理解、用户的使用方式等等,这些方方面面都要兼顾到,所以还是一个比较难的事情,在这方面我们也仍然在探索的过程中。