腾讯效果广告采用的是GSP(Generalized Second-Price)竞价机制,广告的实际曝光取决于广告的流量覆盖大小和在竞争广告中的相对竞争力水平。其中广告的流量覆盖取决于广告的人群定向(匹配对应特征的用户数量)、广告素材尺寸(匹配的广告位)以及投放时段、预算等设置项。而影响广告竞争力的主要有出价、广告质量等因素(如pctr/pcvr等), 以及对用户体验的控制策略。
通常来说, 基本竞争力可以用
ecpm = 1000 * cpc_bid * pctr = 1000 * cpa_bid * pctr * pcvr (cpc,cpa分别代表按点击付费模式和按转化付费模式)。
综上,前者决定广告能参与竞争的次数以及竞争对象,后者决定在每次竞争中的胜出概率。二者最终决定广告每天的曝光量。
广告曝光预估如何应用在实际业务中?
腾讯的效果广告主要是展示类广告,其背后的算法引擎本质上是一个推荐框架。当新增一条广告请求时,系统会自动执行召回候选广告和排序筛选两个步骤。
召回的条件是判断广告自身的定向设置、时段设置、素材尺寸是否和当前请求的用户属性、请求时间、广告位规格相匹配。召回之后的候选广告队列会按照一定规则排序。为平衡平台收益和用户体验,排序使用的是广义的eCPM(千次曝光消耗)指标来排序,其中包括:直接与bid(广告主愿意为每次点击付出的钱)、pctr(广告的预估点击率)相关的basic_eCPM;以及和用户体验相关的quality_eCPM。
所以可知,同一个广告bid越大,total_eCPM越高,排第一的可能性越高,获得曝光的机会越大。这也是竞价广告机制的特性之一。
因此,当广告的出价、定向、投放时段和素材被设定好之后,它覆盖的人群范围和实际竞争环境、自身竞争能力就能够大致确定,也就基本决定了广告的日曝光量级。假设我们的广告主投放相对稳定,没有突然出现大广告主出高价竞争,流量也无特别大的波动(比如节假日、购物节等)。这样我们就可以据此预估广告每日曝光。
这样的预估结果能够在实际场景中为广告主服务。广告主可以根据曝光预估结果提前调整出价、定向、时段等设置,结合自身的投放预期选择最适合自己的设置,而不是投放几天之后再去修改,从而减少广告主的试错时间和成本。
本次竞赛将提供历史n天的曝光广告的数据(特定流量上采样), 包括对应每次曝光的流量特征(用户属性和广告位等时空信息)以及曝光广告的设置和竞争力分数;测试集是新的一批广告设置(有完全新的广告id, 也有老的广告id修改了设置), 要求预估这批广告的日曝光 。(出于业务数据安全保证的考虑,所有数据均为脱敏处理后的数据。)
此次问题有两个评判标准,1 准确性相关指标;2单调性指标。准确性指标采用SMAPE,出价单调性指标指对待预估广告 ad, 除出价 bid 外其他设置不变,任意变化 n 个 bid 取值,得到对应的 n 个曝光预估值 ,满足单调性,为此可采用两步走,第一步预测保证单个广告的预估曝光量相同,也就是相同广告id的特征相同。第二步调整广告id预估曝光量的单调性,这里要尽量保证预估曝光量的稳定性,由于不知道真实出价,可对bid进行排名,此外由于要求保留四位小数,单调性调整可使用基准曝光量+0.0001*出价排名。
问题建模:
由于此次比赛只提供了历史广告曝光日志,与广告静态属性以及广告操作属性,所以需要自己构造训练集与验证集。
广告操作数据处理:
由于广告的操作属性如状态取值,出价,投放时段,以及定向人群每天的值是不同的,所以可采用两种方案:第一种是直接取创建时的属性,第二种是利用请求时间以及修改创建时的时间进行匹配得到广告的操作属性,经试验, 线上差距不大。
训练集与验证集生成:
初赛提取方案:以请求时间,广告id为主键,对request-id求count,就得到了某个广告某一天的曝光量。广告id的选取:直观来看训练集样本数量越多,但是仔细读题后发现初赛测试集预测的主要是CPC类广告,所以对于无法在广告操作数据表中匹配到的数据都可以舍弃,这样清洗下来的数据量又明显小了一大截,只剩下十几万了。采用同样的方法训练,虽然数据量变小了,但线上成绩提高了。同时由于0曝光量数量太多,会导致模型学到很多负值,所以可过滤掉请求次数小于特定值,仍旧是0曝光的广告,留下很不容易的曝光广告。
初赛方案:
规则: 可采用测试集前两天的历史曝光量均值:
模型:
初赛主要围绕两方面来考虑:一是用定向时段素材尺寸这 些来召回历史匹配的请求数据, 二是用历史请求数据预估未来的请求数据。
采用广告特征有两方面,第一个是基本静态特征如广告id,广告账户id等属性,第二个是投放时段以及定向人群。对于投放时段以及定向人群,一方面可以看做是多值特征,利用CountVectorizer进行词频统计,第二个是计算投放时 长,第二个是将定向人群特征进行拆分成用户属性,如年龄,性别,地域,婚恋状态,学历,消费能力,设备,工作状态,连接类型,行为兴趣等等。利用user_data日志文件构建字典,通过拆分后的人群属性计算各个字段人群数量。拆分后的定向人群属性同样是多值属性,仍旧采用CountVectorizer进行词频统计。如果想要得到更精确地人群定向属性,可利用深度优先搜索暴力枚举定向人群属性完整的用户属性,不过复杂度太高。
这样就通过定向和用户匹配、广告位和素材匹配等规则估算了广告的覆盖范围。