数据与广告系列十五:商业兴趣标签建模&XGboost调优实战

作者·黄崇远

『数据虫巢』

全文共8210

题图ssyer.com

聊聊商业兴趣标签建模,顺带学习下kaggle竞赛神器,快哉。

01

前言

我们来回想下,早在第是一篇《数据与广告系列十一:从性别预测的CASE开始手撕机器学习代码》的时候,我们就通过一个简单性别标签预测的CASE,帮助大家接触基于机器学习的简单应用。

后续在第十二篇《数据与广告系列十二:接上一篇,见习算法工程师教程》中更是把机器学习的基本流程结合数据集,特征处理,模型,参数调优,评估的流程给大家过了一道。

再往后续又逐渐的结合广告异常检测的话题讨论SMOTE过采样以及代价敏感学习,以及在上一篇《数据与广告系列十四:智能定向&基于FM的标签组合推荐思路》结合广告智能定向的话题,把FM模型学习了一下,以及结合FM对特征关联关系计算的原理进行标签推荐的设计和实现。

而本篇,将从广告定向中的商业兴趣标签建模的角度,讨论广告领域中商业兴趣的构建,以及结合这个话题,重点来学习一下XGboost算法,并且将着重侧重于其模型的调优。

顺着这个思路下去,我们总一天会把所有广告的算法应用场景都覆盖全,也结合场景帮助大家从基础到逐渐复杂的过程中,学习和认识机器学习领域的相关知识,最好到了最后能直接上手开干,我们慢慢来。

02

基础属性|自然兴趣|商业兴趣

我们一般情况下不会重复广告中的算法应用场景,我们在第十一篇的时候,通过对性别的预测来实现对性别标签的构建,在这篇中,我们的目标同样是标签,有什么差异呢?

对于性别年龄这种基础的定向标签来说,其变动性是非常小的,或者说一旦你的标签构建的足够准确,是可以不需要再次修正或者再次预测的,比如说性别,总不可能说今天你的性别为男,明天就是女生了。对于年龄来说,同样,一旦足够准确,明年我只需要在你的年龄里+1就好了。

但事实上,除非我们拿到的是类似身份证件这种明确的信息,不然只能通过预测的手段获取,只要是预测就一定存在误差,所以偶尔有变动在技术层面上就行得通了。

那么同样是预测,基础属性标签的预测更多侧重于说收集全面的用户行为数据,去预测一个固定的属性。

所以,在特征行为分析的角度上,要更多关注于用户长期关注的一些行为,并且跟你预测的目标,比如性别差异有关联性。

这种预测,我们可以适当的把特征分析的范围拉大,尽可能的抛弃短期变动大的那种特征表现,甚至可以把用户的长期行为序列都灌到模型中,总之,我们的拟合目标是一个相对稳定的属性,所以在行为特征考虑上也要体现这个点。

对于自然兴趣和商业兴趣来说,一个侧重于用户本身在流量平台(比如资讯载体,游戏,影视音平台,金融平台等)上体现的兴趣表现,比如一个人爱看电视是个电视迷,一个人喜欢用理财APP,一个人喜欢玩三国游戏。

而商业兴趣,所谓商业,在广告领域就很直白了,就是说广告投放,说白了就是用户对于投放广告的兴趣,更直白点就是他会不会点这个广告,会不会下载投放的APP。

那么商业兴趣跟自然兴趣有差异吗?有的,举个简单例子,我发现这个人在过去一个月里玩了比较多三国游戏,我给他打了个三国游戏的行为自然兴趣标签。然后广告主按自然兴趣有三国游戏的定向去筛选人群,这样做有问题吗?

原则上没问题,但不是绝对的,举个例子,实际上我们曾分析过游戏行为之间的迁移情况,所谓迁移即之前玩什么游戏,一段时间之后这个用户的游戏行为迁移到哪个地方了,比如是不是另外一个游戏又或者说完全流失掉了,部分游戏之间的用户迁移情况是比较严重的。

再举个例子,在二类电商的用户人群中,除了大盘的用户行为特征之外,更多的时候购买一个东西其实是一个需求驱动的,他是不是需要这个东西,并且这种需求可能是有周期性的,而有些商业需求是一次性的,比如婚庆服务,他一旦达到了这个诉求,理论上这辈子都不需要婚庆公司的服务了(那种年年玩结婚游戏的渣渣不算)。

这意味着从自然兴趣到商业兴趣是有一定的误差的,即自然兴趣不能完全反馈到商业兴趣中,只能说作为一个重要的参考特征。

