广告的实际曝光取决于广告的流量覆盖大小和在竞争广告中的相对竞争力水平。其中广告的流量覆盖取决于广告的人群定向(匹配对应特征的用户数量)、广告素材尺寸(匹配的广告位)以及投放时段、预算等设置项【广告触发】。而影响广告竞争力的主要有出价、广告质量等因素(如pctr/pcvr等), 以及对用户体验的控制策略【广告竞价】。 通常来说, 基本竞争力可以用ecpm = 1000 * cpc_bid * pctr = 1000 * cpa_bid * pctr * pcvr (cpc, cpa分别代表按点击付费模式和按转化付费模式)。综上,前者决定广告能参与竞争的次数以及竞争对象,后者决定在每次竞争中的胜出概率。二者最终决定广告每天的曝光量。
问题:基于历史曝光日志,预估新的广告的日曝光量。
评估标准:
1)准确性指标;
2)出价单调相关性指标;
难点:
1、如何制定模型优化目标【如何将两个评估标准结合起来】=> 简化问题,首先只考虑准确性指标
2、如何构建训练集和测试集,label是啥?=> 回归问题,label是eshow数。之前纠结是否可以从adid维度统计,因为ad会进行操作,被改变。但是没有更好的方法。
3、如何使用广告操作数据【操作时间,投放时段、人群定向】=> 之前考虑结合定向条件,模拟触发。实际上,可以直接使用投放时段和人群定向作为特征
数据分析:
1、历史曝光日志 => 基于这个数据可以统计adid-eventday维度的曝光数【不考虑广告在这一天有操作发生】
广告请求id 广告请求时间 广告位id 用户id 曝光广告id 曝光广告bid pctr quality_ecpm total_ecpm
统计广告曝光数:
tmp = pd.DataFrame(train_df.groupby(['aid','request_day']).size()).reset_index() tmp.columns=['aid','request_day','imp'] log=log.merge(tmp,on=['aid','request_day'],how='left')
2、用户特征属性
3、广告静态数据
4、广告操作数据: 如何利用广告的投放时段和人群定向设置,对广告的修改不考虑到对广告曝光的影响中吗
针对广告操作数据,按照adid排序后,生成['aid','request_day','crowd_direction','delivery_periods']格式的记录,注意request_day覆盖操作日期后至下一次操作日期间的所有天数,然后与广告曝光日志按照adid request_day进行merge,过滤未出现在广告操作文件的广告,这样曝光日志中所有记录有了人群定向和投放时间这两个属性。
生成训练集:以'aid', 'request_day'为key进行去重,同时计算广告当天平均出价和曝光量,然后过滤未出现在广告操作文件的广告,即增加了人群定向和投放时间这两个特征。
生成验证集:过滤掉验证当天操作的广告,和未出现在操作日志的广告。
去重函数:pandas.DataFrame.drop_duplicates(self, subset=None, keep='first', inplace=False)
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html
5、最终没有用到用户属性相关数据。
6、提取特征
a、投放时段特征:广告在投放当天的投放时段和投放时段总数。将十进制的时段转为二进制,注意一周七天都对应不同的投放时段设置。
原始投放时段特征:
281474976710655,281474976710655,281474976710655,281474976710655,281474976710655,281474976710655,281474976710655
b、人群定向特征:
原始人群定向特征:
age:217,202,837,602,935,942,638,287,5,394,536,731,739,393,366,363,400,844,787,187,517,229,105,333,361,608,714,479,1,728,690,753,182,903,988,367,340,972|education:1,4,5,6,8|status:13,15,6,9
共十个维度的人群定向,每个维度提取出一个特征。
c、统计以f1为主键,f2在log中出现Topk的ID。如f1=aid, f2=uid,k=100,则表示访问该广告最多的前100名用户
for item in tqdm(log[[f1,f2,'request_day']].values,total=len(log)): try: dic[item[0]][0][item[1]]+=1 except: dic[item[0]]=[Counter(),Counter()] # 这里只需要有一个counter对象即可 dic[item[0]][0][item[1]]=1 items=[] for key in tqdm(dic,total=len(dic)): conter=dic[key][0] item=[str(x[0]) for x in conter.most_common(k)] if len(item)==0: item=['-1'] items.append([key,' '.join(item)])
collections counter()对象: https://docs.python.org/zh-cn/3/library/collections.html
d、以pivot为主键,统计最近一次f的值。=>统计广告上一次曝光时的imp,bid,pctr,quality_ecpm,totalecpm
#历史特征 for pivot in ['aid']: for f in ['imp','bid','pctr','quality_ecpm','totalEcpm']: history(train_df,test_df,log,pivot,f)
e、统计特征:groupby f1, 然后统计f2上的各种量(size、count、mean、unique、min、max等)
f、word2vec特征:user按照天维度的时间窗构建profile【该user在当天点击过的adid序列】,然后对广告序列进行embedding。
g、deepwalk:代码中是首先生成user -> adid -> user...或adid -> user -> adid...这种序列,然后输入给Word2Vec,最后分别得到user和adid的embedding向量。和原始的deepwalk有区别。
https://maimai.cn/article/detail?fid=1317017525&efid=S4zwF094BbaOA3EYLRBlpg
https://algo.qq.com/application/home/information/info.html
https://zhuanlan.zhihu.com/p/63718151
https://github.com/guoday/Tencent2019_Preliminary_Rank1st/blob/master/src/extract_feature.py