騰訊廣告算法大賽2020賽題初探坑

寫在前面

近日參加了騰訊的廣告算法大賽,從開題到現在將近一週了。雖然有深度學習的背景,但是由於研究方向侷限在圖神經網絡,第一次參加這種數據挖掘類比賽的我簡直是個地地道道的小白。經過了一段時間的迷茫和焦慮 ,探了不少坑,總算是有點入門了,特此記錄一下。

1.賽題和數據

今年的賽題是通過用戶點擊廣告的行爲來預測用戶的性別和年齡。數據包括click_log.csv,user.csv和ad.csv,分別爲用戶點擊記錄,用戶屬性和廣告屬性。

用戶點擊記錄是用戶在3個月內點擊的廣告creative_id以及點擊時間,爲最重要的用戶行爲,後面證實單靠這一數據而不利用廣告屬性數據也可以達到不錯的效果。

用戶屬性包括user_id和性別年齡,在訓練集中user_id範圍1-900000,性別爲1或2,年齡爲1-10,在測試集中user_id範圍3000001-4000000,需要預測性別和年齡。官網的評分方式是兩個預測準確率直接相加,由於性別準確率一般都很高,所以拉開差距的地方在於年齡預測。

廣告屬性creative_id,ad_id,product_id,product_category,advertiser_id,industry,全部爲id類數據,其中creative_id範圍1-4445720,ad_id範圍1-3812202,product_id範圍1-44314,product_category範圍1-18,advertiser_id範圍2-62965,industry範圍1-335。注意到在範圍內的id並非在數據集中都有出現,猜測可能是會在複賽的數據集中。creative_id爲廣告的唯一id,不會重複。某些廣告的product_id和industry爲缺失值,後面我是用0或者均值來作爲這些缺失值的特徵。

2.評分標準

官網的評分方式是年齡和性別兩個預測準確率直接相加。如果你提交的時候其中一項全填0,另外一項填上自己預測的結果,就可以只得到這一項的分數。我基本都是隻提交一項,用來觀察在這個任務上有沒有上分,偶爾才提交一下兩個任務。

根據統計訓練集的情況,用戶的年齡衆數爲3,性別衆數爲1,如果在預測結果中年齡全填3,性別全填1,得到的年齡分是0.224628,性別分是0.668416,總分0.893044,這種我們稱之爲31黨(搖扇子)。

另外可以通過簡單的統計規則預測,即統計每一個廣告的點擊用戶的平均性別和年齡,然後對測試集的用戶,對其所點擊的所有廣告統計特性求平均,作爲預測結果。這種方法的年齡分是0.213886(還不如31黨呢),性別分是0.819938,總分1.033824。建議用模型輸出的預測的時候對比一下這些分數,如果比不上的話該懷疑一下自己了。

3.特徵工程

一開始的工作是構建特徵,而我對於如何處理id類特徵實在是完全沒有經驗,因此也一步一步地探了很多坑。這些實驗都是在性別的任務上進行的,並且由於對傳統機器學習方法不熟,我使用的都是mlp模型。我的輸入爲用戶點擊的所有廣告的特徵的平均,而廣告的特徵由creative_id等6個屬性的特徵拼接在一起。訓練集中劃出100000個用戶作爲驗證集計算線下得分。

3.1one-hot編碼

一開始嘗試的是所有id做one-hot編碼,6個屬性拼接起來一共8365553維數據,一把梭哈全部進LR模型。哦豁機器跑不動了,試驗失敗。

3.2hash特徵

於是乎研究如何將特徵降維降維的方法,盯上了PCA和hash,其中PCA由於維度太大計算的時候內存又炸了,而hash特徵則是我第一個試出來能用的特徵。我的處理方法非常簡單,把輸入id對n求餘,求出來的餘數爲n維one-hot標籤的1的位置,這樣就把輸入的維度降爲了n。這個的壞處是會有很多的id映射到同一個特徵上,成爲hash碰撞。在性別的任務中,線下準確率爲0.8868,線上分數爲0.867622,只比規則的分數略高,而且出現了過擬合。

3.3target encode

後面看到其實有專門針對id的encode方法,one-hot和hash就是其中之2,並且有方便調用的python包,這裏給出GitHub地址:Categorical Encoding。我嘗試了一下里面的target encode,即通過計算某個id的平均label來作爲這個id的特徵,最終是一個數,也就是說我現在的輸入是6個數而不是6個向量。這種輸入下應該是傳統的機器學習方法更優,可我實在是懶得找機器學習方法的代碼,就乾脆還是用mlp來預測。最後的性別分數是線下0.9334,線上0.908578,有了一定的提升,但是由於target encode的計算方法中有用到訓練集的label,所以不可避免地出現嚴重的過擬合。

3.4embedding大法好

embedding是我很早就有的想法,畢竟在nlp領域的word2vec實在是很有用,一直沒有動手去做是因爲我以爲要自己去寫源碼訓練(捂臉),直到我發現了gensim這個包,才發現原來word2vec這麼容易。這裏同樣給出鏈接Gensim

我以一個用戶作爲一個句子,所點擊的廣告按照時間順序作爲單詞,當然這裏面的id可以是creative_id或其他屬性的id,然後用skip gram來訓練出id對應的embedding。得到embedding後跟前面一樣輸入mlp來預測,得到的性別線下分數爲0.92+(未訓練充分),線上分數也爲0.92+,可以看到明顯地已經沒有過擬合了,可喜可賀。再去試了一下年齡任務,線下0.40+,線上0.40+,同樣沒有過擬合。兩個任務合起來提交了一下,總分1.32+,目前的排名是Top50。可以看到embedding的效果實在是非常好,突然心疼我前面找特徵浪費的許多時間。

後面還嘗試了一下利用tfidf來對用戶的所有廣告加權求和,而不是簡單的平均,但是效果反而下降了,感覺是我用的方式不太對。還嘗試了對user做embedding,提升效果不明。

4.總結

花了近一週的時間,幾經波折,終於找到了比較合適的特徵。接下來應該就要在模型和業務上入手了,同時數據其實還可以清洗一下,可能會存在有噪聲。而排行榜前面的大佬,早已一騎絕塵,而且據說只是baseline(搖扇子)。用一句話來說就是:

大佬的baseline,我們的top

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章