如期而至-用戶購買時間預(yù)測由jdata智匯平臺舉辦,本次大賽京東攜手中國信息通信研究院,中關(guān)村加一戰(zhàn)略新興產(chǎn)業(yè)人才發(fā)展中心,以“創(chuàng)響中國”在大數(shù)據(jù)領(lǐng)域落地為契機,旨在激發(fā)算法創(chuàng)新,釋放數(shù)據(jù)價值,培養(yǎng)數(shù)據(jù)人才。希望各界算法精英能夠利用脫敏后的京東真實用戶歷史行為數(shù)據(jù),自建算法模型,預(yù)測熱銷品類的用戶購買時間,搏擊浪潮之巔,勇奪桂冠,贏得高額獎金。
最終排名:A榜:14 / 5182,B榜:8 / 5182
附:github地址
比賽簡介
如期而至-用戶購買時間預(yù)測由jdata智匯平臺舉辦,本次比賽從訂單表隨機選取時間節(jié)點前三個月內(nèi)購買過目標(biāo)品類(101,30)的部分用戶作為目標(biāo)用戶集合,并且提供了目標(biāo)用戶在時間節(jié)點前一年內(nèi)的行為、訂單、評論等用戶數(shù)據(jù)以及目標(biāo)用戶的基本信息和商品的信息,要求預(yù)測時間節(jié)點后一個月內(nèi)目標(biāo)用戶中最有可能購買目標(biāo)品類的用戶,并預(yù)測他們在考察時間段內(nèi)的首次購買時間。
問題分析
根據(jù)題述,賽題可以看作是兩個子問題,可以細分為:
(1)在考察時間段內(nèi),目標(biāo)用戶是否會發(fā)生下單行為?(二分類問題)
(2)在(1)的前提下,下單的用戶對目標(biāo)品類商品的首次下單時間?(回歸問題)
因此,我們可以分為兩步解題:
(1)根據(jù)已有數(shù)據(jù)建立模型,尋找在考察時間段內(nèi)最有可能下單的用戶(用戶模型)。
(2)根據(jù)已有數(shù)據(jù)建立模型,在(1)的基礎(chǔ)上,尋找目標(biāo)用戶在考察時間段內(nèi)首次下單的時間(日期模型)。
通過分析問題,我們將賽題分解成一個二分類問題和一個回歸問題。根據(jù)已有數(shù)據(jù),我們先建立一個用戶模型,通過二分類的方法尋找考察時間段內(nèi)最有可能下單的用戶;基于用戶模型得到的用戶,我們接著建立一個日期模型,通過回歸的方法預(yù)測目標(biāo)用戶在考察時間段內(nèi)首次下單的時間。

評價指標(biāo)思考:本次比賽的評價指標(biāo)分為用戶評價S1和用戶下單日期評價S2兩部分,其中,S1所占權(quán)重為40%,S2所占權(quán)重是60%。此外,通過分析S1的評分公式,可以看到,我們提交的5w條用戶,排序越靠前的用戶重要性越高,也就是說,第一個用戶預(yù)測對了和第5w條用戶預(yù)測對了,他們在S1中貢獻的分?jǐn)?shù)是不一樣的;通過分析S2的評價指標(biāo),可以看到,S2的評價依賴于S1(對于一個用戶,如果不在S1答案用戶集合中,S2不得分),S2評價指標(biāo)跟均方誤差MSE有點類似,但并不相同。
數(shù)據(jù)分析與數(shù)據(jù)清洗
(1)關(guān)于用戶的回購時間,通過對數(shù)據(jù)的分析可以看出,AB榜在用戶回購時間間隔上的分布基本一致。此外,我們發(fā)現(xiàn)用戶回購時間會在14天左右出現(xiàn)一個峰值,回購時間超過90天的用戶已經(jīng)寥寥無幾,因此在進行滑窗的時候可以參考回購時間統(tǒng)計出來的規(guī)律進行滑窗(我們根據(jù)回購時間可以猜測這個商品類別是日用品);

