廣告的實際曝光取決於廣告的流量覆蓋大小和在競爭廣告中的相對競爭力水平。其中廣告的流量覆蓋取決於廣告的人群定向(匹配對應特征的用戶數量)、廣告素材尺寸(匹配的廣告位)以及投放時段、預算等設置項【廣告觸發】。而影響廣告競爭力的主要有出價、廣告質量等因素(如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