那么在建模的逻辑上有什么区别呢?自然行为兴趣标签的建模,更多是参考用户的行为模式,基于统计的方式去统计用户的行为,所以很多时候这种兴趣的定义多跟着流量类别定义走。

比如流量平台上有财经资讯这个栏目,可能我们就会给用户打上一个对财经资讯感兴趣,经常使用手环跑步,就给他打上运动,健身等行为标签。

所以,这是一种相对直白的用户描述,对用户过去一段时间内的行为总结量化。但实际操作起来也没有这么简单,比如,如何考虑多数据源的融合,比如如何考虑用户行为频度和密度对于行为兴趣量化的程度,又比如短期密集行为和长期稀疏行为,哪个程度更深一些,都充满了学问。

对于商业兴趣建模,目标就很直白了,比如我需要对贷款广告做商业兴趣标签,其实我需要做的就是找最适合商业贷款广告的人群,更直白点的就是把最有可能点击下载这类广告的人群给预测出来。

那么对于这个事情来说,他之前的一些金融,财经相关的行为可能就是重要的参考因素,这个时候更多偏重于短期的行为特征构建,因为时间一旦拉长,这种诉求得到满足之后,商业转化的可能性就会降低很多。

但实际上,在很多广告平台上,没有直接去提供商业兴趣,或者说不会那么直白的把商业兴趣拎出来,还是以广点通为例。

数据与广告系列十五:商业兴趣标签建模&XGboost调优实战_第1张图片

最起码从表面上,不管是兴趣或者行为维度的描述,都是偏向于自然兴趣的范畴,只是区分的界定一个是偏向于长期行为,一个是偏重于特定场景。广点通是这个样子,其他广告平台也差不多。

这是为什么呢?因为商业兴趣建模的成本很高。一旦你需要对商业场景进行建模,这意味着这个场景累积的数据足够的多,基于自然行为的标签体系可以有很多,只要流量平台上有多少,这边就有多少。

但广告场景就不一定了,投放的广告领域总是有限的,而具有足够预测数据的领域就更少了,这意味着按投入产出比来看,过度的去做是不划算的,所以注定了就只是针对于重点领域做针对性优化的存在。

更何况,商业行为兴趣,目标就是对口标签对口广告,这对于平台来说,加大充分竞争是有损的。

所以,大多数广告平台大概率是会做这个事的,只不过更多会集成在定向的标签体系中,为重点行业广告做服务,默默的提升这些重点行业的广告主的转化效果,保证平台的核心转化效果,以及重点客户的留存。

但在大局上,又不会做的大张旗鼓,一方面是构建成本的问题,另一方面是基于平台定向竞争充分的原因考虑。

但不管怎么说,可以确定的是,广告领域中,商业兴趣建模是一个非常重要的算法应用场景,基于这个点,我们后续讨论的,甚至包括整篇的内容才有意义。

03

商业兴趣标签建模

对于商业兴趣标签预测来说,实际拆解下来,其实是一个偏向于分类的问题(严格的类别),或者回归问题(预测概率值),而如果说要解决分类或者回归问题,那么方法就多了去了。

简单的比如用单一模型,诸如贝叶斯,或者LR,或者一些决策树模型,再复杂点的可以用一些集成学习(Ensemble Learning)的模型,比如基于Bagging思路的随机森林(Random Forest),基于Boosting思路的GBDT,还有诸如模型嵌套模型的Stacking解决思路。

除此之外,还有各种其他思路,比如使用GBDT做特征处理,上层使用LR做预测的逻辑,这是早些年非常流行的CTR预估的路子,放在标签建模预测这里同样是行得通的,再诸如之前提到的FM系列的模型。

至于说深度学习的一些模型,当然也是通的,甚至包括传统模型用于特征处理之后,再灌入深度学习模型的路子都有,五花八门。今天这篇文章中,我们不讨论深度学习的东西,再到后面总是会慢慢接触到的,不着急。

我们将结合XGboost来进行商业兴趣标签的预测。为什么选择XGboost?XGboost近些年得到的关注不少,他具有一个非常荣誉性的称号“Kaggle神器”。即在Kaggle竞赛中,他常年居于模型榜首,非常之好用。

所以,XGboost是一个非常稳定,并且综合效果又不弱的常用模型,他基于GDBT的原理,在此基础上又做了一些优化,比如代价函数从一阶到二阶的优化,代价函数里加了正则项使得模型更简单快速以及避免过拟合,对于缺失值加了自动分裂处理的机制,可以进行列采样减少计算的同时避免过拟合,在特征颗粒度上采用并行计算又加快了计算速度。