(2)通過分析用戶活躍天數(shù)與標(biāo)簽的關(guān)系,我們發(fā)現(xiàn),越活躍的用戶,他的回購概率會越高,這個對我們做特征工程和后處理都有幫助;
(3)根據(jù)用戶回購時間統(tǒng)計得出的規(guī)律,我們可以知道,在時間節(jié)點前兩個月內(nèi)購買過的用戶比三個月前購買過的用戶的購買概率會增大,比如,對于B榜來說,七八月份購買過的用戶相對于六月份購買過的用戶,在九月份購買的概率會增大;
(4)關(guān)于用戶的集合,由于6月份有京東的618大型折扣活動,會導(dǎo)致6月份購買用戶激增。我們發(fā)現(xiàn)在99446個目標(biāo)用戶中,有12315用戶是只在六月份購買過目標(biāo)類目商品的。因此,可以考慮把這部分用戶視為沒有日常購買需求、僅僅是在618湊折扣的用戶;
(5)從各月份下單日的統(tǒng)計分析來看,普通月份的用戶第一次下單日期大致是從月初到月末呈逐漸遞減的趨勢,特殊月份(如6月、11月)會在特殊日期呈現(xiàn)高峰值,并對前后月份的購買行為趨勢產(chǎn)生一定影響;

(6)拋開月份的劃分,經(jīng)統(tǒng)計,對于任意一個時間點T,前90天有購買的用戶,在未來30天內(nèi)的第一次購買日期同樣呈現(xiàn)逐漸遞減的統(tǒng)計趨勢;

(7)針對A榜跟B榜的數(shù)據(jù)分布差異分析,我們各取了AB榜17年2月和3月的數(shù)據(jù)曲線做了對比,發(fā)現(xiàn)曲線規(guī)律基本一致,因此初步認(rèn)為A榜B榜數(shù)據(jù)分布一致,A榜的數(shù)據(jù)分析結(jié)論可以沿用至B榜;

(8)實際操作中,S2模型由于受損失函數(shù)均方誤差的影響,預(yù)測結(jié)果呈單峰曲線,并不能很好擬合訓(xùn)練集逐漸遞減的趨勢。因此后期采取一些技巧加大了前半個月的預(yù)測比例;
(9)我們發(fā)現(xiàn)在B榜中sku基本信息表中存在商品id為空的情況,我們對這部分?jǐn)?shù)據(jù)進行了剔除操作;
(10)通過分析我們看到了sku基本信息表中商品參數(shù)二和商品參數(shù)三字段存在較為嚴(yán)重的空缺情況,我們對這兩個字段進行了剔除操作,因為空缺情況比較嚴(yán)重時,這個字段已經(jīng)不能給模型提供什么信息了;
訓(xùn)練樣本構(gòu)造
本次比賽,我們構(gòu)造了三個用戶模型,一個日期模型,每個模型的訓(xùn)練樣本構(gòu)造方法都不同:
(1)用戶模型
用戶模型一(我自己的模型)
對于每個月來說,以該月前三個月內(nèi)有購買過的用戶為樣本,根據(jù)他是否在這個月購買過打標(biāo)簽,如果有購買過則標(biāo)為1,否則標(biāo)為0。此外,考慮到樣本擴充的問題,以月為時間間隔進行滑窗,最終采用了六個月的訓(xùn)練樣本量。

用戶模型二(隊友的模型)
與用戶模型一類似,不同的是,對于每個月來說,以該月用戶訂單數(shù)量為標(biāo)簽。

用戶模型三(隊友的模型)
線下數(shù)據(jù)集的用戶樣本來自于2017-08-01(T)前60區(qū)間內(nèi)在目標(biāo)cate(30、101)產(chǎn)生訂單行為的用戶進行去重;線上數(shù)據(jù)集的用戶樣本來自于2017-09-01(T)前75天區(qū)間內(nèi)在目標(biāo)cate(30、101)產(chǎn)生訂單行為的用戶進行去重。

