張雷東,王 嵩,李冬梅,朱湘寧,焦艷菲
1(中國科學院大學 計算機控制與工程學院,北京 100049)
2(中國科學院 沈陽計算技術研究所,沈陽 110168)
3(沈陽高精數控智能技術股份有限公司,沈陽 110168)
隨著經濟全球化的逐漸加深,企業之間的競爭日益激烈.并且當下隨著電子商業的飛速發展,每天都有上萬筆交易在互聯網上完成,這樣就產生了海量的數據.企業如果能利用這些數據,從數據中挖掘出用戶購買的一些規律,就能更好的在這個市場中占據有利的位置.銷量預測一直是一個重點研究的問題,一個準確的銷量預測可以為企業控制成本,提前規劃市場和部署戰略.這個問題解決的好就能為企業的未來規劃提供重要決策的理論支持.
目前為止,銷量預測的研究方法有自回歸移動平均法 (ARMA)、線性回歸、灰色系統理論等.基于時間序列的預測方法也被越來越多的學者采用,鄭琰等基于時間序列的商品預測模型研究[1]、顧涵等支持向量歸等在高頻時間序列中的研究中[2]以及Fan ZP 等在預測產品銷售時[3],采用這樣方法都得了良好的效果.隨著深度學習的崛起,又有了長短記憶網絡(LSTM)這樣優秀的預測算法,葛娜等利用Prophet-LSTM 組合模型對銷售量進行預測研究[4].除此之外,張彤等利用LSTM 的該井模型GRU 結合LMD 形成了一種新的預測方法[5].往往將傳統的線性模型和深度學習算法相結合,通常比單一算法表現優秀,或者結合以上某兩種算法.例如馮晨等基于 XGBoost 和 LSTM 加權組合模型在銷售預測的應用[6],表示不同模型的組合,很大的提高了模型的泛化能力.
集成學習就是這樣的一種策略,集中幾種模型的優勢,大大提高模型的性能.Stacking 模型堆疊就是一種集成學習的思想,集成幾種模型的優勢.盛杰等利用Stacking 算法對惡意軟件進行檢測[7],包志強等將傳統的Stacking 算法進行了改進,提出了一種熵權法的Stacking 算法[8],明顯提高了算法的預測性能。
整個預測算法框架如圖1所示.
(1) 將整個數據集分為訓練集和測試集.
(2) 對所有的特征進行Pearson 相關系數計算,篩選掉冗余的特征,選擇相關性的特征,作為模型訓練的特征向量.
(3) 將SVR、GRU、XGBoost 作為Stacking 的基礎模型,利用特征向量進行訓練.
(4) 將歷史信息、均值、價格變化、評價分析和Stacking 第一層的輸出以及原始的特征進行特征融合,形成最終預測模型的輸入.
(5) 將lightGBM 作為Stacking 算法的次級預測模型,進行訓練并且在測試集上進行預測,得到結果.

圖1 預測算法框架圖
Stacking 算法簡單理解就是幾個簡單的模型,一般采用將它們進行K 折交叉驗證輸出預測結果,然后將每個模型輸出的預測結果合并為新的特征,并使用新的模型加以訓練.
Stacking 通常分為很多層,每一層的輸出作為下一層的輸入.但是伴隨著層數的增多,模型的復雜度也在增加,訓練起來也會慢很多.所以通常采用兩層結構.在第一層時,將K-1 份數據作為訓練集進行訓練,將剩下的一份用來預測.這樣K輪下來以后,將K輪的預測結果和原始數據進行拼接就形成了新的訓練集.然后,第二層的模型利用新的數據集進行訓練.最終預測,輸出結果.如圖2所示.
在本文中,將SVR、GRU、XGBoost 作為第一層的預測模型,lightGBM 作為第二層的預測模型.具體訓練過程如下:
(1) 將處理好的訓練集平均分為5 份數據量大小相等的數據Di(i∈1,2,3,4,5);
(2) 在每一輪訓練中,對于每一訓練模型,例如SVR,在4 份數據上進行訓練,剩下一份用來預測得到Pi;
(3) 將第一層預測模型的輸出Pi和原始的特征進行拼接,得到最終的訓練數據集D;
(4) 利用最終模型lightGBM 在訓練集D上進行訓練;
(5) 最后在測試集上進行預測,得到最終的預測結果Prediction.

圖2 Stacking 算法結構圖
LigthGBM 是Boosting 集合模型中的新進成員,由微軟提供,它和XGBoost 一樣是對GBDT 的高效實現.LightGBM 通過使用Gradient-based One-Side Sampling(GOSS)和Exclusive Feature Bundling (EFB)兩種方法來解決特征選擇的問題,進而加速訓練速度.偽代碼如算法1 及算法2.

算法1.GOSS算法偽代碼輸入:I:training data,d:iterations,a:sampling ratio of large gradient data,b:sampling ratio of small gradient data,loss:loss function,L:weak learner 1-a models ← {},fact ← topN ← a*len(I),randN ← b*len(I)For i=1 to d do preds ← models.Predict(I)g ← loss(I,preds),w ← {1,1,…}sorted ← GetSortedIndices(abs(g))topSet ← sorted[1:topN]b randSet ← RanomPick(sorted[topN:len(I)],randN)usedSet ← topSet+randSet W[randSet] *=fact ? Assign weight fact to the Small gradient data newModel ← L(I[usedSet],- g[usedSet],w[usedSet])Models.append(newModel)

