IJCAI-15 商家促銷后的重復(fù)買家預(yù)測比賽紀(jì)實

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)一介紹一下兩個階段用到的特征,第二階段的特征幾乎涵蓋了第一階段的。

  1. Baseline特征
    官方提供的一套為LR設(shè)計的特征體系。首先,獲得每個商家的最相似的5個商家,計算方法是統(tǒng)計商家之間的共同用戶。這些商家的id離散化作為特征(4995維稀疏特征)。然后,取當(dāng)前用戶對當(dāng)前商家的行為特征。
  2. 信息描述類特征
    這是我們特征的主力軍,時間都花在這上面了。這部分特征幾乎都是具有物理意義的特征,總體可以分為三種:user,merchant,(u,m)對特征。由具體的物理意義再分為三類:
    • 計數(shù)類:行為計數(shù)、行為天計數(shù)、行為對象計數(shù)等;
    • 比值類:平均每天行為、回購率、每月行為占比等;
    • 生命周期類:用戶首次/最后行為日、生存周期。
  3. 離散特征
    為什么要設(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)重。

模型融合

我們第一階段的融合框架:


Ensemble框架
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


  1. 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. ?

  2. http://scikit-learn.org/stable/ ?

  3. https://github.com/dmlc/xgboost ? ?

  4. 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. ?

  5. Jerome H. Friedman. Greedy function approximation: A gradient boosting machine. Annals of Statistics, 29:1189–1232, 1999. ?

  6. Steffen Rendle. Factorization machines. In IEEE International Conference on Data Mining series (ICDM), pages 995–1000, 2010. ?

  7. 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. ?

  8. https://en.wikipedia.org/wiki/Ensemble_learning ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容