写在前面
时隔两年,这篇决赛方案梳理悄然登场,主要针对前十名的方案进行学习,17的腾讯赛算法是比较早的ctr比赛,很多方法都值得借鉴,同时也不乏有经典的操作。当时的我还没有开始参加数据竞赛,不过在之后的比赛中,也常分析这场经典赛事。接下来让我们回到两年前,以前来学习优秀方案。
第一届腾讯社交广告高校算法大赛以“移动App广告转化率预估“为主题,首次开放腾讯在社交和数字广告领域的“实战类”数据,以高度模拟真实业务的赛题方式呈现,并直指数字广告中的核心关键问题:转化预估,面向高校学生征集最智慧的算法解决方案,引领广告生态业界的核心技术方向。
赛题描述
计算广告是互联网最重要的商业模式之一,广告投放效果通常通过曝光、点击和转化各环节来衡量,大多数广告系统受广告效果数据回流的限制只能通过曝光或点击作为投放效果的衡量标准开展优化。腾讯社交广告(Tencent Social Ads)发挥特有的用户识别和转化跟踪数据能力,帮助广告主跟踪广告投放后的转化效果,基于广告转化数据训练转化率预估模型(pCVR,Predicted Conversion Rate),在广告排序中引入pCVR因子优化广告投放效果,提升ROI。本题目以移动App广告为研究对象,预测App广告点击后被激活的概率:pCVR=P(conversion=1 | Ad,User,Context),即给定广告、用户和上下文情况下广告被点击后发生激活的概率。业界对于广告点击转化(CTR)的研究一直比较重视,而且目前应用相对成熟,腾讯本次比赛是对广告转化率(CVR)进行预估算是独出心裁,该次比赛无论是在学术研究还是业界应用都有较高的研究价值。
接下来我们从决赛第十名的队伍开始方案分析
第十名:ThreeIdiots
首先借第十名的方案先来回顾下赛题。
赛题目标:根据第17天到第30天中广告日志中的信息以及部分用户信息和用户安装app信息来预测在第31天中App广告被用户点击后激活的概率。
赛题数据:给出了用户信息、广告信息、上下文信息和历史流水。
赛题为二分类问题,使用的评价指标为logloss。方案还是比较简单的,仅是使用了树模型,即LightGBM和XGBoost。等下会发现大多数选手的方案都是树模型,在那个时代,对于广告点击预测使用的模型还是比较的单一,毕竟现在的deepfm、xdeepfm、AFM等都是之后才出来的。
作为带有时间序列的CTR问题,提取特征很容易发生穿越。所以从上图可以看到,特征提取的窗口均在标签窗口的前面,即只能从历史提取特征。
用户特征,主要从用户的偏好信息以及用户的历史行为来提取,历史方面为最近一次和最近几天等粒度考虑。
广告特征,广告本身的信息也会影响到广告的点击率,选手还考虑到了距离首次的时间差,比如距离App第一次出现的时间,时间越长则反应App越成熟稳定,点击率可能越高。
Label窗特征是能直接反应用户点击行为的信息,用户的点击习惯则影响下次点击概率。
更细粒度的描述也是不能缺少的,点击率预测,也常伴随着各种类别特征的组合。组合的时候更多的是从业务考虑,将App与用户信息进行组合等,都是存在意义的。
该选手还考虑历史安装App用户信息与当前用户的余弦距离(Cosine distance),通过这样的方法来确定不同人群对App的需求度,达到人和App的匹配。
模型方面比较简单,均是树模型,其融合是直接针对三个模型进行融合。
最终结果=0.4*max 0.4*median 0.2*min
第九名:SYSU_至九
有了前面的赛题回顾,我们可以直接到特征工程部分。
选手除了原始特征外,还使用了计数特征(count),转化率特征(并进行贝叶斯平滑),用户历史点击,Word embedding特等。
接下来构造了转化率特征,并做了贝叶斯平滑,这里要解决的问题是,新内容,曝光较少的内容的排序问题。
接下来构造了用户历史点击特征,这种方式还是蛮少使用的,主要对历史点击使用0和1进行编码。
另外,还可以对用户的点击记录作为文本,使用word2vec进行word embedding,比如用户历史点击的appID构成文本序列,然后将其拼接成document,最后得到appID的embedding向量。
模型部分
选手在这一部分还是做了蛮多的操作,首先是个GBDT提取稀疏特征的操作。
接下来是整体融合架构图,一共分为三层,这里也是使用了stacking的方式,第一层得到的结果作为特征,然后再与基础特征和特征工程部分构造的特征进行拼接,这里作为第二层的操作。第三层继续训练,最后加权得到最终结果。(想想当初的比赛,这么复杂的架构才能得到第九名的成绩)
选手还用到了FTRL和FFM模型,现在也许很少有人在比赛中用到FTRL模型,FTRL本身适用于处理超大规模数据的,以及含大量稀疏特征的在线学习的常见优化算法,常用于更新在线的CTR预估模型。FFM是比较经典的CTR模型,使用FM中改进而来。
http://www.csie.ntu.edu.tw/~r01922136/slides/ffm.pdf
最后使用了均值调整的方法,我本人在IJCAI18比赛中也有借鉴,主要是对结果进行修正。
第八名:wenlin
先来张可视化分析,可以清楚的看到转化率每天的变化,发现30号的转化率非常低,选手进行了两个方面的分析,并做了下面的处理。
上面给出了样本构建的方法,也是很常规的。
六大类特征,也是比较基础的。基础特征、用户类别特征、广告类特征、上下文特征、交互特征和其它特征。这里的重点是其它特征,选手称之为trick特征。
我自己思索半天后,认为短时间的重复点击可能是用户页面反应迟钝等原因,那如果一整天的重复点击当作一次转化,应该是系统的计数方式,用户对广告在一天内不能多次记录转化,否则有刷转化的嫌疑。
对于当天重复样本的时间差计算,可以设想我们浏览页面,往往最后一次浏览点击可能性最大 ,第一天的可能性也能性最小。用时间差来反应点击的可能性。
选手最后给出了自己的经验总结,也是很值得借鉴学习的。
第七名:永不理解
选手首先给出了两个问题,数据分布线上线下分布不一致和决赛数据量大的问题。可能会存在一些appID仅出现在训练集,测试集中并没有出现的情况。
方案也是比较常规的,树模型打底,最后stacking进行融合。
前面的队伍虽未提到特征选择,不过,特征选择也是竞赛中一大提分方向。
在这个方案中,选手使用了三种特征选择的方法,比较常见的特征重要性和Wrapper两种方法。对于删除线上线下均值差异30%以上的特征,这个方法还是第一次见到,应该是对于那些影响结果均值很大的特征,选择将其删除。(不知道理解的对不对)
模型模块
模型使用了xgboost和lightgbm,然后使用了交叉验证的方式。最后融合使用了stacking,分为多层,每次预测结果作为新的特征,合并到初始特征中,或者新的特征集中,继续训练。
下面的两种方式可以选择使用,主要在于模型效果的差异程度而做决定。
首先将各个模型的结果代入到sigmoid反函数中,然后得到其均值,对其结果使用sigmoid函数。相较于普通的加权平均,这种方法更适合于结果具有较小差异性的。
代码语言:javascript复制def f(x):
res=1/(1 np.e**(-x))
return res
def f_ver(x):
res=np.log(x/(1-x))
return res
第六名:闹猫
选手首先给出了整体工作流,箭头上的应该是使用的特征个数。(超级少啊)
理解业务流程,移动APP转化跟踪技术有哪些方案,帮助我们对业务更深入的理解。
转化天然的回流时间较长,移动 APP 激活延迟可达数日,电商下单延迟可达数十日。可以构造平均回流时间特征,利用回流时间方式不对的话很容易造成leackage,计算了每个appID的平均回流时间,没有回流的app用其所在类的平均回流时间代替。
本次竞赛的训练数据提供的截止第31天0点的广告日志,因此,对于最后几天的训练数据,也就是说后五天部分用户实际上是转化了,但广告主还没有来得及将这条转化汇报给广告系统,导致数据集中的label被误标记为了0(实际上是1)。
这里可以采取了一种很暴力的方法,即去掉每个广告主最后一次回流之后的数据。
通过分析可以发现,其实有近一半的广告主还是尽职尽责的,直到30号23点还在反馈回流。只有有一部分广告主在30号下班后,或29号下班后就不回流了。所以我们可以将这些广告主最后一次回流之后的数据都删除(其实这些都是负样本),这样就在一定程度上减少了不准的负样本。
如何发现强特征:假设、验证、解释和归纳
就为什么有重复点击?重复点击如何处理?或许是异常数据,或许是提分关键。
初赛阶段选手仅用了21个特征,可见,特征多了不一定好,关键还是寻找关键特征。
最后给出了整体性能,除了在FFM阶段花费了许多时间,其余步骤效率还是蛮高的,主要还是在于只提取了少量特征。
第五名:SkullGreymon
先大概浏览下基础特征,主要是常规的统计特征。
Leak特征其实是把双刃剑,指的是本来不应该出现在X里的、和目标y有关的数据,出现在了X中。选手对于点击当日特征进行了LEAK和非LEAK的分类,比如当前是否是用户今天最后一次点击,这就明显属于数据Leak特征,因为当前面的点击发生时,你是不知道后面是否还会发生点击。
接下来对离散特征进行编码,并进一步提取特征,方法也是比较常规。
连续型特征分箱,其实就是GBDT提取离散特征,也是比较经典的方法。GBDT LR算法解析及Python实现 - Bo_hemian - 博客园
选手的整体模型架构,也是做了两层的融合得到最终结果。
第四名:到底对不队
让我们再次回顾下业务,深入理解业务,非常有利于我们构造特征。
通过XGB得到叶子节点特征,然后喂入FFM能够达到Top10的名次。其中,特征部分也都是之间所介绍的。
特别地,选手还对deepfm进行了改进,我们指导基本的deepfm是FM层结合MLP,这里添加了Global embedding。
整体模型架构共三层,中间对结果进行
逆变换,然后是LR LGB,再进行
逆变换,最终是LR得到结果。
团队所面临的困难调整,特征表现差、模型效果差、迭代速度太慢和线上线下不一致等。
季军:我很难受
已经到了季军方案的介绍,我们先再次回顾下赛题,所给数据,目标,以及评价指标。
线上线下数据切分,避免数据泄露
训练数据的末尾几天由于转化时间的滞后性,存在错误标签的样本,越靠近第30天,错误样本的比例越大,线上成绩反馈表明,直接将第30天放入训练样本中训练,成绩将会大幅下降。为此我们定义了app非当天转化率来对数据做清洗。
三组特征群,用户、广告和App相关特征组。
更细致的可以分为基础ID特征、统计特征和时间特征,这些与前面类似。
因为数据量庞大,盲目的通过模型测试特征变得十分浪费时间,因此我们在每次测试特征前都会对当前特征做分析,当特征在不同取值下转化率有较大差别的情况下才会用模型测试。
接下来进行stacking操作,进行最终的模型融合。
亚军:Raymone
首先来看下亚军选手的框架设计,从数据处理到最终预测的流程。
冠军:nju_newbie
冠军团队的框架设计,可以看到,这里使用了更多模型,如经典的wide&deep、PNN,以及选手改进的NFFM。
数据去噪主要还是围绕回流数据来处理的。
主要四类特征,转化率、点击特征、时间特征和安装特征。
用户点击次数越多,他的转化率越低,这里包含很大重复点击,是无效的。
充分考虑了各时间粒度下的信息挖掘,围绕User、App和Position为对象,单个构造或组合构造。
最终融合部分,选手使用了8个模型,部分相同的模型,或许是特征组、样本集、参数的不同而构造的差异性。
在最后选手给出了关键问题和解决方法。
问题一:点击次数过少的系数值,如何计算转化率?其实不太清楚UserID的转化率处理,一般而言都会使用加入贝叶斯平滑的转化率。所以encode(m,n)的含义如何,不得而知。
问题二:过拟合问题
问题三:NFFM训练速度问题