所以,从整体上看XGboost比常规的GBDT速度是快不少的,在拟合上其实不必过于担心过拟合的问题,因为他在内部有足够多的机制来防止过拟合,所以XGboost的泛化能力非常好,非常稳定,对于特征的处理要求又不高。

所谓是人见人爱,还有调优折腾的空间,所以近些年老受欢迎啦。我们当然不要放过这个东西了,有一个简单实用的模型,门槛不算高,效果又看得过去,又有优化折腾的空间,最适合用于常规选手的一些预测和分类任务了,不选他选谁呢?

关于更多偏XGboost原理相关的东西,这里不展开讨论,具体可以看论文【文献01】或者官网的描述【文献02】。

了解原理的时候,可以重点关注几个要点,一个是回归树与分类树的差异,第二个是多棵树的集成原理,最后是算法对应的大致参数列表。

选定了模型,接下来我们需要明确知道要区分的人群的差异点,说白了就是样本集的构建,原则上说我们需要尽可能的贴近实际线上的人群切割分布,比如我们的最终拟合目标是广告投放最终带来的下载转化,那么那些转化人群就是我们的正样本。

对于负样本,这个场景下通常有两种选择,一种是曝光未点击的用户,这个放在推荐系统中就是典型的负反馈样例,这种取负样本的方式无可厚非,相对来说还是说的过去的。但是可能存在一个风险,那就是对于曝光加点击且未下载的中间层那群人的特征行为,模型不一定进行了充分学习。

所以,还有一种就是,除了下载人群,其他的人群都可以作为负样本,当然,这个规模是非常大,要知道广告的转化率都是以个位数的百分比算的,所以必然需要做取样的动作。比如,最常见的完全随机进行负采样。

接下来梳理场景所对应的特征行为,实际上我们试图通过用户的中短期行为,然后从中短期行为中预测出其商业化意图,即其商业兴趣的诉求。举个简单例子,以金融-贷款广告投放为例,最终需要识别出来哪些人对于贷款这种广告转化感兴趣。

任何特征的梳理都离不开特征行为的分析,我们完全可以把广告下载转化的那群人和不转化的人群进行相关行为的对比,从而找到先对显著的一些特征行为。

比如,我们通过分析对比TGI可以发现不同城市对于贷款行为的表现不同,同样年龄的分布也具有典型性,除此之外贷款行为还具有明显的延续性,特别是小额贷,换句通俗点的话来说就是贷款能贷成隐。

同样用户对于过去广告的一些表现行为也至关重要,此外还有一些需求性行为外露,比如一些检索行为,检索内容等。

总之,在决定使用什么特征之前,最好的方式就是对两拨人群进行相对全面的分析,把可能和不可能的表现特征都梳理一遍。

最后需要注意的就是,我们建模和实际预测的时间差异。

举个简单例子,假设我们的最终特征行为的收集和最终标签预测的使用是T+1,那么在建模的时候使用的特征对应的时间与建模样本的时间差是T+1,模型出来之后,实际预测的人群对应的时间也应该是T+1。只有保证这个前提,才能保证特征的样本分布是可借鉴的。

04

基于兴趣建模的XGboost调优实战

前面都是铺垫,并不涉及到实际XGboost模型上的东西。然而实际上无数次实践证明,调模型上的东西的效率,远不如先进行样本集的确认和特征的大致确认。

所谓确认就是,假设都使用XGboost默认参数的情况下,尝试不同的样本集构建方式和加减一些特征,其模型指标的变化会变动比较大,这种变动的幅度大体上都会远高于对模型进行参数调优。

所以,在调参之前,先把能实验的样本集和特征集跑一遍,最后选择一个指标最优的样本集和特征集,基于这个前提上做参数调优。先把大的方向确认了(其实影响的是样本空间的分布,进而影响特征空间的分布),再做微调,并且很多时候大的方向相对容易确认一些。

进入到模型实践阶段,我们首先把样本集分割为train_data, vali_data, test_data三个部分,后续我们所有指标可能都需要在这三部分数据集上进行对比分析了。

