IJCAI-15 商家促銷后的重復買家預測比賽紀實
標簽: ML比賽 IJCAI
比賽介紹
兩年一屆的人工智能頂會IJCAI與阿里合辦的機器學習比賽。由Alibaba inc.提供比賽數據。和去年以及今年的天池大數據競賽賽題相似但又不同。
我們知道,國內外的電商有各種各樣促(pian)銷(qian)活動,像國外的黑五(Black Friday),國內的雙十一等等。大量商家通過打折促銷吸引顧客。而我們,aka. 剁手黨,也在這一天伺機而動。其中,有許多顧客是被商家的促銷所吸引的新顧客,那么他們會不會在促銷之后繼續在這家店買東西呢?本次比賽題目就是預測這些會重復購買的顧客。
比賽分為兩個階段(阿里比賽的一貫套路),第一階段數據量相對較小,參賽者可以本地建模,提交最終的結果即可,最終TOP50的選手or隊伍可以進入第二階段。第二階段則需要把代碼提交到阿里的云平臺上運行(當然是官方提供的接口)。
比賽的評測標準是ROC曲線下面積(AUC[1])。典型的二分類分類器評估標準。
我們隊伍LinkinPark在Stage1 rank9,Stage2 rank4. 第二階段最后幾天被擠出前三。。(囧)。
數據分析與預處理
數據格式 | 文件名 | 字段 |
---|---|---|
data format 2 | train_format2.csv | user id,age range,gender |
merchant_id,label,activity log test | ||
test_format2.csv | user_id,age_range,gender | |
merchant_id,label,activity log test | ||
data format 1 | user_log_format1.csv | user_id,item_id,cat_id,seller_id |
brand_id,time_stamp,action_type | ||
user_info_format1.csv | user_id,age_range,gender | |
train_format1.csv | user_id,merchant_id,label | |
test_format1.csv | user_id,merchant_id,label |
先來看看第一階段提供下載的數據。官方提供了兩種數據格式(見下表)
數據格式 | 文件名 | 字段 |
---|---|---|
data format 2 | train_format2.csv | user id,age range,gender |
merchant_id,label,activity log test | ||
test_format2.csv | user_id,age_range,gender | |
merchant_id,label,activity log test | ||
data format 1 | user_log_format1.csv | user_id,item_id,cat_id,seller_id |
brand_id,time_stamp,action_type | ||
user_info_format1.csv | user_id,age_range,gender | |
train_format1.csv | user_id,merchant_id,label | |
test_format1.csv | user_id,merchant_id,label |
兩個數據格式都包含了雙11之前6個月的用戶行為日志,label表示用戶是否在雙11之后的6個月內重復購買,在格式2的數據中,label有-1的,表示當前用戶不是當前商家的雙11新用戶。可見,格式一的數據是user-friendly(官方說法)的,易于做特征工程。然而,格式一中是沒有label為-1的(u,m)對的,因此相比格式二會少一些信息。
Data format | #Pairs | #User | #Merchant | #Item | #Cat | #Brand |
---|---|---|---|---|---|---|
data format 1 | 4215979 | 126474 | 4995 | 800322 | 1542 | 7936 |
data format 3 | 14052684 | 424170 | 4995 | 1090071 | 1658 | 8444 |
我們現在將那些label為-1的數據記為Data format3,來看看format1和3的數據統計信息(下表)。
Data format | #Pairs | #User | #Merchant | #Item | #Cat | #Brand |
---|---|---|---|---|---|---|
data format 1 | 4215979 | 126474 | 4995 | 800322 | 1542 | 7936 |
data format 3 | 14052684 | 424170 | 4995 | 1090071 | 1658 | 8444 |
---- | #Click | #Cart | #Favour | #Buy | Total |
---|---|---|---|---|---|
All-Period | 48550712 | 67728 | 3277708 | 3005723 | 54901871 |
11-11 | 9188150 | 12621 | 1220285 | 156450 | 10577506 |
Daily Average Before 11-11 | 224928 | 299 | 11181 | 15485 | 240594 |
然后再看看雙11和非雙11用戶各種行為統計。
---- | #Click | #Cart | #Favour | #Buy | Total |
---|---|---|---|---|---|
All-Period | 48550712 | 67728 | 3277708 | 3005723 | 54901871 |
11-11 | 9188150 | 12621 | 1220285 | 156450 | 10577506 |
Daily Average Before 11-11 | 224928 | 299 | 11181 | 15485 | 240594 |
雙11的行為數數十數百倍于平時。。。
特征工程
對于一般的分類算法,特征空間的選擇是非常重要的,即使你的算法再牛逼,沒有好的搜索空間的支持,也然并卵。因此特征工程在DM/ML比賽是大廈的基石,它決定了你的樓能蓋多高。
特征體系
統一介紹一下兩個階段用到的特征,第二階段的特征幾乎涵蓋了第一階段的。
- Baseline特征
官方提供的一套為LR設計的特征體系。首先,獲得每個商家的最相似的5個商家,計算方法是統計商家之間的共同用戶。這些商家的id離散化作為特征(4995維稀疏特征)。然后,取當前用戶對當前商家的行為特征。 - 信息描述類特征
這是我們特征的主力軍,時間都花在這上面了。這部分特征幾乎都是具有物理意義的特征,總體可以分為三種:user,merchant,(u,m)對特征。由具體的物理意義再分為三類:- 計數類:行為計數、行為天計數、行為對象計數等;
- 比值類:平均每天行為、回購率、每月行為占比等;
- 生命周期類:用戶首次/最后行為日、生存周期。
- 離散特征
為什么要設計這套特征?為了使ID類完全個性化,用在LR上效果特別好(線性模型,L1正則,可實現效果好)。
離散的方法,是將類別|ID可取的值展開成多維稀疏向量,只有對應的部分標1,其余為0.我們離散的特征為:- 用戶的年齡和性別;
- 當前用戶在當前商家購買的商品ID、商品類別ID、品牌ID;
- 當前用戶在當前商家重復購買的品牌ID。
特征處理
LR是一個傲嬌的模型,喂的特征量綱不統一他是不會吃的- -。因此我們需要統一量綱。我們使用了log轉化,即對會產生問題的特征進行了log(x)的轉換。為什么不用z-score/minmax歸一化方法?純粹是因為第二階段提供的特征提取框架很難實現。
工具和平臺
第一階段
scikit-learn[2]+xgboost[3],我是python黨;)
xgboost是個好工具!感謝陳天奇大神帶來這么牛x的GBM實現。
第二階段
第二階段官方提供了一個平臺“方便”參賽者提取特征和跑模型。基礎平臺:阿里ODPS,特征提取:Graph(管理員說的,我估計是graphlab那個框架),lr,gbrt實現:Xlib。
如果我們只用Xlib的LR和GBRT的話,我們只需要提供提取特征的代碼,并打包提交即可。
這個平臺讓人蛋疼的幾點:
- 首先是特征提取。集群使用十臺worker虛擬機,每個worker上有10個vertex,用戶的日志(format2)被分別分在這些vertex上,特征提取程序分別在這些vertex上運行,達到并行的效果。這里,可以編程使每個用戶的log都分配在同一個vertex上,但是每個商家就不一定了,因此如果我們在這個框架下提取商家的特征,會導致這些特征不是全局的問題- -。我們只能使用stage1的數據提取特征在作為輔助文件上傳。。。
- 其次是模型融合。官方的框架無法實現線上LR和GBDT哪怕是簡單stacking learning的融合。這使得我們只能以單個模型比賽(雖然大家都一樣。。)。
模型
- LR:Logistic Regression[4],簡單實用,線性模型,訓練快速。可用L1/L2正則化,SGD。在面對stage2 100W+維特征時候表現很好。
- RF:Random Forest[^rf],各種隨機,多棵樹融合。stage1作為輔助模型融合。
- GBRT:Gradient Boost Regression Tree[5],梯度提升框架,不用特征歸一,泛化強,效果贊。再次膜拜其實現Xgboost[3]。
- MFM:Multi-Instance Factorization Machines,這個模型是我們隊一個大牛設計的,結合了Factorization Machines[6]和Multi-Intance[7]框架。
MFM不需要做特征工程!我們需要做的就是將每個用戶的log打包,對于一個(u,m)對,一個log加上一個flag(這個log是否與m相關聯)對應一個instance,一個用戶的所有instance為一個bag。所以最終用戶是否是商家的重復買家取決于用戶所有的log是否發生在當前商家。
FM被用來預測一個instance對一個重復買家的positive貢獻,由等式1定義,其中$M(x)$由等式2定義。
$$
Pr(y(x)=1;w,{v}) = \frac{1}{1+e^{-M(x)}}
$$
$$
M(x)=w_0+\sum_{i-1}Dw_ix_i+\sum_{i=1}{D}\sum_{j=i+1}^{D}<v_i,v_j>x_ix_j
$$
我們要求得目標函數是:
$$
argmax_{w,{v}}\prod Pr(y(B^+)=1)\prod Pr(y(B^-)=-1)
$$
使用SGD學習$w,{v}$,再用L-BFGS調節L2正則化后的所有權重。
模型融合
我們第一階段的融合框架:
Model | GBRT | GBRT | GBRT | RF | Final Model |
---|---|---|---|---|---|
Feature Set Size | 383(all) | 276 | 254 | 383(all) | mix |
AUC | 0.702711 | 0.702645 | 0.702585 | 0.701084 | 0.70319 |
其實很簡單,就是特征池中選擇特征$\rightarrow$模型$\rightarrow$stacking learning[8]。
我們直接把MFM的結果作為一個High-level的特征加入到特征池中。提升了0.0018,0.700936$\rightarrow$0.702711.
各模型結果:
Model | GBRT | GBRT | GBRT | RF | Final Model |
---|---|---|---|---|---|
Feature Set Size | 383(all) | 276 | 254 | 383(all) | mix |
AUC | 0.702711 | 0.702645 | 0.702585 | 0.701084 | 0.70319 |
結果
第一階段我們隊伍獲得了第9。
第二階段我們隊伍獲得了第4。
總結
歷程
寫一下我參加這次比賽的歷程,由于今年阿里的移動推薦比賽,第一階段就被淘汰了(T.T)才轉戰這個比賽的。看完賽題就著手做了起來,每天想一些新的特征,再xgb調調參數,分數一直穩步再漲,一度到了LB6。然后有幾天分數就卡主上不去了,當時想著是不是應該招人組個隊,分享一下思路。于是去比賽論壇上發了個貼子,當天晚上和之后的那個隊長聊到了2點多鐘。。。他是有老師支持的(真好),雖然當時他們名次沒有我高,我還是同意讓他當了隊長(畢竟人家帶著一幫人。。),第二天我們隊又來了個大牛,就是做MFM那個,他是自己造的輪子,分數有0.689.于是我們隊就在最后五天組成了。然后我們就在最后五天進行了特征融合,他們那邊把特征輸出給我,我來組合,跑模型,跑完的結果在給他做ensemble。
經驗&教訓
- 組隊真的有必要。個人精力非常有限,組隊不僅可以提供新的思路,還能使任務并行。
- 這種比賽拼的到底是什么。我覺得1.特征工程,對數據的理解,不停地嘗試都是特征工程需要做的。2.融合,之后參加了幾次kaggle比賽知道了融合強大,簡單的stacking learning就能獲得不少的提升。
- 一個教訓是我們在組隊之初犯了許多錯誤,沒有一個比較規范的融合模式,導致比較混亂。
Reference
-
Andrew P. Bradley. The use of the area under the roc curve in the evaluation of machine learning algorithms. Pattern Recognition, pages 1145–1159, 1997. ?
-
Olivier Chapelle, Eren Manavoglu, and R′omer Rosales. Simple and scalable response prediction for display advertising. ACM Transactions on Intelligent Systems and Technology, 5(4):61:1–61:34, 2014. ?
-
Jerome H. Friedman. Greedy function approximation: A gradient boosting machine. Annals of Statistics, 29:1189–1232, 1999. ?
-
Steffen Rendle. Factorization machines. In IEEE International Conference on Data Mining series (ICDM), pages 995–1000, 2010. ?
-
Oded Maron and Tom′as Lozano-P′erez. A framework for multiple-instance learning. In Advances in Neural Information Processing Systems 10, pages 570–576, 1997. ?