如何预测百威啤酒销量?数据竞赛冠军笔记分享 思路
轉(zhuǎn)載:?http://dy.163.com/v2/article/detail/DHALCA3N0511VFT2.html
賽題背景
組織方:微軟加速器
真實數(shù)據(jù)來源:幾家頂級快消品牌
上海站:百威英博命題,并提供脫敏的業(yè)務(wù)數(shù)據(jù)
提出三個問題:
1.庫存需求預(yù)測
2.銷售數(shù)量預(yù)測
3.經(jīng)銷商違規(guī)行為檢測
數(shù)據(jù)大致的情況
原始數(shù)據(jù)中,大致包含了百威全國400多家門店的數(shù)據(jù),商品的種類800多個,一整年歷史銷售數(shù)據(jù),精確到每日,數(shù)據(jù)400多萬行。需要預(yù)測未來一個月內(nèi)未來商品的銷量。
第一步:數(shù)據(jù)探索
先進(jìn)行數(shù)據(jù)探索,理解一下數(shù)據(jù)的分布,和大致的特征。后面怎么樣去做你的模型。數(shù)值分布,統(tǒng)計檢驗。不可能上來就跑個模型,看下效果。
常用方法一:數(shù)值分布,統(tǒng)計檢驗,左邊直方圖,即數(shù)據(jù)的分布情況,右邊這個是皮爾森相關(guān)性檢驗(Pearson correlation coefficient),就是特征之間的相關(guān)度是什么樣的。
Python的庫missing number。觀察缺失值的情況。因為百威提供的數(shù)據(jù)質(zhì)量很高,所以不需要考慮填充缺失值。
常用預(yù)測方法二:
預(yù)測方法一:歷史數(shù)據(jù)用折線圖等形式畫出來,從歷史中尋找商品和門店的行為規(guī)律。
有的有規(guī)律性,有的沒有。如下圖。
所以各個商品之間行為的模式(pattern)不一樣。
這樣的分析有什么好處呢?通過分析發(fā)現(xiàn),有的商品數(shù)據(jù)點很稀少。需要分別建立模型,有些不需要建立模型。歷史上出現(xiàn)一兩次的情況,可以歷史平均和預(yù)測為零來處理。不用極端數(shù)據(jù)影響整體的效果。
預(yù)測方法二:正則化。基于統(tǒng)計規(guī)則,歷史上某些值的平均值,比他兩三個標(biāo)準(zhǔn)差偏差還要多的話,會認(rèn)為異常值,我們會把這些值縮小一下。
預(yù)測方法三:基于模型預(yù)測,先構(gòu)建一個簡單的模型,訓(xùn)練后,跑一下模型,觀察誤差特別大的點,也有可能是離群值或者異常值。這樣就可以針對他們做一些處理。
預(yù)測方法四:移動平均。
預(yù)測方法五:對數(shù)據(jù)進(jìn)行l(wèi)og的預(yù)處理。
Log預(yù)處理是時間序列和線性模型中經(jīng)常會遇到。很多情況下,會要求你的時間序列的值是穩(wěn)定的,有時也會對預(yù)測值做Log處理,有時也會做差分處理。還有一些線性模型對殘差,大多數(shù)假設(shè)是一個正態(tài)分布的殘差。
如果數(shù)值分布的偏度很高,也會有問題,會用log來做預(yù)處理。
日期對齊也是時間序列預(yù)測問題中常見的技術(shù)。比如中國春節(jié)在一月或者二月,需要考慮歷史數(shù)據(jù)上春節(jié)的月份和今年春節(jié)的時間點是不是對的上。如果對不上是預(yù)處理,會提高預(yù)測的精度。
還有一些業(yè)務(wù)相關(guān)的邏輯。比如銷量為零,售價不為零之類。也需要做處理。
以上是數(shù)據(jù)探索的過程。
特征工程的構(gòu)建
加入地理位置,門店當(dāng)?shù)氐慕?jīng)濟(jì)指數(shù),當(dāng)時氣溫、賽事、節(jié)假日、促銷活動等。
聚類方法:用無監(jiān)督的方法,對原始數(shù)據(jù)進(jìn)行聚類,把相像的門店或者產(chǎn)品放在一起。分別來做子模型,或者把標(biāo)簽當(dāng)做特征加進(jìn)去。
基礎(chǔ)特征方面,百威提供原始數(shù)據(jù)集的特征,在此基礎(chǔ)上做了一些各維度的統(tǒng)計聚合,需要各維度聚合——時間、門店、商品:比如,日期衍生(是否是節(jié)假日,本周的節(jié)假日有幾天,距離下一個工作日有幾天)、商品、門店屬性、各類高級計算。新商品從第一天開始售賣,累計的銷售天數(shù)。
高級的特征處理方式:
2014年Facebook在論文中提出的方法——GBDT生成特征,論文認(rèn)為決策樹的模型可以自動做一些特征的組合和轉(zhuǎn)換。說白了就是把Input放進(jìn)去之后,看每一棵樹,落在每一個葉子的節(jié)點上,以此做一個新的特征,原始論文中,把特征放在一個邏輯回歸的模型中去做,當(dāng)然你也可以把輸出的特征和原始的特征加在一起,放在XGBoost、或者
FM(Factorization Machine因子分解機(jī),又稱分解機(jī)器,旨在解決大規(guī)模稀疏數(shù)據(jù)下的特征組合問題)。
圖片是Embedding的方法,因為深度學(xué)習(xí)的應(yīng)用比較火的結(jié)果,大家都有興趣把深度學(xué)習(xí)的模型,應(yīng)用到商業(yè)分析里面。這個借鑒了word2vec的方法,讓相近的門店與產(chǎn)品,本來是稀疏的特征,希望通過一系列的Embedding轉(zhuǎn)換之后,轉(zhuǎn)換到稠密的向量空間中,一些相近的商品門店,在向量空間中距離比較近,這樣起到了特征轉(zhuǎn)換。
在比賽中,我們用Keras做了Embedding實現(xiàn),把商品、日期、門店做了Embedding,
套幾個全連接的層,加一些東西,一直到輸出到結(jié)果。
t-SNE降維處理,畫在二維的圖標(biāo)上面,
左邊月份的聚類,789月熱,距離在圖上近,天氣比較冷的月份在圖中距離差的比較遠(yuǎn)。右邊t-SNE圖是所有門店的圖,因為得到的數(shù)據(jù)門店都用的ID(全數(shù)字)來表示,所以只能推測是行為模式比較像、或者地理位置比較近的門店是脫敏數(shù)據(jù),所以沒有辦法檢驗。
模型調(diào)優(yōu)
基線:歷史平均(一般來說對復(fù)雜的,實際數(shù)據(jù)的預(yù)測問題,對歷史銷量平均做預(yù)測值)
時間序列: SARIMAX, tbats, generalized additive model(廣義加性模型)
樹模型: Random Forest, XGBoost, LightGBM
深度學(xué)習(xí): embedding, wide and deep, LSTM在特征工程之后,我們會做一些模型的選擇。,還有一些方法,比如時間序列等方法。
樹模型是數(shù)據(jù)科學(xué)比賽常用的,XGBoost、隨機(jī)森林、因為是微軟的比賽,我們嘗試了微軟的LightGBM,實現(xiàn)效果如何。還嘗試了深度學(xué)習(xí)的模型embedding、wide and deep, LSTM等模型。
歷史平均、簡單平均、加權(quán)平均,移動平滑平均都可以使用。比賽中MAPE: 0.744,這個數(shù)值為后續(xù)服務(wù),模型調(diào)優(yōu)的基線。
時間預(yù)測模型的示意圖:GAM庫,時間預(yù)測模型比較簡單、預(yù)測值穩(wěn)定,可解釋性強(qiáng),黑點是真實值,深藍(lán)色預(yù)測值,淡藍(lán)色是置信區(qū)間。
有很多點捕捉不到,所以誤差會大。
時間序列的可解釋性
趨勢:7、8、9月天氣熱,啤酒銷量好;節(jié)假日、周末周期性強(qiáng)。
樹模型:
應(yīng)用非常廣泛,尤其是非圖像的,文本、語音,商業(yè)數(shù)據(jù)很多主流的方法就是樹模型,
1.Random Forest
2.GBRT
優(yōu)點:
對于離群值的魯棒性較好
數(shù)據(jù)分布要求低(不需要做預(yù)測力,神經(jīng)網(wǎng)絡(luò)一般會要求做歸一化,讓數(shù)據(jù)的分布一致一些,否則模型效果會差。)
可解釋性強(qiáng)(每個節(jié)點都會告訴你,分裂的規(guī)則)
可以用于特征選擇(訓(xùn)練完會告訴你權(quán)重,可以依次來選擇一些特征,把精簡之后的特征喂給其他的模型,比如線性回歸等簡單的模型)
這次比賽,
主要用XGBoost、LightGBM庫對比
XGBoost
Train time: 487.68 seconds
MAPE: 0.251
LightGBM(雖然需要指定超參數(shù)、但是效果很好)
Train time: 19.19 seconds
MAPE: 0.256
深度學(xué)習(xí):
我們把預(yù)測值銷量歸一化,
Embedding網(wǎng)絡(luò)示意圖,
計算資源需求較大
超參數(shù)調(diào)優(yōu)
網(wǎng)絡(luò)結(jié)構(gòu)
Embedding size
Dropout
MAPE: 0.654
賽題中400萬的數(shù)據(jù),跑起來非常慢,因為比賽中沒有使用GPU所以訓(xùn)練的時間還是比較久的。
另外一點,Embedding把原始的特征輸入,雖然特征工程少一些,但網(wǎng)絡(luò)的超參數(shù)需要調(diào)整,而且很多然而沒有理論依據(jù),說白了就是嘗試,一直嘗試哪個會比較好,MAPE: 0.654比平均值稍微好一點。比起XGBoost的基準(zhǔn)線還是差了很多。
把線性模型的東西加進(jìn)來,可以兩個模型一起訓(xùn)練,線性模型主要做記憶功能,歷史上出現(xiàn)的模式可以通過線性模型,記憶下來。
Deep Models提升泛化能力。
下圖是用TensorFlow來實現(xiàn)wide and deep models。
左邊是deep model的實現(xiàn),右邊是線性模型(wide層)。
圖中為,原始論文中的特征的構(gòu)建方式,deep models那層要求輸入是密集型的,稀疏是不能直接做輸入的,所以要做轉(zhuǎn)換,有的用Embedding等來做轉(zhuǎn)換。
模型選擇完后,需要進(jìn)行模型的訓(xùn)練和調(diào)優(yōu),其中重要的一步是交叉驗證,在時間序列中,交叉驗證有一個重點——構(gòu)建與真實場景一致的切分方式。在時間序列中用一個連續(xù)的一段時間去預(yù)測緊接著的時間一個時間切分,切分方式與真實場景一致,隨機(jī)切分不是在真實場景中的切分方式。會影響效果。
超參數(shù)的調(diào)整
1.啟發(fā)式調(diào)優(yōu)
用經(jīng)驗。比較簡單的是用啟發(fā)式的調(diào)優(yōu),先固定一個比較大的learning rate去調(diào)樹的數(shù)量、樹的深度、葉子節(jié)點分頁需要的條件之類的。
2.網(wǎng)格搜索
把所有想要嘗試的參數(shù)寫下來。網(wǎng)格搜索自動把所有的組合嘗試一遍,幫你找到最優(yōu)的組合,把最優(yōu)的結(jié)果返回給你。
3.貝葉斯優(yōu)化
把超參數(shù)搜索的過程看成高斯過程,庫會自動嘗試不同參數(shù),然后尋找下一個最可能出現(xiàn)比較低的loss的嘗試,搜索空間的計算量比網(wǎng)格搜索小很多。
模型融合
用模型融合的方法來做效果提升。做完這個超參數(shù)調(diào)整之后,一般來說,最后用模型融合的方法來做效果提升,首先保證模型具有一定的差異性,可以選擇不同隨機(jī)數(shù)種子,生成不同的預(yù)測結(jié)果,最后再把各個模型融合起來。
比較常見的模型融合的方法是Blending和Stacking。是現(xiàn)在有很多庫已經(jīng)實現(xiàn)了,調(diào)用非常方便。Stacking就是把各個模型的預(yù)測值預(yù)測出來,把預(yù)測值作為特征輸入下一層模型中,下一層自動選擇最好的融合參數(shù),有的模型權(quán)重高,有的權(quán)重低。把最后融合好的預(yù)測值給輸出。
誤差分析
預(yù)測結(jié)束后,會對模型做最終的調(diào)優(yōu)。主要看模型會在哪些點上產(chǎn)生誤差。如何通過各種方法產(chǎn)生大的誤差,誤差最大的點要進(jìn)行細(xì)致深入的分析,為什么會出現(xiàn)這樣的誤差。日后我們通過各種方法去解決大誤差。
一個新產(chǎn)品,第一次在要預(yù)測的月份售賣。賣出了幾千份。用歷史數(shù)據(jù)很難預(yù)測準(zhǔn)確。所以會產(chǎn)生誤差。這種情況可以建立子模型專門去新品銷售數(shù)量的預(yù)測。融合模型方面,用了三個XGBoost、LightGBM、Random Forest,其實也可以用時間序列和神經(jīng)網(wǎng)絡(luò),但是主要是因為計算資源有限,所以沒有觀察最終融合的效果。最后得到的MAPE: 0.236,比起基準(zhǔn)線,好了很多。(完)
補(bǔ)充:
觀遠(yuǎn)數(shù)據(jù)團(tuán)隊也在探索,如何將深度學(xué)習(xí)應(yīng)用到商業(yè)分析領(lǐng)域,現(xiàn)在來說還是待決的問題,不像圖像和語音識別技術(shù)已經(jīng)取得和很大的進(jìn)展,深度學(xué)習(xí)在商業(yè)分析領(lǐng)域處理較少數(shù)據(jù)量,復(fù)雜規(guī)律、復(fù)雜業(yè)務(wù)特征等方面很有挑戰(zhàn)。期待數(shù)據(jù)科學(xué)家的加入。
以上內(nèi)容為觀遠(yuǎn)數(shù)據(jù)技術(shù)合伙人周遠(yuǎn)技術(shù)公開課分享筆記,未能與本人確認(rèn)所有細(xì)節(jié),僅供參考。賽事為微軟大中華區(qū)智能零售(Smart Retail)解決方案新創(chuàng)企業(yè)黑客松上海站。
總結(jié)
以上是生活随笔為你收集整理的如何预测百威啤酒销量?数据竞赛冠军笔记分享 思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Markdown输出LaTex数学公式
- 下一篇: 软考高级网络规划设计师电子教材