这里直接使用之前提到过的GridSearchCV来做最优参数选择,先附上简单的代码示例,这些代码认真找很容易找到。

 #这部分参数组合,即需要探索的参数列表

 cv_params = {
     'n_estimators': [500, 1000],
     'max_depth': [6,12],
    'scale_pos_weight': [1,3],
    'subsample': [1, 0.75]
 }  
 #固定参数列表
 other_params = {
     'min_child_weight': 1,
     'objective': 'binary:logistic',
     'seed': 30,
     'gamma': 0,
     'colsample_bytree' : 0.75,
     'learning_rate': 0.1
 }


 model_scv = XGBClassifier(**other_params)
 #verbose日志冗长度,0=不输出训练过程,1=偶尔输出,>1,对每个子模型都输出
 optimized_GBM = GridSearchCV(estimator=model_scv, param_grid=cv_params, scoring='roc_auc',cv=3, verbose=1, n_jobs=50)


 eval_set = [(x_vali, y_vali)]
 grid_result = optimized_GBM.fit(x_train, y_train, eval_set = eval_set, early_stopping_rounds = 20)
 #将最优参数打印
 print("Best_score[%s]: %f" % (grid_result.scorer_,grid_result.best_score_))
 for params,value in grid_result.best_params_.items():
     print("%s ==> %s" % (params,value))

从一个算法流程调优的角度来说,上面说了,直接调整样本空间(采样的大变更)是影响最大的。

其次是调整特征分布空间,样本的变化当然会影响特征分布空间,除此之外对特征的增减也是影响很大,然后是特征的处理方式改变如正则化/离散化/归一等再次之。

然后就是选择模型,当然很多时候模型本来就跟样本与特征绑定在一起,但不同的模型之间大致的效果还是有一定的预估的,这就是一些有经验的人一看到场景数据加特征,以及过往的一些经验,基本上可以拍定一些相对表现较好的模型,这就避免了瞎试。

当上面的这些都定了之后,接下来我们进入到模型内部去折腾,在固定的大盘数据以及特征分布空间的基础上进行折腾,而XGB从模型层面上经过了考验,所以大部分时候不知道选择什么模型的时候用它八九也不离十。

他性能稳定,泛化能力好,特征处理不需要太复杂,简直是打比赛做中初级模型的必备神器,吹牛逼就算了,估计得一些看不懂结构的各种深度网络模型才够。基于XGB调优的前提,同样有很多实践的调优套路在。

首先是validata的使用,理论上说GridSearchCV内部使用了cv,即内部训练的时候交叉验证,可以不进行eval_set的设置,但为了提升训练的效率,还是可以加上的。

+eval_set/early_stopping_rounds参数

eval_set可以设置验证集,对于fit的数据每轮进行校验,配合early_stopping_rounds使用,当超过了固定轮数评估指标(不断减少误差)依然没有提升之后,将停止尝试迭代。

迭代次数过多原则上会形成过拟合,但个人感觉xgb在泛化这块有很多方式可以控制,并且本身算法原理就一定程度上不那么容易过拟合。所以在算力或者时间充足的情况下,适当调大early_stopping_rounds也是可以的。

+learning_rate/n_estimators参数

这两个参数同样比较容易拟合的指标,并且很多时候配合起来调参更有效率,n_estimators为总共迭代的次数,也是单树的个数,他的个数经常会和特征维度搭配起来预估,少了容易欠拟合,多了容易过拟合,刚刚好就需要探测了。

而learning_rate是学习率,在进行梯度寻找局部最优解的时候,他其实就类似“步长”,步子大了虽然走的快单容易扯到蛋,错了是容易错过局部最最最最优解,步子小了走的慢,所以影响的是迭代效率。

在实践的时候,开始可以稍微设置大点的learning_rate,先把n_estimators树的个数大致确定下来,然后反过来调小学习率,微调拟合的指标。

+max_depth/subsample/colsample_bytree参数

这三个参数都都是对于TREE的设置,max_depth是单树的深度,越大越容易过拟合,越小容易欠拟合,一般范围在3-10,所以调整的幅度不算特别大。

而subsample是训练单树的时候取样本的采样率,如果过拟合了,稍微调小点,变成了抽样数据训练;colsample_bytree则是训练单树时特征抽样,作用同上。

之前就说了,xgb有太多方式可以进行防止过拟合了,这不就来了。这三个参数,max_depth是杀伤力最大的,在确定好n_estimators之后,快速进行max_depth的最佳定位,但很多时候默认的6真的还蛮好使的,其他越调越差。

另外两个采样参数就看着调了,一般情况下,如果加了交叉验证,数据采样可以不用调,直接稍微减小点样本采样的比例即可。

+scale_pos_weight参数

官网描述这个参数是“Balancing of positive and negative weights”,翻译过来就是用于平衡正负样本。更详细的解释是,如果使用AUC进行模型评估的话,设置这个参数可以使加权的样本加快收敛,并优化auc结果。