穿越問題
由于本次比賽是從訂單表隨機選取時間節(jié)點前三個月內(nèi)購買過目標(biāo)品類(101,30)的部分用戶作為目標(biāo)用戶集合,以B榜為例,時間節(jié)點是2017-09-01,目標(biāo)用戶集合在2017年6、7、8三個月內(nèi)肯定是有購買過目標(biāo)品類的商品,如果我們在構(gòu)造訓(xùn)練集時的候選用戶集時間區(qū)間和打標(biāo)簽區(qū)間有一部分跟6、7、8三個月重合的話,就會存在穿越問題。舉個例子,假如,我們用567三個月的用戶去預(yù)測8月份的購買情況。其實暗含了一個先驗條件,就是這些用戶在678月一定會購買,換句話說,對于67月份(也就是后兩個月)沒有購買的用戶,他們在8月份一定會購買,但是線上預(yù)測集中,78月份沒購買的用戶9月份并非一定會購買。從根本來看,其實就是我們構(gòu)造的訓(xùn)練集跟實際的線上預(yù)測集的數(shù)據(jù)分布都不一樣,數(shù)據(jù)分布不一樣的話,我們在做特征工程和模型訓(xùn)練都會有很大的問題(比如,如果我們在線下構(gòu)造了一個上次購買時間間隔特征,因為穿越數(shù)據(jù)的存在,5月份的時間間隔較長,導(dǎo)致標(biāo)簽與這個特征的關(guān)系是時間間隔越長,越可能會買,但是線上并沒有這個規(guī)律,就會成為臟特征)。如果用234三個月購買過的用戶作為候選用戶集,根據(jù)他們在5月份是否購買打標(biāo)簽的話就不存在穿越問題。
對于上述三個用戶模型,只有用戶模型三不存在數(shù)據(jù)穿越問題,用戶模型一二都存在數(shù)據(jù)穿越的問題。因為我們是在A榜結(jié)束前一天才找到了隊友(隊友的模型是用戶模型三,隊友也是一個新手,他是基于朋友的baseline基礎(chǔ)上來做的,構(gòu)造訓(xùn)練集的方法也是從baseline里面來的,沒有考慮穿越問題),當(dāng)時我們還沒有做模型融合,因此我們在A榜最后一天做了三個用戶模型的融合。在A榜結(jié)束后,我們就在思考,為什么隊友的用戶模型訓(xùn)練樣本量只有8w,但是出來的效果卻比我們兩個用戶模型幾十萬訓(xùn)練樣本的效果要好,于是我們就想到了訓(xùn)練樣本構(gòu)造方案上的穿越問題。發(fā)現(xiàn)了這個問題,已經(jīng)到了B榜關(guān)鍵時刻,我們在B榜不敢做大變動,而且用戶模型一和用戶模型二的效果并不是比用戶模型三差了特別多,我們在A榜將三個模型融合后的效果是比用戶模型三單模型的效果要好的(應(yīng)該是跟模型差異性有關(guān)系),因此保留了用戶模型一和用戶模型二。
(2)日期模型
日期模型最終采用的15天的滑窗間隔倍增訓(xùn)練集。每一個預(yù)測窗口均是預(yù)測窗口前90天有購買行為用戶,在未來30天內(nèi)的第一次購買日期。樣本的特征統(tǒng)計區(qū)間均為2016-09-01至預(yù)測窗口前的時間段??紤]到訓(xùn)練集最初幾個月的用戶沒有足夠的歷史統(tǒng)計數(shù)據(jù),因此訓(xùn)練集倍增窗口從第4個月(即B榜12月)開始。

在這里,我們通過增加15天數(shù)據(jù)集(訓(xùn)練集17)的方法嘗試擬合線上測試集的分布,在增加15天數(shù)據(jù)集前后預(yù)測出來的結(jié)果都是呈單峰正態(tài)分布,但是增加15天數(shù)據(jù)集后峰值從13天左右提前7天左右,由于在數(shù)據(jù)分析時我們發(fā)現(xiàn)其實實際分布是從月初逐漸降低的,峰值提前到7天左右,因為S2評價函數(shù)的誤差項在分母,跟MSE不同,MSE誤差較大的樣本變動對分?jǐn)?shù)影響很大,而對于S2來說,誤差較小的樣本的變動對分?jǐn)?shù)影響更大(比如,預(yù)測誤差是1和5的樣本之間的分?jǐn)?shù)差,是比預(yù)測誤差是11和15的樣本之間的分?jǐn)?shù)差要大,因為平方項在分母),我們將峰值提前,就是導(dǎo)致誤差較大的樣本往誤差小的方向靠攏,而原本誤差很大的樣本繼續(xù)變大,但是產(chǎn)生的影響沒那么明顯,提高了模型的精度。

