IJCAI-15 商家促銷后的重復(fù)買家預(yù)測比賽紀(jì)實
標(biāo)簽: ML比賽 IJCAI
比賽介紹
兩年一屆的人工智能頂會IJCAI與阿里合辦的機器學(xué)習(xí)比賽。由Alibaba inc.提供比賽數(shù)據(jù)。和去年以及今年的天池大數(shù)據(jù)競賽賽題相似但又不同。
我們知道,國內(nèi)外的電商有各種各樣促(pian)銷(qian)活動,像國外的黑五(Black Friday),國內(nèi)的雙十一等等。大量商家通過打折促銷吸引顧客。而我們,aka. 剁手黨,也在這一天伺機而動。其中,有許多顧客是被商家的促銷所吸引的新顧客,那么他們會不會在促銷之后繼續(xù)在這家店買東西呢?本次比賽題目就是預(yù)測這些會重復(fù)購買的顧客。
比賽分為兩個階段(阿里比賽的一貫套路),第一階段數(shù)據(jù)量相對較小,參賽者可以本地建模,提交最終的結(jié)果即可,最終TOP50的選手or隊伍可以進入第二階段。第二階段則需要把代碼提交到阿里的云平臺上運行(當(dāng)然是官方提供的接口)。
比賽的評測標(biāo)準(zhǔn)是ROC曲線下面積(AUC[1])。典型的二分類分類器評估標(biāo)準(zhǔn)。
我們隊伍LinkinPark在Stage1 rank9,Stage2 rank4. 第二階段最后幾天被擠出前三。。(囧)。
數(shù)據(jù)分析與預(yù)處理
| 數(shù)據(jù)格式 | 文件名 | 字段 |
|---|---|---|
| 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 |
先來看看第一階段提供下載的數(shù)據(jù)。官方提供了兩種數(shù)據(jù)格式(見下表)
| 數(shù)據(jù)格式 | 文件名 | 字段 |
|---|---|---|
| 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 |
兩個數(shù)據(jù)格式都包含了雙11之前6個月的用戶行為日志,label表示用戶是否在雙11之后的6個月內(nèi)重復(fù)購買,在格式2的數(shù)據(jù)中,label有-1的,表示當(dāng)前用戶不是當(dāng)前商家的雙11新用戶??梢?,格式一的數(shù)據(jù)是user-friendly(官方說法)的,易于做特征工程。然而,格式一中是沒有l(wèi)abel為-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 |
我們現(xiàn)在將那些label為-1的數(shù)據(jù)記為Data format3,來看看format1和3的數(shù)據(jù)統(tǒng)計信息(下表)。
| 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用戶各種行為統(tǒng)計。
| ---- | #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的行為數(shù)數(shù)十?dāng)?shù)百倍于平時。。。
特征工程
對于一般的分類算法,特征空間的選擇是非常重要的,即使你的算法再牛逼,沒有好的搜索空間的支持,也然并卵。因此特征工程在DM/ML比賽是大廈的基石,它決定了你的樓能蓋多高。
特征體系
統(tǒng)一介紹一下兩個階段用到的特征,第二階段的特征幾乎涵蓋了第一階段的。
- Baseline特征
官方提供的一套為LR設(shè)計的特征體系。首先,獲得每個商家的最相似的5個商家,計算方法是統(tǒng)計商家之間的共同用戶。這些商家的id離散化作為特征(4995維稀疏特征)。然后,取當(dāng)前用戶對當(dāng)前商家的行為特征。 - 信息描述類特征
這是我們特征的主力軍,時間都花在這上面了。這部分特征幾乎都是具有物理意義的特征,總體可以分為三種:user,merchant,(u,m)對特征。由具體的物理意義再分為三類:- 計數(shù)類:行為計數(shù)、行為天計數(shù)、行為對象計數(shù)等;
- 比值類:平均每天行為、回購率、每月行為占比等;
- 生命周期類:用戶首次/最后行為日、生存周期。
- 離散特征
為什么要設(shè)計這套特征?為了使ID類完全個性化,用在LR上效果特別好(線性模型,L1正則,可實現(xiàn)效果好)。
離散的方法,是將類別|ID可取的值展開成多維稀疏向量,只有對應(yīng)的部分標(biāo)1,其余為0.我們離散的特征為:- 用戶的年齡和性別;
- 當(dāng)前用戶在當(dāng)前商家購買的商品ID、商品類別ID、品牌ID;
- 當(dāng)前用戶在當(dāng)前商家重復(fù)購買的品牌ID。
特征處理
LR是一個傲嬌的模型,喂的特征量綱不統(tǒng)一他是不會吃的- -。因此我們需要統(tǒng)一量綱。我們使用了log轉(zhuǎn)化,即對會產(chǎn)生問題的特征進行了log(x)的轉(zhuǎn)換。為什么不用z-score/minmax歸一化方法?純粹是因為第二階段提供的特征提取框架很難實現(xiàn)。
工具和平臺
第一階段
scikit-learn[2]+xgboost[3],我是python黨;)
xgboost是個好工具!感謝陳天奇大神帶來這么牛x的GBM實現(xiàn)。
第二階段
第二階段官方提供了一個平臺“方便”參賽者提取特征和跑模型?;A(chǔ)平臺:阿里ODPS,特征提?。篏raph(管理員說的,我估計是graphlab那個框架),lr,gbrt實現(xiàn):Xlib。
如果我們只用Xlib的LR和GBRT的話,我們只需要提供提取特征的代碼,并打包提交即可。
這個平臺讓人蛋疼的幾點:
- 首先是特征提取。集群使用十臺worker虛擬機,每個worker上有10個vertex,用戶的日志(format2)被分別分在這些vertex上,特征提取程序分別在這些vertex上運行,達(dá)到并行的效果。這里,可以編程使每個用戶的log都分配在同一個vertex上,但是每個商家就不一定了,因此如果我們在這個框架下提取商家的特征,會導(dǎo)致這些特征不是全局的問題- -。我們只能使用stage1的數(shù)據(jù)提取特征在作為輔助文件上傳。。。
- 其次是模型融合。官方的框架無法實現(xiàn)線上LR和GBDT哪怕是簡單stacking learning的融合。這使得我們只能以單個模型比賽(雖然大家都一樣。。)。
模型
- LR:Logistic Regression[4],簡單實用,線性模型,訓(xùn)練快速??捎肔1/L2正則化,SGD。在面對stage2 100W+維特征時候表現(xiàn)很好。
- RF:Random Forest[^rf],各種隨機,多棵樹融合。stage1作為輔助模型融合。
- GBRT:Gradient Boost Regression Tree[5],梯度提升框架,不用特征歸一,泛化強,效果贊。再次膜拜其實現(xiàn)Xgboost[3]。
- MFM:Multi-Instance Factorization Machines,這個模型是我們隊一個大牛設(shè)計的,結(jié)合了Factorization Machines[6]和Multi-Intance[7]框架。
MFM不需要做特征工程!我們需要做的就是將每個用戶的log打包,對于一個(u,m)對,一個log加上一個flag(這個log是否與m相關(guān)聯(lián))對應(yīng)一個instance,一個用戶的所有instance為一個bag。所以最終用戶是否是商家的重復(fù)買家取決于用戶所有的log是否發(fā)生在當(dāng)前商家。
FM被用來預(yù)測一個instance對一個重復(fù)買家的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
$$
我們要求得目標(biāo)函數(shù)是:
$$
argmax_{w,{v}}\prod Pr(y(B^+)=1)\prod Pr(y(B^-)=-1)
$$
使用SGD學(xué)習(xí)$w,{v}$,再用L-BFGS調(diào)節(jié)L2正則化后的所有權(quán)重。
模型融合
我們第一階段的融合框架:

