1. 程式人生 > >科大訊飛AI營銷大賽 CTR預估總結

科大訊飛AI營銷大賽 CTR預估總結

背景介紹
科大訊飛AI營銷雲在高速發展的同時,積累了海量的廣告資料和使用者資料,如何有效利用這些資料去預測使用者的廣告點選概率,是大資料應用在精準營銷中的關鍵問題,也是所有智慧營銷平臺必須具備的核心技術。本次大賽提供了訊飛AI營銷雲的海量廣告投放資料,參賽選手通過人工智慧技術構建預測模型預估使用者的廣告點選概率,即給定廣告點選相關的廣告、媒體、使用者、上下文內容等資訊的條件下預測廣告點選概率。希望通過本次大賽挖掘AI營銷演算法領域的頂尖人才,共同推動AI營銷的技術革新。

相關資料:

資料項內容

上下文資訊11個 廣告資訊16個
osv 作業系統的版本 orderid 訂單id
os 作業系統櫃 adid 廣告id
os_name 作業系統名 advert_id 廣告主id
make 手機品牌 advert_name 廣告主名稱
model 手機型號 advert_industry_inner 廣告主行業
province 省份 campaign_id 活動id
time 時間戳 creative_type 創意id
city 城市 creative_type 創意型別
nnt 聯網型別 creative_tp_dnf 樣式定向id
carrier 運營商 creative_has_deeplink 相應素材是否有deeplink
devtype 裝置型別 create_is_jump 是否有落地頁跳轉
create_is_download 是否有落地頁下載
媒體資訊 5個 creative_as_js 是否為js素材
app_cate_id app分類 create_is_voicead 是否為語音廣告
f_channel 一級頻道 creative_width 創意寬
app_id 媒體id creative_height 創意高
inner_slot_id 媒體廣告位 使用者資訊 1個
app_paid app是否付費 user_tags 使用者標籤

比賽分析

  • 由於是CTR預估問題,因此該問題可以簡單的抽象為樣本分佈不均衡的二分類問題,需要預測的內容為使用者是否會點選該商品。評測指標為logloss。
  • 而資料方面大致可以分為四類:上下文資訊(11個), 媒體資訊(5個), 廣告資訊(16個), 使用者資訊(1個),幾乎所有特徵都為類別型特徵。
  • 資料量為100萬條30維左右的資料

資料預處理
資料合併: 將不同分佈的資料進行整合

資料取樣:正負樣本比為1:4,屬於非均衡類別,不過負樣本資料量尚可,因此對其採用了欠取樣操作,去除了一部分過量的負樣本。

EDA探索性資料分析:

  • 首先觀察了單變數的分佈,如在手機品牌這方面OPPO和 vivo的使用者最多,而這兩種機型的使用者點選率也高於其他手機的使用者
  • 對不同特徵和標籤之間進行組合,繪製柱狀圖觀察影響(如不同時刻點選的總數量,不同的廣告長度和寬度對點選的影響)。

資料清洗:對重複值使用dropna操作將其去掉,對異常值資料進行了一些清洗(如make手機品牌中出現了一些具體型號的異常值,進行了統一的品牌合併如iphone/apple),一些可以預測出來的異常值,由手機品牌可以由手機
型號反推,訓練了一個簡單的隨機森林去進行擬合。其他難以推測的缺失值採用了眾數的方法進行填充

時間序列交叉驗證:在進行交叉驗證時分數很好但LB的分數卻不理想,後來發現是因為忽視了時間序列的影響因素,導致了時間穿越,也就是用未來的資料去預測過去的資料,在切分驗證集的時候,標準的做法是構建時間窗,有規律的用前面七天的資料作為訓練集,
第八天的資料作為驗證集修改之後,效果有了一定的提升。

資料洩露:data leakage模型在訓練時已經見過驗證集,儘管不是直接看到驗證集,但基於全量資料的統計特徵已經洩露了一部分驗證集資訊,為了改善這種情況,
我將統計特徵的統計範圍從原來的全量資料改為了訓練集資料,重新訓練後logloss進一步從0.22降至了0.19。學習到的點在於應該先劃分資料集,再構造特徵,而不是先構造特徵再劃分資料集。同時也明白了pipline在一定程度上可以避免混淆對於訓練集和驗證集的不同的操作(前者使用fit_transform(), 後者使用transform())

