0
雷鋒網 AI 研習社按,本文為 IJCAI-18 阿里媽媽搜索廣告算法大賽亞軍解決方案。本文由作者發在其 GitHub 主頁,雷鋒網 AI 研習社獲其授權轉載。(阿里媽媽憑借舉辦 IJCAI-18 比賽,在雷鋒網學術頻道 AI 科技評論旗下數據庫項目「AI 影響因子」中增加 8 分。)
一、 隊員介紹
隊長:BRYAN
數據挖掘從業者,國內數據挖掘競賽名將,天池數據科學家,IJCAI-17 冠軍獲得者。曾多次在國內外著名賽事中取得名次。
隊員:桑楡
數據挖掘從業者,國內數據挖掘競賽名將,天池數據大師,IJCAI-17 冠軍獲得者。曾多次在國內外著名賽事中取得名次。
隊員:李困困
數據挖掘從業者,國內數據挖掘競賽名將。曾取得 CCF-螞蟻金服-商場定位賽冠軍等多項國內外著名賽事的名次。
二、 賽題背景分析及理解
本賽題為搜索廣告轉化預估問題,一條樣本包含廣告點擊相關的用戶(user)、廣告商品(ad)、檢索詞(query)、上下文內容(context)、商店(shop)等信息的條件下預測廣告產生購買行為的概率(pCVR),形式化定義為:pCVR=P(conversion=1 | query, user, ad, context, shop)。可以將問題抽象為二分類問題,重點對用戶,商品,檢索詞,上下文,商店進行特征刻畫,來訓練模型。
三、 核心思路
(1) 數據分析


通過數據分析我們發現,訓練數據的前 7 天轉化率維持在 1% 左右,但是在 6 號轉化率偏低,在預測當天 7 號的上午轉化率超過 4%,所以這是一個對特定促銷日進行預測的問題。重點需要刻畫用戶,商品,店鋪,檢索詞等關鍵信息在預測日前面 7 天的行為,預測日前一天的行為,預測日當天的行為。
另外 7 號的樣本量遠遠超過前面每天的樣本量均值,是我們重點需要關注的時間區間。主模型是基于 7 號上午的樣本進行訓練,前面 7 天的數據輔助訓練。由于預估時間為 7 號下午,時間相關的特征沒法在上午訓練,為了彌補 7 號上午訓練帶來是數據和信息損失,我們隊伍采用了兩種方式:,一種采用前面 7 天訓練模型預估 7 號得到概率作為新的特征,一種是訓練 7 號之前以及 7 號上午訓練全量模型進行加權。
(2) 用戶分析
從下圖可以看到大部分用戶的點擊次數集中在 5 次以下,8 天的時間內點擊 5 次,說明這是一個低頻訴求的場景。

在下圖中可以看到,大部分用戶都沒有購買行為,少量用戶購買了一次,本次競賽的目標預測用戶是否購買,少量的購買行為構成了數據的長尾分布形勢。

下圖是用戶點擊次數和購買次數的關系,橫軸點擊數,縱軸購買數。可以看到數據是呈左下角分布的趨勢,也就是說購買行為發生在少量點擊次數的情況下,說明這是一個即時興趣,目標明確的場景。我們需要重點刻畫用戶當前狀態。

從用戶分析中,我們發現,點擊一次的用戶占據較大的比例,這部分無法通過歷史行為的特征刻畫表征,因此提供的 query 信息是表征這部分用戶的關鍵;同時,絕大部分用戶沒有發生購買行為,因此,負樣本中包含了大量的信息,另外評估指標是 logloss,需要精確預測購買概率,所以并未對負樣本進行采樣,避免破壞正負樣本分布。
(3) 預處理
缺失值填充:id 類特征使用眾值填充,數值特征均值填充
挖掘隱藏信息:針對 item_property_list 列,統計 property 出現次數,保留出現次數的 top1~top10 作為新的 id 特征;針對predict_category_property 列,直接按順序保留 top1~top10 的類別作為新的 id 特征。針對 item_category_list 列,因為第一個大類都相同,取第二個類別作為新的 id 類特征。
(4) 線下劃分

由于線上提交的次數有限,因此,建立穩定的線下是取勝的關鍵。為提升我們優化算法的效率,減少線上成績的運氣性成分,同時避免我們的算法過度依賴于線上數據集,我們認真地進行了線下測試,分別采取 7 日上午最后兩個小時,7 日上午隨機 15%的數據進行驗證,只有兩者在線下均有提升,我們才進行線上提交。因此,我們始終確保我們在線上驗證的優化在線下均有顯著的提升。
(5) 模型設計
我們采用了 3 種數據劃分方式訓練模型,主模型使用 7 號上午的數據作為訓練樣本,對 31-5 號,6 號,7 號的數據提取特征。全局數據模型使用全部帶標簽的樣本作為訓練樣本,使用全部數據提取特征。時間信息模型使用 31-6 號的數據作為訓練樣本,對 31-6 數據提取特征。訓練的時間信息模型對 7 號全天的樣本進行預測,將預測結果(攜帶了時間信息)作為新的特征添加到前面的模型中,來彌補前面模型對時間刻畫的缺失。

(6) 特征工程
特征工程是模型提分的關鍵,我們從簡單到復雜建立了基礎特征群,轉化率特征群,排名特征群,比例特征群,類特征群,競爭特征群,業務特征群等多種特征群,對用戶及行為進行了細致的刻畫。