| 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的結(jié)果作為一個High-level的特征加入到特征池中。提升了0.0018,0.700936$\rightarrow$0.702711.
各模型結(jié)果:
| 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 |
結(jié)果
第一階段我們隊伍獲得了第9。
第二階段我們隊伍獲得了第4。
總結(jié)
歷程
寫一下我參加這次比賽的歷程,由于今年阿里的移動推薦比賽,第一階段就被淘汰了(T.T)才轉(zhuǎn)戰(zhàn)這個比賽的??赐曩愵}就著手做了起來,每天想一些新的特征,再xgb調(diào)調(diào)參數(shù),分?jǐn)?shù)一直穩(wěn)步再漲,一度到了LB6。然后有幾天分?jǐn)?shù)就卡主上不去了,當(dāng)時想著是不是應(yīng)該招人組個隊,分享一下思路。于是去比賽論壇上發(fā)了個貼子,當(dāng)天晚上和之后的那個隊長聊到了2點多鐘。。。他是有老師支持的(真好),雖然當(dāng)時他們名次沒有我高,我還是同意讓他當(dāng)了隊長(畢竟人家?guī)е粠腿?。。),第二天我們隊又來了個大牛,就是做MFM那個,他是自己造的輪子,分?jǐn)?shù)有0.689.于是我們隊就在最后五天組成了。然后我們就在最后五天進行了特征融合,他們那邊把特征輸出給我,我來組合,跑模型,跑完的結(jié)果在給他做ensemble。
經(jīng)驗&教訓(xùn)
- 組隊真的有必要。個人精力非常有限,組隊不僅可以提供新的思路,還能使任務(wù)并行。
- 這種比賽拼的到底是什么。我覺得1.特征工程,對數(shù)據(jù)的理解,不停地嘗試都是特征工程需要做的。2.融合,之后參加了幾次kaggle比賽知道了融合強大,簡單的stacking learning就能獲得不少的提升。
- 一個教訓(xùn)是我們在組隊之初犯了許多錯誤,沒有一個比較規(guī)范的融合模式,導(dǎo)致比較混亂。
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. ?