广告点击率实时样本产生
实时样本
什么是样本
样本简单地讲就是用来机器学习的数据,本文所讲样本特指监督学习中的样本,即样本由特征和标签两部分组成。广告点击率预测中的特征主要有三部分,用户特征,广告特征,环境。举例说明,用户特征中有年龄,性别。广告特征中有广告ID,广告主ID。环境特征中有操作系统,联网类型,广告位等等。
什么是实时样本
实 时样本是相对批量样本的概念,批量样本一般是用来训练对实时性要求不高的模型,比如人脸识别,手写识别等。实时样本往往用在数据变化比较大的场景,点击率 预估就是一个场景,因为会不断有新广告等产生(因为现在的技术对于理解广告图片素材,并用来预估点击率还有一些距离,所以广告ID是一个重要特征),并且点击率也是随时间在变化的,比如双11,电商广告的点击率就会高,休息日,游戏广告的点击率会高。使用实时样本的算法目标就是尽可能地掌握这些变化。
批量样本可能是一堆聚合的文件,而实时样本是一个个实时产生的数据,实时训练算法顺序取得这些样本,用来训练,更新模型。
标签
点击率预估问题中的标签是离散的,或是正例,即有广告曝光和点击行为,或负例,即只有曝光,没有点击行为。如果允许一次广告曝光有多次点击,那么标签就是连续的。在实际中,一次曝光的多次点击,最多只有一次会被视为有效点击,所以我们的标签是离散二值的。
曝光和点击会相距一段时间,也就是说只有等一段时间,才能知道样本是正例还是负例。一般来讲有两种选择。
1. 从曝光表中不断扫新数据,数据全部标为负例,从点击表中同时不断扫新数据,数据全部标为正例。这种方式追求速度,但数据的正确性有一定的问题,首先,很明显点击率是对不上了,本来应该是CTR=Postive/(Positive+Negative),现在是Positive/(Positive+Negative+Positive),这个问题倒不大,可以在预测时候修正(Calibration)回来,另一个问题却是无法消除的,这种方法最核心的假设就是各种特征组的点击率都差不多,我这里举一个例子来说明它带来影响,假设一个网页,只有在点了广告的情况下才能看内容,而且用户一般都会点广告后看内容,那这个广告位的点击率接近100%,但使用这种方法后这个广告位却是50%了,但可能这个广告位只占总流量很小的一部分且其它流量点击率很低,使用这种数据学习出来的模型对这个广告位预估点击率无法修正。
2. 关联正负例,通过曝光ID将曝光数据和点击数据关联起来(点击中也有曝光ID),等待一段时间后将关联的数据输出,这里的等待时间就是等待点击数据回流的时间。这种做法在实时性上有了一定的折扣,但更能保证数据的正确性。
等待时间
有的点击可能在曝光几小时后才产生,如果要保证所有的点击都回流,会对实时性影响非常大。所以我们的实现的时候只会保证绝大部分点击回流就可以了。
要确定等待时间需要多长,可以统计点击时间和对应的曝光时间的间隔,找到比如能回流99%点击的时间时隔,在广告点击率预估中,一般X0分钟就足够了。
容灾
实 践中,会因为各种原因导致数据不正常,但最严重且很难监控的是点击数据或是曝光数据丢失。其实曝光和点击数据一起丢了,问题反而不太严重,最多就是模型不 更新。曝光或点击数据丢失往往是网络延时造成的,具体的现象就是曝光和点击丢了一部分,这会导致点击率高一些或是低一些,而对这种监控是比较难做的,因为 每天每小时的点击率都是在变化的,而且实时样本都是流式的,小样本上统计点击率波动很大,很难做到统一的监控。而通过上游进行监控也不太合适,比如曝光丢 了0.1%,影响其实不算大,要这些数据比不要还是会好一些。你可能会想:这丢数据总该是按比例丢的吧,如果没丢到100%,如果用LR算法那预测出来的值或是都偏高,或是都偏低,序是不变的,影响应该也不大。但在广告系统中不是点击率去排序的,而是按eCPM,它等于预估点击率 * 出价,简单地说就是预估出来的值不但要追求序的正确,而且要追求距的正确。
在 实践中我用了一种非常取巧的方法,先说一下背景,广点通排序分为两步,粗排序和精排序,这两步都会预估点击率,区别粗排序要预测的样本远多于精排序,所以 粗排序模型相对要简单一些。我们的数据主要用于粗排序,精排序没使用我们的数据,也就是我们的数据错了,不会影响精排序的结果。在从曝光和点击表中可以得 到精排序的结果,我通过统计精排序和样本点击率的差距,就可以发现是不是出问题了。你可能还会有疑问:如果那精排序如果也因为相同的原因错了呢?你怎么知 道他们用的是批量学习算法?这种情况虽然很少发生,但当然也不是不可能,为了防止这种情况发生,添加了对点击率绝对值的监控,如果明显高于是或低于同期点 击率,告警。