在原始特征的基礎上的一些簡單擴充與統計,由于用戶的行為過于稀疏,提取用戶轉化率的時候做了平滑,另外對用戶購買點擊行為做編碼。在 query 交互,用戶交互,競爭特征群中,計算量較大,采用并行的方式提取,提升效率。


為了提高效率,我們采用分批測試特征群的方式進行線下驗證。其中紫色特征群是過擬合的特征群,線下表現突出,在線上表現平平。究其原因是因為,這些特征都是對當天上午的數據進行統計,即使我們使用交叉的方式提取,盡量避免數據穿越,由于上午下午數據分布有差異,所以依然沒能很好的克服過擬合。


(7) 模型融合

不同模型好而不同是融合提升的關鍵,我們隊伍隊員分別做了三個高分模型,每個模型在樣本與特征上均有差異,因此,通過融合進一步提升了成績。最好的單模型依然能保持 top2 的成績。
四、 工程優化
為了使模型更具業務實用性,我們對代碼進行了優化,主要包括下面四個方面:
1)id 類特征重編碼,直接當作特征,樹模型深度設置-1,避免了onehot 大量占用內存空間,實際效果和 onehot 相當。
2)數據并行,主模型 2 小時提取完全部特征。由于 python 的多進程中,子進程會拷貝父進程狀態,如果直接把數據分塊然后使用多進程會導致內存暴漲,所以我們的解決方案是先將數據分塊存為磁盤文件,然后在多進程任務中分別讀取各自數據提取特征,最后合并特征,有效的減少了內存占用。
3)數據合并,訓練預測數據一起提取特征。直接使用 day,hour 等字段在提取特征完畢之后劃分訓練,驗證,測試集。提高了特征提取,線下測試,線上預測的流程效率。
4)特征分批測試,提高效率。由于復賽數據量比較大,如果使用warper類的特征選擇方法會浪費大量時間,所以我們直接按特征群分批測試,使用原始特征+測試特征群的方式進行線下驗證,少量的特征得以快速迭代驗證。
5)并行特征提取的關鍵代碼
數據分塊存儲

特征提取

特征合并

五、 比賽經驗總結
(1)深刻的賽題理解
對賽題進行認真而理性的分析和全面而深入的思考,對不了解之處做相應的調研。
(2)細致的數據分析
從各個維度對數據進行細致的觀察和分析,從中挖掘出重要的規律。
(3)海量的特征
多角度地提取有效特征,構造廣闊而高質量的特征海洋,確保沒有遺漏有用的信息。
(4)強力的模型
訓練多組不同采樣方式、不同特征的強力模型,并將它們融合成威力巨大的終極模型。
(5)未完成的思考
賽題背景是搜索轉化預估,可以直接使用的數據是用戶已經點擊過的數據,實際上我們還可以拿到用戶看到過,但是沒點擊的數據來輔助訓練。一個 query 會出多個商品,用戶可能只點擊了其中一個,如何獲取用戶看到的其他商品呢?關鍵還是在 query 上,如果有其他用戶用同樣的 query 進行了搜索并且點擊了不同的商品,那么這個商品可能就是被其他沒有點擊的用戶看到過的。
(6)比賽與實際業務的差距
在本次比賽中,我們使用了大量的特征以及模型融合,其中存在兩個需要討論的問題。首先是特征,我們使用了部分用戶當前狀態的特征,比如距離上一次點擊時間間隔,距離下一次點擊時間間隔。第一個特征在實際業務中,需要實時提取,如何設計實時特征的計算框架,性能能否跟上都是需要考慮的問題。第二個特征距離下一次點擊時間間隔,這個特征甚至在實際業務中根本提取不到,屬于未來的信息,但是在比賽中卻可以利用到。如果把預測時間段的用戶數據調整為一個用戶只出現一次,那么這個問題就可以得到很好的解決。
隨之而來的另一個問題是,用戶只出現一次,就無法統計到用戶當前狀態的其他未利用到未來信息的特征,像商品店鋪的統計信息也不完全,會引起一個信息缺失的問題。所以如何在比賽與實際業務中平衡數據的利用程度是一個需要考慮到的問題。另外一個是模型設計的問題,實際業務中幾乎不太可能會用到 stack 之類的模型融合方案,模型復雜度帶來的計算代價和線上預估時間的代價可能會超過模型融合性能提升帶來的收益,實際業務簡單加權融合可能會成為多數時候的選擇。
本次比賽我們選擇了 LightGBM 模型,因為數據量少,訓練快,可以在線下快速迭代。在實際業務中,使用的更多的模型可能是 LR,FFM,DNN 之類的模型,實際業務的數據是海量的,這些模型更能學習到穩定魯棒的參數,并且預估速度更快。由于正負樣本比例懸殊,如果考慮訓練效率的話,其實也可以對負樣本進行采樣后訓練,比如 LR 模型訓練之后通過對截距項的修正,依然可以保持預估的數據符合實際分布。
六、 團隊亮點
(1)強大的陣容
聚集三位優秀的數據挖掘競賽選手。
(2)一致的目標
隊員們對本次比賽的目標一致而明確(雖然最終并未達成)。
(3)良好的溝通
隊員們頻繁地對賽題進行討論,及時地同步各自的進展。
(4)完美的配合
隊員們分別訓練不同的模型,彼此的模型差異極大,特別適合進行
融合。
(完)
GitHub 地址:https://github.com/YouChouNoBB/ijcai-18-top2-single-mole-solution