具体他怎么影响的,从代码层来看,确实是通过这个参数,影响了学习率,但跟效果这个的关联具体是怎么样的,找了很多资料没有个之所以然,有大神可以出来说说下。

在实践层面来说,还是比较适合广告领域的,在我们的这个case里头,正样本是下载人群,负样本曝光未点击(取两端,中间部分是点击未转化,当然,可以进行样本取样方面的实验,用最合适的),正负样本差距是很大的,就算负样本瞎抽样,都比正样本大很多。

官方建议是正负样本比值,直接作为scale_pos_weight的值,但从个人的实践来说,有点大了,适当往小里打压一下,但整体来说,对于auc的指标还是有正向作用的。

+其他参数

其他参数,这里就不一一解释了,从个人的实践角度来说,影响并不是很大,正则化相关的稍加注意一下就可以了。

虽然我们这里写了很多调参相关的东西,而事实就是还不如把精力花在数据研究上,特征研究上,而不是调参,当然深度学习的模型另算(不要着急,我们迟早会遇到他的,要撸的)。

但我们最终的目的希望是能达到的,从商业化兴趣建模的角度去了解广告领域这么一个算法应用场景,然后在基于XGB来学习基于XGB建模的实践过程,优化过程以及调参过程。除了业务理解加深之外,在垂直的机器学习角度上,加大对XGB的理解。

05

思考与总结

在应用层面,假设模型指标拟合OK的情况下,且具有优良的实际泛化能力,建模的结果导向会导致了对口广告对应对口商业兴趣标签是有正向作用的(比如贷款广告用贷款商业兴趣标签)。

但不能保证的是对口标签在其他广告上的效果(比如贷款商业兴趣标签在理财广告上),这就限制了他的想象空间。

而从全盘的角度思考,是希望做一个事能让平台整体的收益会提升,商业兴趣建模这种定点问题定点解决的思路是不友好的。

但不可否认的是,还是很有应用市场的,比如广告平台中的重点消耗大户,人家一个顶两,不是两,是一片,但针对性的给他优化投放人群(商业兴趣标签)是值得去搞。

还有比如一些重点想引入的新广告类型,定点去做商业标签,也是有助于提升客户留存的。总之,是有必要去做的一个事,但最好是能找到规模化的方法。

除此之外,广告中还有一个非常有意思的场景。

以广告中几个典型业务指标来说,下载成本是广告主最关注的指标,其核心组成由出价单价和点击下载率来决定。但对于平台方来说,其量化平台收益能力只有一个CPM,即流量的有效单价,表征流量的转化效率,其跟曝光下载率和出价单价以及CTR挂钩。

这就形成了一个尴尬的情况,实际上平台方指标和广告主关注的指标是相悖的,下载成本降了,意味着你的人群预测更加准确,导致客户竞价低或者点击转化的提升。不管怎么说只要广告主省钱了,那么平台方就一定少赚钱了。

满足了客户就要损失平台收益,如何得到平衡?又或者说能否在建模的过程中,人为的去控制广告主测或平台测的指标上升或下降。这是一个非常有有意思也值得去尝试的点,比如特意的控制样本的结构(曝光未点击,点击未下载,下载未曝光),以及控制特征的构成。

在广告业务上我们逐渐的增加了算法在广告场景中的应用,然后顺带的不断地在机器学习领域深入,在未来,只要这个系列还活着,总是能覆盖到大部分广告中算法场景的,然后在机器学习领域上,总是能从入门到上楼的。

你看,XGB都出来了,各种说不上原理的深度学习网络模型还远吗(总有种“你看种子都已经播上了,马上就可以吃上饭了”的感觉)?

在后面写作规划里,可能会直接上CTR预估的东西,这就完美的承接了。但写这种总是很累的,说不定会插播一集业务强相关的章节,比如说游戏与广告(还记得之前已经搞定了二类电商,和中小广告吗)。

参考文献

【01】XGBoost: A Scalable Tree Boosting System

【02】https://xgboost.readthedocs.io/en/latest/tutorials/model.html

文章都看完了,还不点个赞来个赏~

OTHER相关系列(数据与广告&推荐系列)

《数据与广告系列十一:性别属性预测|手撕代码》

《数据与广告系列十二:见习算法工程师教程》

《数据与广告系列十三:广告中的异常预测问题》

《数据与广告系列十四:智能定向&FM组合推荐》

《推04,融合了用户兴趣推荐系统才更具个性》

《推05,论推荐系统之经典,还得数协同》

《推06,从策略算法到系统到架构到产品设计

你可能感兴趣的:(数据与广告系列十五:商业兴趣标签建模&XGboost调优实战)