特征工程
提供的數(shù)據(jù):sku基本信息表,用戶基本信息表,用戶行為表,用戶訂單表,評論分?jǐn)?shù)數(shù)據(jù)表,由于本次比賽是預(yù)測用戶是否回購以及回購時間,因此我們在做特征工程的時候更多地是從用戶的角度來做。
(在做特征的時候,我們更多地是從業(yè)務(wù)理解的角度入手,先設(shè)想一些能夠給模型提供信息的特征,然后通過可視化的方法(看特征分布圖,比如我們構(gòu)造了一個特征是用戶前一個月下單的次數(shù),我們可以畫出回購用戶和沒有回購用戶的分布來驗證這個特征是否有效)或者計算相關(guān)系數(shù)(皮爾遜系數(shù)和最大互信息系數(shù),皮爾遜系數(shù)只能衡量線性相關(guān)性而互信息系數(shù)能夠很好地度量各種相關(guān)性,但是計算相對復(fù)雜一些,好在很多toolkit里邊都包含了這個工具)來驗證特征是否有效。此外,我們也需要將特征丟到模型里面驗證,因為有的特征會存在多重共線性問題,可以通過添加特征群到模型觀察效果的方法來驗證)
本次比賽我們共構(gòu)造了四個模型,包括三個用戶模型和一個日期模型,每個模型的特征并不一樣,但是大同小異,所以下面就一起說明了:
(1)用戶基礎(chǔ)特征
用戶年齡,性別以及等級碼
思考:通過不同的用戶基礎(chǔ)特征可以在一定程度上反映用戶群的購買習(xí)慣和購買傾向;
(2)滑窗內(nèi)用戶的統(tǒng)計特征
用戶半個月/一個月/三個月/六個月內(nèi)對目標(biāo)類目/相關(guān)類目/101類目/30類目商品的下單次數(shù)/購買數(shù)量/購買天數(shù)/購買種類數(shù)/購買月份數(shù)/操作次數(shù)/操作數(shù)量/操作商品種類數(shù)/操作天數(shù)/瀏覽數(shù)量/瀏覽天數(shù)/瀏覽商品種類數(shù)/關(guān)注次數(shù)/好評數(shù)量/中評數(shù)量/差評數(shù)量/評論數(shù)量
用戶半個月/一個月/三個月/六個月內(nèi)對目標(biāo)類目/相關(guān)類目/101類目/30類目商品購買在當(dāng)月第幾天的最大值/最小值/均值
用戶半個月/一個月/三個月/六個月內(nèi)購買過目標(biāo)類目/相關(guān)類目/101類目/30類目商品價格的最大值/最小值/均值/總值
思考:此類特征可以在一定程度上反映出用戶的一些購買習(xí)慣(用戶喜歡以什么節(jié)奏購買東西),活躍程度,進而推算下個月購買的概率。在這里我們滑窗的窗口大小是根據(jù)我們在分析用戶回購時間分布來確定的,在數(shù)據(jù)分析時我們發(fā)現(xiàn),用戶回購時間會在14天左右出現(xiàn)一個峰值,回購時間超過90天的用戶已經(jīng)寥寥無幾,所以我們劃分了半個月/一個月/三個月/六個月四種區(qū)間;
(3)歷史用戶統(tǒng)計特征
用戶歷史平均每個月對目標(biāo)類目/相關(guān)類目/101類目/30類目的購買數(shù)量/下單次數(shù)/購買種類數(shù)/購買天數(shù)/操作數(shù)量/操作種類數(shù)/操作天數(shù)/瀏覽數(shù)量/關(guān)注數(shù)量/
用戶歷史購買過目標(biāo)類目/相關(guān)類目/101類目/30類目商品價格的最大值/最小值/均值
思考:此類特征統(tǒng)計的是用戶在歷史每個月的行為習(xí)慣,購買習(xí)慣和活躍程度,可以將最活躍的一批用戶跟非活躍用戶區(qū)分開,提高模型預(yù)測準(zhǔn)確度;
(4)商品特征
用戶半個月/一個月/三個月/六個月內(nèi)購買過目標(biāo)類目/相關(guān)類目/101類目/30類目參數(shù)一的最大值/最小值/均值
用戶歷史購買過目標(biāo)類目/相關(guān)類目/101類目/30類目商品參數(shù)一的最大值/最小值/均值
用戶上次下單的商品參數(shù)一均值,總和
思考:我們通過分析可以知道,商品價格和參數(shù)一都為非空,而參數(shù)二和參數(shù)三空值較多,因此在做統(tǒng)計特征的時候沒有考慮參數(shù)二和參數(shù)三的維度。我們猜測,本次比賽的商品是日用品類型的,然后商品參數(shù)一是類似于商品容量之類的一個屬性,比如,洗發(fā)水,有1升的,有250毫升的,由于我們每天消耗日用品的量是一定的,所以如果上一次購買的商品容量較大的話,用的時間就會越久,回購的時間距離上次購買時間就會越久,因此我們有針對性地做了一些特征;
(5)最近一次行為特征
用戶各類別、所有類別的最近一次瀏覽時間
用戶各類別、所有類別的最近一次下單時間
用戶各類別、所有類別的最近一次下單時間與瀏覽時間之差
用戶101、30類別、所有類別的最近一次訂單價格
用戶101、30類別最近一次訂單的商品參數(shù)一均值
思考:最近一次行為特征,其實是跟用戶回購相關(guān)性比較大的一個特征群,從直觀上來看,對于有日常需求的用戶來說,他上一次購買時間距離時間節(jié)點T越遠,用戶在這個月回購概率會越大,初次回購時間就會越靠前;
模型選擇
我們在前期時測試了LR、XGBoost、LightGBM等多種模型,從精確度和效率上對比后,我們最終采用了三個用戶模型(一個xgb,兩個lgb),一個日期模型(xgb),訓(xùn)練得到最終的結(jié)果。
用戶模型
關(guān)于用戶模型,我們訓(xùn)練了一個xgboost和兩個lightgbm模型,每個模型都是采用k折交叉驗證方法訓(xùn)練。在得到三個用戶模型后,我們需要進行模型融合,主要考慮兩方面問題,一個是用戶的集合,一個是用戶的排序:
1)關(guān)于用戶的集合,由于6月份有京東的618大型折扣活動,導(dǎo)致6月份購買用戶激增。為了剔除掉并沒有日常購買需求、僅僅是在618湊折扣的用戶,我們最終決定S1的用戶從5/7/8月有購買的用戶中選取。
2)關(guān)于用戶的排序:排序主要依據(jù)三個模型的用戶評分。我們希望根據(jù)模型的線上成績來確定模型的評分比重,而模型的比重反應(yīng)到結(jié)果上則是用戶的占比。比如比重為3:2,就相當(dāng)于當(dāng)A模型提供3個用戶時,B模型提供2個用戶。然而各個模型之間的評分規(guī)則和分布區(qū)間并不一致,不能直接將模型比重用于分?jǐn)?shù)的加權(quán)系數(shù)。
結(jié)合這兩方面因素考慮,我們最終制定的模型融合方案如下:
1)三個模型各自取前5w條用戶,然后剔除掉5/7/8月沒有購買記錄的用戶;
2)將各模型的用戶分?jǐn)?shù)進行0-1歸一化,縮小模型間評分標(biāo)準(zhǔn)的差異;
3)根據(jù)各模型A榜成績,確認(rèn)三個模型的比重(分別為72:105:148),即模型1的第7200個用戶的重要性等同于模型2的第10500個用戶等同于模型3的第14800個用戶;
4)根據(jù)模型比重查找各模型對應(yīng)用戶的分?jǐn)?shù),根據(jù)分?jǐn)?shù)確定三個模型的加權(quán)系數(shù)。即加權(quán)后三個模型的分?jǐn)?shù)區(qū)間如下:

