1. 程式人生 > >第一屆騰訊社交廣告 高校演算法大賽--基基復基基隊伍分享(進入決賽)

第一屆騰訊社交廣告 高校演算法大賽--基基復基基隊伍分享(進入決賽)

我們是參加騰訊社交廣告演算法大賽的隊伍,這次想在這分享下我們隊伍的經驗。首先介紹下我們隊伍,我們隊伍3個成員是來自西安電子科大和長安大學的高校生,在網際網路上了解到這個競賽,挺感興趣,所以就參加了這個競賽!

這次競賽的要求是讓選手預測出 App 廣告點選後被啟用的概率,也就是一種轉化率的變形問題。對於這種問題,在提取特徵的時候一般有3種有效的特徵,一是原有的id特徵,二是根據一些id特徵做出來的歷史轉化率特徵,三是相似度特徵。對於我們這次競賽,應該具體情況具體分析。

這次競賽沒有把所有的資料全部放在兩個檔案,也就是訓練集和測試集中,而是給了8個數據檔案,其中包括訓練集、預測集、還有6個其他資料檔案。在訓練集和測試集中,共有的特徵是:clickTime(使用者點選時間,我想應該是點選廣告中素材的時間,題目沒明說);creativeID(廣告素材的id),userID(使用者id),positionID(廣告位id,廣告曝光的具體位置),connectionType(移動裝置當前聯網方式),telecomsOperator(運營商);訓練集還多個 lable 列(我們要預測的列,二分類)和conversionTime(轉化迴流時間);訓練集給了第17天到第30天的資料,也就是說點選時間是從第17天開始的,測試集是要預測第31天的情況。

其餘的6個數據檔案依次是:

1、user.csv (使用者基礎特徵檔案):有 使用者 id、年齡、性別、教育程度、婚戀狀態、是否有小孩、家鄉、常住地;

2、app_categories.csv ( App 特徵檔案):有 Appid、app分類;

3、ad.csv (廣告特徵檔案):有 廣告主 id、推廣計劃 id、廣告 id、素材 id、App的 id、App 所在平臺;

4、position.csv (廣告位特徵檔案):有 廣告位 id、站點 id、廣告位型別;

上面4個檔案,我都可以根據 和訓練集 預測集中相同的列,將他們的資料 merge 到訓練集 預測集中,這樣就完成了第一部分特徵的提取,對於其他幾部分特徵,我之後就不再舉這麼詳細的例子了!

5、user_installedapps.csv(使用者 App 安裝列表檔案):截止到訓練資料時間段中第一天使用者全部的 App 安裝列表,但是這個檔案中只有 144萬用戶,和訓練集中的 259萬用戶 相差些,和測試集使用者的交集是 15萬(測試集中一共有29萬用戶);

6、user_app_actions.csv (使用者 App 安裝流水檔案):有3列,使用者 id、安裝時間、appid,但是這個檔案只有 78萬用戶,和訓練集中的259萬用戶 相差些,和測試集使用者的交集是 8萬(測試集中一共有29萬用戶)。

一、上面是資料分析過程,接下來說下我們的特徵提取。

我們的特徵主要有4個部分組成

1:第一個部分是基礎Id特徵,上面提到的幾乎都有。剛開始我們使用了這些特徵,後來將每一個基礎id特徵都用相應的“轉換率”進行了替代(對轉化率的定義是:在過去7天中,這款appID  label 為1的數目/(Label為0 + label為1的總數目))。

2:第二部分是組合特徵,我們進行暴力搜尋,首先進行兩兩組合,然後用230多個組合特徵進行預測模型,得出最中要的50個,在組合特徵中最重要的一些是:position和其他的組合。 然後提取出來他們的轉化率

3:第三個部分是提取的一些統計特徵+trick

(使用者每天點選app多少次、這款appID在全域性上的label為0的資料/label為1的數目)

(trick也是這個比賽所有隊伍都比較在意的一些強特徵,實際上這些trick是根據真實資料的特徵分析出來的,初賽和複賽的trick都不一樣,初賽的時候,是 對相同樣本~clickTime+userID一樣就定義為相同樣本  進行排序,總數這兩個特徵;           複賽的時候是:同一個userID資料進行排序、統計總數、和第一條樣本的時間差、和最後一條樣本的時間差、每相鄰兩個樣本之間的時間差,在初賽、複賽的時候這些trick都能提高 兩個千分點)。

二、一些提分點:

1:轉化率很重要,但是轉化率在提取的時候我們是基於過去7天資料來提取的,所以對一些具有時間性質的組合特徵,有時候就會出現在上一個7天中某個屬性的轉化率是0,但是在下一個7天中那個屬性可能就不是0,這樣不符合實際情況,會降低模型的預測效果,所以需要 拉普拉斯休整,這樣可以提高0.5個千分點:

2:tfidf特徵:對比賽過程中兩個很大的資料檔案user_installedapps.csv user_app_actions.csv,做統計特徵的話,費時間而且效果不好。所以計算每一個appID的tfidf值,計算出來最合適的幾個appID來當做特徵(我們隊伍沒做)

3:模型部分提分點,在下面部分提及

三、模型部分

上面是所有的資料處理部分,接下來講下我們的模型部分,在這次競賽中很多選手都選用了 xgboost 和 ffm 這兩種模型,初賽的資料量不是很大,用這兩種模型還說的過去,但是在複賽的時候,資料量幾乎達到了原先的10倍大小,只有在 xgb 上設定 gpu 加速模組,同時增加機器的核數以及gpu,在引數設定中將這些設定好,才能達到一個不錯的速度。

我們在初賽使用了 xgb + lightgbm這兩種模型,下面介紹下其中的xgb模型

首先因為它是一種樹模型,屬於 booster 的迭代演算法,支援損失函式,支援L1L2正則可以防止過擬合,裡面還有 scale_pos_weight 這個引數可以調節正負樣本的加權訓練。基分類器是 CART 樹,每一棵樹上的葉子節點都會有對應的判斷,演算法中採取投票器原則,得到最終的預測結果。而且在樹分裂的時候,每一次分裂基於前一次分裂和目標函式 來計算資訊增益,根據資訊增益來選擇最合適的特徵,以及分割點。這是一種很完備的演算法。

我們在複賽的時候樹模型只使用了 Lightgbm這種樹模型,因為這個很快,而且效果和xgb也相當,對複賽這種大資料的情況很適合!

提分點:我們選取了 xgb lightgbm 隨機森林 gbdt這4中模型當做基模型,Lr作為第二層,使用stacking提了一些分

參加這次競賽最要感謝的就是我的師兄隊友們,跟著他們學到了很多知識。這次也希望能將這些知識分享給大家!