算法2.EFB算法偽代碼輸入:F:feature,K:max conflict count輸出:bundles Construct graph G searchOrder ← G.sortByDegree()Bundles ← {},bundlesConflict ← {}for i in searchOrder do needNew ← True for j =1 to len(bundles) do cnt ← ConflictCnt(bundles[j],F[i])if cnt + bundlesConflict[i]<= K then bundles[j].add(F[i]),needNew ← false break if needNew then Add F[i] as a new bundle to bundles
(1) 對于缺失值和由于促銷引起的銷量數據激增,采用這個月銷量的均值代替.
(2) 將標簽特征利用one-hot 編碼轉化為0 或1 的特征.
特征工程的結果對模型對著模型效果改善有著重要的作用.特征工程通常用來減少冗余的特征,提高模型訓練的速度以及準確率.經常用的特征選擇的方法有Pearson 相關系數、互信息和最大信息系數、皮爾森卡方檢驗、距離相關系數等.
2.5.1 特征選擇
在這里選用Pearson 相關系數,這是比較簡單使用的特征選擇方法.這種方法能夠反映特征和預測值之間的線性相關關系,結果值范圍在[-1,1],-1 表示該特征和預測值完全是負相關,0 表示沒有線性相關的關系,1 則表示該特征值和預測值正相關.其計算公式如下:

在式(1)中c ov(X,Y)表示兩個變量的協方差,其計算公式如下:

在式(1)中 σX表示變量X的標準差,計算公式如下:

2.5.2 特征構造
(1) 按照一級類型、二級類型統計該類型產品月銷量的均值.
(2) 提取當前月的前第一個月、前第二個月、前第三個月、前第四個月、前年該月的銷量數據.
(3) 加入商品的價格變化.
(4) 商品的評價分析:對評論數據進行分詞,然后構造情感詞典,計算每條評論的情感值,最后累加每天的評論情感值.
本實驗數據來源于一個氨綸制造的企業.數據主要包括從2014年1月到2018年1月每一天的歷史銷量數據.數據屬性主要有:產品id、產品類型、產品等級、產品用途、產品價格、重量、日期等.
(1)RMSE均方根誤差
均方根誤差是預測值與真實值偏差的平方與觀測次數n比值的平方根.計算公式如下:

(2)MAE平均絕對誤差
MAE是真實值與預測值的差值的平方然后求和平均.計算公式如下:

(3)MAPE平均絕對百分比誤差

利用Pearson 相關系數,篩選掉一些相關性弱的特征.最終選擇了產品id、產品等級、價格、產品類型、產品用途、顏色、材質、是否有促銷活動、所屬的年月等屬性.
3.3.1 模型參數設置
利用XGBoost 和LightGBM 單模型在訓練集訓練模型時,使用Skit-learn 機器學習庫中的GridSearchCV方法,對模型的參數使用交叉驗證的方式去探索最優的參數.核心參數如表1和表2所示.

表1 LightGBM 參數表

表2 XGBoost 參數表
SVR 模型涉及的核心參數主要有3 個:選用的核函數、懲罰因子以及核系數.通過Grid Search 實驗驗證最佳的參數見表3.

表3 SVR 參數表
3.3.2 預測結果分析
在訓練集上訓練單模型以及組合模型,最終在測試集上進行預測.將預測結果繪制成折線圖,得到的結果圖對比如下.
為了更加具體的比較出各個模型預測性能之間的差異,采取RMSE、MAE以及MAPE3 個評判指標進行對比.具體的結果對比見表4.

表4 各模型預測性能對比
從圖3中可以看出SVR 預測結果最差,LightGBM要比XGBoost 好一些.組合模型和SVR、XGBoost、LightGBM 以及GRU 相比,性能都有所提升.Sacking組合模型的性能最優.因此,基于Stacking 集成策略的組合模型確實能提升算法的預測性能.在做回歸問題時可以使用Stacking 方式集中幾個模型的優勢,可以為實驗準確度的提升帶來一定的幫助.

圖3 各個模型最終預測效果圖
在加入歷史信息、均值、價格變化以及評價分析這些新的特征以后,和沒有進行特征融合的算法預測結果進行對比.將預測結果繪制成圖,如圖4所示.

圖4 特征融合之后預測結果對比圖
按照評價標準進行計算后,具體結果見表5.

表5 模型融合后的預測性能對比
從預測效果圖上可以看出,在加入新的特征之后,算法預測性能有明顯提高.從3 個評價指標的數值上也可以看出,特征融合之后的算法預測的MAPE提升到了2%.也證明這些新的特征確實發揮了作用.
本文使用Stacking 策略結合了LightGBM、GRU、SVR、XGBoost 幾種經典的解決回歸問題的算法提出了一種多種算法融合的產品銷售預測模型,并且結合數據做了實驗.實驗證明這種多種算法融合的產品銷售預測模型的預測結果要比這些單一模型的預測結果更加接近真實數據.并且在引入了歷史信息、均值、價格變化以及消費者的評價分析等這些新的特征后,算法的預測性能又有了進一步的提升.
最終實驗表明,通過集成學習能夠有效提高氨綸產品銷量的預測性能.為回歸問題的提出一種新的思考方式和解決辦法.同時,Stacking 策略也使得整個組合模型的復雜度變高,訓練速度變得緩慢,這也是進一步要嘗試改進的地方.同時未來工作中,將進一步嘗試結合不同新的模型來做回歸類問題的研究.