特徵工程

  • 由於大部分特徵都是類別型特徵,因此對部分特徵進行了交叉特徵的構建。
  • 對時間特徵進行了分組劃分,額外生成了早上下午晚上午夜四個時間段,能在一定程度上增加資訊量。
  • 對版本號進行了更細粒度的刻畫 5.1.1>–5 1 1 ,將一維文字資訊變為三維類別資訊
  • 對數字代表的地理位置資訊進行了更細粒度的切分,如:510410,51代表廣東省,04代表廣州市,10代表白雲區
  • 對大部分特徵進行了計數統計, 對能進行groupby操作的特徵進行了彙總統計。
  • 構建了比例特徵(如廣告主id的某個廣告id投放比例)
  • 構建了類別變數的nunique特徵(如廣告主id有多少個不同的廣告id)
  • 針對類別型的特徵和標籤之間,構建了分組統計點選率,如不同APP,不同手機點選率的平均值,最大最小值,這稱為feature encoding,加入之後驗證集的分數從0.41左右大幅下降至0.22,和之前完全不在一個水平線上。
  • 針對類別型特徵進行了OneHot-Encoding,對於類別較多的特徵,把長尾部分歸為其他類,大幅減少了資料的維度,同時用sparse將係數矩陣轉換為稠密矩陣,提升了訓練速度。
  • 對相互之間並非完全獨立,有大小,級別關係的類別型特徵,採取了Label encoding而非OneHot-encoding,來體現出他們之間的關係,避免資訊損失
  • 特徵篩選方面,使用了基於樹模型產生的feature importance的方法來進行特徵篩選,剔除掉一些冗餘的特徵。

引數調節(GridSearchCV):

boosting_type=‘gbdt’,
num_leaves=48,
max_depth=-1
learning_rate=0.02,
n_estimators=6000,
max_bin=425,
subsample_for_bin=50000,
objective=‘binary’,
min_split_gain=0,
min_child_weight=5,
min_child_samples=10,
subsample=0.8,
subsample_freq=1,
colsample_bytree=0.8,
reg_alpha=3,
reg_lambda=0.1,
seed=1000,
n_jobs=-1,
silent=True

模型融合

  • 通過stacking模型融合的方式最大限度度在減小資料維度的同時儲存原有特徵資訊。
  • 把Xgboost和LightGBM進行了一組stacking融合,把LightGBM作為基模型(因為其處理資料的速度更快),Xgboost作為二級模型(其預測效果更準確),說白了就是以LightGBM給出的預測作為訓練資料,再訓練一次Xgboost,從最後的效果上來看,有提升,但不如特徵工程來的明顯。
  • 訓練多個上述stacking模型,每個模型差異化訓練不同特徵,又進行了一次bagging操作,分數由有所提升。
  • 在融合結果的時候,發現使用調和平均(倒數求平均再取倒數)的效果要優於加權平均,調整後分數有所上升。

思考總結

  • 對於CTR問題而言,廣告是否被點選的主導因素是使用者,其次是廣告資訊。所以我們要做的是充分挖掘使用者及使用者行為資訊,然後才是廣告主、廣告等資訊。
  • 這類問題評估函式常用logloss和AUC,簡單的說logloss更關注和觀察資料的吻合程度,AUC更關注rank order。如果是按照概率期望來進行收費投放的話就用logloss,如果定投一定量就用AUC,主要還是和業務相關。
  • 匿名化資料需要對資料進行充分理解分析,甚至可以嘗試根據業務理解進行反編碼,這樣能夠為特徵工程指明方向。
  • 建模過程中充分考慮了使用者標籤與其他資訊的互動作用,並採用Stacking抽取特徵資訊的方式減少維度與記憶體的使用,對廣告與使用者互動資訊的充分挖掘,也使得模型在AB榜測試相對穩定。
  • 模型缺乏差異性和創新性,最開始嘗試過deepffm,由於效果一般而沒有堅持改進,大部分精力放在了資料理解與特徵挖掘上。