5)將三個模型的用戶分?jǐn)?shù)進行加權(quán)求和,沒有預(yù)測到的用戶分?jǐn)?shù)為0,然后按用戶總分排序取前5w作為最終的S1結(jié)果。
日期模型
對于日期模型,考慮到模型在數(shù)據(jù)上有時序性,所以線下并沒有采用交叉驗證,而是采用了時間順序劃分線下驗證集。

我們選擇了8月2號作為驗證集,一方面是考慮到8月2號同9月1號都是月初,另一方面也是為了方便與用戶模型效果做對比,日期模型依賴于用戶模型,因為用戶模型在線下的時候是以8月份為驗證集,容易對比線下線上效果。
最終模型
關(guān)于整個模型,整體來說,我們采用不同的訓(xùn)練集以及打標(biāo)簽的方法訓(xùn)練了一個XGBoost模型和兩個LightGBM模型,然后進行融合,得出最終的五萬條用戶。日期模型采用15天滑窗倍增訓(xùn)練集的方式,訓(xùn)練出一個XGBoost單模型,預(yù)測用戶在九月份第一次下單的時間。通過結(jié)合用戶模型和預(yù)測模型,我們得到了最終的提交結(jié)果。

賽后總結(jié)
本次比賽是我們參加的第二個比較大型的數(shù)據(jù)挖掘比賽(第一個是天池上阿里媽媽的比賽),在參加這次比賽前,其實我們對數(shù)據(jù)挖掘的一個流程已經(jīng)有一定的了解,因此,本次比賽上手其實并不難,但是在比賽前期一直到A榜結(jié)束前一周,我們一直在100名左右徘徊,雖然最后達到了top8的成績,但整個過程,現(xiàn)在回想起來,還是比較坎坷的。困擾我們最大的一個問題是用戶模型的穿越問題,一直到A榜結(jié)束。在一開始,我們就確定了先做S1再做S2的策略,并且因為S2是依賴于S1的,所以一開始我們都是先去研究用戶模型。但是因為穿越問題的存在,我們幾個人的S1成績都在200名左右,并且沒有找到直接的原因。因此,我們就在思考會不會是因為有臟特征的存在(對訓(xùn)練集擬合得比較好,對測試集沒效果甚至有反效果的特征),我們就開始在做特征篩選。通過特征篩選的方法,我們發(fā)現(xiàn)距離上一次購買的時間間隔等跟時間間隔相關(guān)的特征一加進去模型就會崩,因此先我們剔除了這一部分特征,但是沒想到為什么會這樣。隊友覺得時間不夠了,就去做S2了,我繼續(xù)研究S1,因為我覺得S1依然是根本。后來我通過研究用戶回購時間,剔除了2個月內(nèi)沒購買過的用戶,使我們S1到了前100名。在A榜結(jié)束前一天我們才找到了隊友(隊友的模型是用戶模型三,隊友也是一個新手,他是基于朋友的baseline基礎(chǔ)上來做的,構(gòu)造訓(xùn)練集的方法也是從baseline里面來的,沒有考慮穿越問題),當(dāng)時我們還沒有做模型融合,因此我們在A榜最后一天做了三個用戶模型的融合。在A榜結(jié)束后,我們就在思考,為什么隊友的用戶模型訓(xùn)練樣本量只有8w,但是出來的效果卻比我們兩個用戶模型幾十萬訓(xùn)練樣本的效果要好,于是我們就想到了訓(xùn)練樣本構(gòu)造方案上的穿越問題,并且想通了為什么時間間隔這種強特在用戶模型一和用戶模型二反而是臟特征(線上線下特征與標(biāo)簽的關(guān)系不一樣)。現(xiàn)在回想起來,感覺能堅持下來特別不容易,想過很多次,我們都在考慮要不要放棄,但是又覺得心有不甘,覺得開始了就應(yīng)該堅持下去,最后撐到了決賽,感覺堅持和毅力真的很重要。在決賽上認(rèn)識了很多大佬,才真的知道自己做的很簡單,水平還差很多,激勵了自己,總得來說,是一個很不錯的經(jīng)歷。
下面總結(jié)一下決賽現(xiàn)場聽到的比較驚艷的一些做法:
(1)第九和第十名都沒有發(fā)現(xiàn)用戶模型中的穿越問題,他們主要是依據(jù)用戶回購時間分析,通過剔除最近一段時間沒有購買的用戶或者根據(jù)上次購買時間設(shè)置權(quán)重的方法,提高S1模型的精度(剔除用戶的方法其實就是將模型關(guān)注點更多地傾向于有周期性購買且更為活躍的用戶);
(2)第七名隊伍發(fā)現(xiàn)了數(shù)據(jù)穿越問題,他們嘗試了三種不同的S1數(shù)據(jù)集構(gòu)造方案,第一種是每個月都用全部的用戶,第二種是每個月用前三個月的用戶,第三種是每個月用前兩個月的用戶,在他們發(fā)現(xiàn)數(shù)據(jù)泄露問題后,采取了第三種方案,并且針對S1做了一個遷移學(xué)習(xí)(植物大佬阿里媽媽冠軍方案)的模型。針對B榜,他們先構(gòu)造了一個7月份的數(shù)據(jù)集,用于學(xué)習(xí)前面的數(shù)據(jù)規(guī)律,預(yù)測8月份和9月份的用戶,然后將得到的預(yù)測結(jié)果作為一個特征,利用8月份線下用戶預(yù)測9月份線上用戶,得到最終的S1結(jié)果;針對S2,他們訓(xùn)練了一個殘差模型,先通過stacking思路訓(xùn)練得到一個初步結(jié)果,然后將實際標(biāo)簽減去初步結(jié)果得到對應(yīng)的殘差,再訓(xùn)練一個殘差模型,最后將初步結(jié)果加上殘差模型結(jié)果就得到了最終的線上S2預(yù)測結(jié)果;
(3)第六名隊伍針對S1做了兩個后處理規(guī)則,第一個是他們通過分析發(fā)現(xiàn)用戶在進行瀏覽后很大概率會產(chǎn)生購買行為,因此他們將預(yù)測節(jié)點前幾天有瀏覽行為但是沒有下單的用戶,將他們處理為會回購的用戶;第二個規(guī)則是,他們將訂單數(shù)大于30且活躍月數(shù)在六個月以上的用戶排序在前面,優(yōu)于其他用戶,S1評分函數(shù)跟用戶排序有關(guān);針對S2,他們隊做了一個跟普通隊伍不一樣的做法,我們都是預(yù)測用戶在這個月首次下單的日期,他們是預(yù)測用戶在這個月對某件商品首次下單的日期,這樣就將樣本粒度細化到用戶和商品(具體打標(biāo)簽是根據(jù)用戶在前面買過的商品userid-skuid這個主鍵來打的),此外還對預(yù)測結(jié)果做了后處理,將預(yù)測出來的正太分布結(jié)果進行壓平前移處理,擬合正常月份的分布;
(4)第五名隊伍采用了Hawkes建模的方法,而不是采用簡單的滑窗提取特征,Hawkes的思路是說歷史上發(fā)生的事情對未來的概率密度函數(shù)有影響,只是隨著時間流逝這種影響會逐漸減弱,因此在這里可以提煉出用戶先前行為對未來購買的概率影響;
(5)第四名隊伍針對S2評分指標(biāo),采用了分位數(shù)回歸的方法(分位數(shù)回歸不要求樣本服從正太分布,且對異常值點不敏感),取q < 0.5,對預(yù)測值偏大的結(jié)果懲罰更大,于是會出現(xiàn)模型預(yù)測值普遍偏小的情況,更符合S2的分布;此外,他們也利用A榜數(shù)據(jù)以及B榜數(shù)據(jù)做了stacking,作為特征放到B榜主模型里面;
(6)第三名選手對sku做了一個聚類,得到商品對應(yīng)的subcate(先將用戶看過買過的所有skuid作為詞組成document,利用LDA主題模型得到10為embedding向量,然后再進行聚類操作);S1用不同的打標(biāo)簽方式構(gòu)造3個模型,S2用不同的打標(biāo)簽方式以及目標(biāo)函數(shù)構(gòu)造5個模型,并進行stacking操作;針對S2的評價函數(shù),直接進行優(yōu)化(MSE的誤差項在分子,S2評價函數(shù)的誤差項在分母,對于MSE來說,誤差越大的樣本對分?jǐn)?shù)產(chǎn)生的影響大,而對于S2來說,誤差較小的樣本對分?jǐn)?shù)影響更大),因為S2函數(shù)二階可導(dǎo),可以直接求出一階和二階函數(shù),修改lightgbm的損失函數(shù),達到優(yōu)化效果;

(7)冠軍隊伍方案:關(guān)于數(shù)據(jù)預(yù)處理方面,針對一個用戶在一天內(nèi)因為促銷湊單而產(chǎn)生的多個訂單的情況,進行訂單的合并操作,以免影響后面特征的構(gòu)造;構(gòu)造了S1和S2的交叉特征,將S2的stacking結(jié)果作為S1的特征;提取了一些復(fù)雜推算特征,第一個是將用戶上一次購買的時間間隔減去用戶平均購買的時間間隔來推算用戶下次購買的時間,第二個是推斷para1是商品容量,先將用戶購買目標(biāo)品類商品para1求和然后除以購買時間間隔之和,得到用戶對目標(biāo)品類商品的平均每天的消耗量,然后將上一次購買目標(biāo)品類商品para1總量除以商品日消耗量得到上次購買的商品大概可以用幾天,然后將最后一筆下單距今天數(shù)減去可以使用的天數(shù)來推斷用戶下次下單的時間;針對S2評分函數(shù),做了兩個操作,第一個是將標(biāo)簽y取log,使其服從正態(tài)分布,并采用S2評分函數(shù)作為loss,第二個是采用分位數(shù)回歸的方法擬合多條直線。
