王 輝 李昌剛
(浙江萬里學院信息與智能學院 浙江 寧波 315000)
大數據與機器學習的結合為當今社會帶來的巨大的變革,從每天2 500萬人次足不出戶地在餓了么平臺上找到自己喜歡的餐廳和食物,到亞馬遜在客戶服務中運用大數據精準預測出客戶的需求來建立高效的物流運轉體系,都顯現著變革帶來的數字化趨勢的威力。機器學習技術基于強大的計算平臺給各行業,特別是零售行業帶來了成本的降低和效益的增長。大數據、云計算、物聯網,必然會使傳統零售向人工智能互聯網時代的新零售過渡,零售業在實體經濟中的權重地位也必然會獲得大幅增強。
銷售預測在零售行業中有著舉足輕重的地位,準確的銷售預測結果不僅能夠讓管理者合理安排訂貨時間和庫存,減少安全庫存成本和缺貨損失,還能夠支持高層管理者在指定戰略發展目標的可靠性。由于數據存儲技術的發展,企業存儲了大量的數據來支持企業的運營決策,在一些數據量大,數據結構多樣的銷售預測場景下,傳統的統計學方法[1]可能無法取得精準的預測結果,因此國內外學者對機器學習技術在銷售預測中的應用進行了大量的研究。
Grasman等[2]使用Bass模型和銷售的數據,為未來銷售進行了點估計,并假設噪音的大小與年銷售額成正比,利用時間依賴的Ornstein-Uhlenbeck過程的形式,給出了誤差的置信區間。姜曉紅等[3]以某電商平臺數據為例,運用時間序列法ARIMA模型預測各種商品在未來一周全國和區域性需求量,并與簡單移動平均法預測結果做對比,發現ARIMA模型有更高的精準度。Loureiro等[4]通過深度學習方法獲得的銷售預測與決策樹、隨機森林、支持向量回歸、人工神經網絡和線性回歸獲得的銷售預測進行比較,發現采用深度學習的模型在預測時尚零售市場的銷售方面具有良好的性能。Duan等[5]將支持向量機、BP神經網絡與K-最近鄰算法在預測手機銷售前景的準確性上進行了比較,發現在小樣本的前提下,支持向量機能更好地預測出各類手機的銷量。
基于機器學習的銷售預測的另一種方式是使用自然語言處理(NLP)工具,使計算機能夠識別潛在消費者的語音和電子郵件中的關鍵詞,以預測這些消費者將購買的可能性。Fan等[6]為了產品銷售預測,開發了一種結合Bass/Norton模型和情感分析同時使用歷史銷售數據和在線評論數據的新方法。利用Naive Bayes算法的情感分析方法,從每個在線評論的內容中提取情感指標,并將其整合到Bass/Norton模型的仿制系數中,以提高預測精度,并收集了真實的汽車行業數據和相關的在線評論對模型進行驗證。
由于機器學習算法在應用的過程中通常需要調整算法中的超參數,因此有些學者對算法進行了優化。黃鴻云等[7]基于改進的多維灰色模型(Gm(1,N))和神經網絡(ANN)來預測銷量,其中多維灰色模型對銷售數據建模,神經網絡對誤差進行校正。利用阿里天貓銷售數據來評估混合模型的表現,實驗結果表明,該模型的預測結果優于其他幾種銷售預測模型。張文雅等[8]通過網格搜索優化了支持向量機的超參數,并用汽車銷售數據來對優化后的算法進行了驗證,發現優化后的算法擁有更好的預測性能。王錦等[9]利用遺傳算法能夠全局尋優的特點,將BP神經網絡各隱層的權值和閾值進行了遺傳優化,結果表明,模型的穩定性和收斂速度得到了顯著的提高。羅嗣卿等[10]通過DBSCAN算法解決了K-means算法對噪聲數據敏感的問題,并結合ARIMA模型以藍莓干銷售數據驗證了改進后的算法的精確性。
雖然通過優化算法的超參數或者結合幾種算法能在銷售預測問題上取得比未改進的單一模型更高的精準度,但是當銷售數據的屬性以及異常值很多時,單一模型在樣本外的數據中往往不能帶來更好的效果。因此,有學者采取組合的方式來將模型結合起來或者通過集成策略來達到更好的預測性能,例如Timmermann[11]發現預測的線性組合可能會改善其每個貢獻者。常曉花[12]通過使用boosting集成策略下的隨機森林算法對醫療器械進行了銷售預測,發現采取boosting集成策略的隨機森林模型比未采取集成策略的預測模型減少了12%的誤差。不過組合模型的缺陷是各單一模型使用的訓練數據集仍然是相同的,采用數值上的線性組合并不能真正帶來模型在泛化能力上的提高,各模型不能在算法層面上優勢互補,而且組合預測的理論支撐不夠,不能讓使用者信服,而單一的隨機森林算法或者xgboost[13]算法屬于同質集成,在樣本外的泛化能力仍然需要改進。
為解決單模型或者同質集成模型在大樣本銷售預測中泛化能力不強的特點,考慮使用Stacking集成策略[14],將同質集成算法方法XGBoost、Randomforest與其他算法結合,構建兩層Stacking集成學習模型進行銷售預測,并使用德國Rooseman超市的銷售數據對算法進行了驗證。結果表明,Stacing集成策略能結合不同機器學習算法的優勢提升模型的預測性能,相比單個模型,Stacking模型有著更高的精度和泛化能力。
在Stacking集成學習方法中,整個歷史數據集劃分為若干個子數據集,子數據集劃分為訓練集和驗證集,由基學習器擬合訓練集中的數據來產生底層模型,并用模型在驗證集上產生的預測值作為第二層的輸入。這樣,高層的學習器能夠進一步對模型進行泛化增強,這是Stacking方法總能夠在測試集上取得很好的預測性能的原因。區別于隨機森林中的Bagging策略,Stacking模型利用的是算法層面上的優勢結合,因此Stacking集成策略可以看作是異質集成。這意味了底層學習器需要保持差異性,否則Stacking集成策略依然是變相的Bagging策略。基本的兩層Stacking算法流程如算法1所示。
算法1Stacking算法
輸入:
訓練集:S1={(x1,y1),(x2,y2),…,(xm,ym)}
保留集:Shold-out={(x1,y1),(x2,y2),…,(xl,yl)}
測試集:S2={(x1,y1),(x2,y2),…,(xm,ym)}
基學習器:ζ1,ζ2,…,ζl
元學習器:ζmeta
Step1fori=1,2,…,l
doζi·fit(xi,yi)
//生成l個基學習器
end
Step2fori=1,2,…,l
//生成l個保留集上的預測向量
doHi=ξipredictS2
//生成l個測試集上的預測向量
end
//生成用于元學習器的訓練集
//生成用于元學習器的測試集
ξmetafitP
Step4ξmetapredict
輸出:生成測試集上的預測值
由于Stacking模型使用基學習器在第一層產生的預測值作為第二層的輸入,這意味著基學習器與元學習器所使用的訓練數據必須不同,否則數據會被過度學習,導致模型的過擬合。因此在分割原始數據集時,要保證每份數據都有訓練集和保留集,用基學習器在保留集上的預測數據作為第二層的訓練數據;在分割時間序列數據時,要保持數據的同分布,不能簡單地以時間線來分割數據集。這些工作會讓模型擁有更好的性能和泛化能力。
集成學習(Ensemble learning)指的是基于多個算法,通過不同的方式來組成新的學習方法,對于單個預測模型來說,集成學習模型能夠獲得更加優越的預測性能,模型準確率呈現邊際效用遞減的趨勢。在Stacking集成學習模型中,基學習器的差異性越高,模型性能越好,因此在建模之前,不僅要分析各基學習器的預測效果,也要分析基學習器之間的差異。
家長作為孩子的第一任老師,必須要積極發揮教育作用,轉變傳統的家庭觀念,與孩子保持密切的溝通和交流,做到精心呵護和全面關懷,不僅關心子女的生活和學習方面,也要著重關心子女的思想情感和心理健康等方面,重視孩子的健康成長。家庭教育會伴隨孩子的一生,應增加家庭教育指導,增強家長的責任意識,提高他們的監護能力。要給孩子提供更多的鍛煉機會,發揮其聰明才智,不能凡事都包辦,以免打消孩子的積極性。還要正確評價孩子,以正面教育為主,出現錯誤不要一味批評,做到具體問題具體分析,產生“潤物細無聲”的教育效果。
本文選擇隨機森林模型、線性回歸模型、KNN模型以及XGBoost模型作為第一層的基學習器。其中,隨機森林模型和XGBoost模型基于決策樹模型分別使用Bagging和Boosting的集成學習方式,在實踐應用中取得了較好的效果。KNN模型因為其理論成熟、訓練方式高效等特點也有著廣泛的應用,而加入線性回歸模型是為了保持各算法之間的差異性,使得模型能夠獲得更好的預測性能。由于第二層的元學習器既要能夠糾正各算法的偏差,也要能夠保持較高的泛化能力來防止過擬合,因此選擇XGBoost算法來作為元學習器。Stacking模型的總體架構如圖1所示。

圖1 Stacking模型框架
對于集成策略來說,集成模型需要從不同的數據空間和數據結構角度來觀察預測數據,再依據觀察結果以及模型自身的特點來從本質上改善模型的預測性能。因此,需要考察各基學習器在保留集上的預測誤差的相關性。本文采用Pearson相關系數對各個模型的誤差差異度進行計算,以衡量不同基學習器的關聯程度,其計算公式為:
(1)

為了不讓Stacking模型過擬合,必須為每個子學習器安排不同的訓練集和測試集,這是因為元學習器的訓練集是基學習器的輸出,如果直接用基學習器的訓練集結果來擬合元學習器,會導致學習器對數據的重復學習。因此,本文按照日期將數據分為四塊,再將每塊中的數據分成四份,從四份中隨機抽取一份,按塊順序結合并形成新的四塊數據,以保證數據的相同分布;在新的數據塊中將數據分為三份訓練和一份驗證集,元模型用驗證集的來產生第二層的訓練集。這樣不僅保證了數據不會被重復學習,也保證了各基學習器所使用的數據是同分布的。
另外,在構建模型的輸入數據時,需要考察各特征之間的相關性和特征的重要程度。本文先對數據進行了預處理,再通過計算各特征之間的Pearson相關系數來挑選出相對獨立的特征。由于Random forest和XGBoost算法可以計算各樹的增益情況來評估各特征的評分,所以在完成第一次的模型訓練后,查看模型輸出的特征評分,從而刪除冗余特征,使得模型能夠取得更好的性能。
實驗使用了德國Rossman日用品超市在Kaggle平臺上所提供的數據,其中包含了1 115家商店在2013年1月1日到2015年7月31日所產生的1 017 210條數據以及1 115條商店信息數據,銷售數據和店鋪數據的變量及含義如表1和表2所示。目標是2015年8月1日到2015年9月17日各商店的銷售值。實驗在Google的Colab云平臺與Python 3.7環境下完成,預測評價指標采用均方根百分誤差(Root Mean Square Percentage Error,RMSPE),其計算公式為:
(2)

表1 銷售數據信息的變量名及其含義

表2 店鋪數據信息的變量名及其含義
將銷售值包含在內,實驗數據一共有18個特征,涵蓋了促銷、競爭對手、節假日、商店、商品、顧客等信息。本文將日期分解為年、月、日,將商店類型、商品類型、假日類型采用實數或者獨熱(one-hot)編碼來進行處理。在經過數據預處理后,對19個特征進行相關性分析,其結果如圖2所示。

圖2 特征相關性分析
可以看出,Promo2SinceYear與Promo2、WeekOfYear與Month的相關度很高。這是因為Promo2SinceYear是根據Promo2的時間來計算的,而WeekOfYear和Month是通過日期分解得到的。其他特征之間的相關性都不高,因此可以采用這些特征向量來作為輸入。以銷售值為目標變量,使用Random forest以及XGBoost算法進行建模,建模完成后,模型輸出的各特征的評分排序結果如圖3所示。

(a) XGBoost模型特征重要性排序

(b) Random forest模型特征重要性排序圖3 特征重要性分析
可以看出,在XGBoost算法中,各特征的差異比較明顯,模型能夠為每個特征分配更好的權重,而Random forest中除了促銷特征重要性最高外,其他特征重要性差異不明顯。這也是XGBoost模型比Random forest模型取得更好預測性能的原因。除此之外,兩個模型輸出的前五名特征中,競爭對手、促銷以及商店都囊括在內,這也證明了此次實驗中特征選取的有效性。
由于模型中存在一些需要人為調整的超參數,如果采取每個參數都單獨調整再觀察模型在驗證集上的預測性能的方法來進行超參數優化,那么所需要的時間成本太高,而且通常需要有經驗豐富的算法工程師來進行這項任務。因此,本文使用一種隨機采樣交叉驗證的方法來進行超參數優化,與網格搜索對比,隨機搜索采取搜索各超參數在參數組合空間上的分布,從而能夠在選取更優的參數組合的前提下,比網格搜索考慮更少參數組合數量。另外,隨機搜索能夠在不影響性能的前提下添加參數節點。實驗中指定各算法的參數列表,并用10折交叉驗證后的均方根百分誤差(RMSPE)來評估各組合。各模型最終的超參數以及預測誤差如表3所示。

表3 單模型隨機搜索優化后的超參數選擇和誤差
對比各模型的均方根百分誤差可以發現,XGBoost模型的誤差最低。由于RMSPE是在驗證集上采集的,證明了XGBoost模型有更好的泛化能力,因為XGBoost算法將損失函數進行了二階泰勒展開,使得模型訓練更充分。
對于Stacking模型而言,基層不同模型之間的差異性越高,則元學習器能夠改善的空間就越大,整個模型的預測性能就越高。因此在選擇基學習器后,需要考察各基學習器的預測誤差相關性,盡可能選擇差異性高的算法。在四份驗證集中隨機抽取一份數據,讓各基學習器在該數據集上做出預測,將預測結果合并在同一數據框內,采用Pearson相關系數衡量各基學習器之間的相關性,結果如圖4所示。

圖4 各模型預測誤差相關性分析
可以看到,除了XGBoost與LR之外,各算法的誤差相關性都很低,這是因為在有些異常值上XGBoost算法和LR算法在某些數據上呈現出了同樣的趨勢,但是總體的相關性低,這說明Stacking模型有待于取得更好的性能。
綜上所述,最終選擇RF、LR、KNN、XGBoost作為Stacking集成模型的基學習器來完成實驗。
為了驗證Stacking模型是否能取得比其他模型更好的預測性能:首先在實驗中隨機抽取一個商店,對比單一模型和Stacking模型在該商店上的預測值與真實值的比較,其結果如圖5所示。


圖5 單模型與Stacking模型的預測值與真實值對比
可以看到,Stacking模型取得了比單一模型更好的預測性能,而且在一些異常值上,Stacking模型也能夠處理得很好,這也證明了Stacking模型充分發揮了各算法的優勢。通過從算法層面上的結合,改善了各算法預測效果較差的部分并且能夠避免算法陷入局部最小點的缺陷。
元模型即第二層XGBoost算法的特征重要性如圖6所示。可以看到,各基學器對在Stacking模型中的權重,其中XGBoost算法的貢獻度最高,而其他學習器的貢獻度差異不大,這說明在Stacking模型中,XGBoost算法的性能是整個模型的預測性能得以改善的主要原因,同時也證明了XGBoost模型在解決大樣本的回歸問題時有著較高的魯棒性和泛化能力。

圖6 基學習器對在元模型中的貢獻度
為了比較Stacking模型與單個模型在整個測試集上的測性能,表4展示了以RMSPE為衡量標準的各模型的精度。可見,Stacking模型的RMSPE相比單個預測模型中預測性能最好的XGBoost模型降低了1.8%,相比單個預測模型中預測性能最差的LR模型降低了23.5%。對于大型企業來說,每提高1%的精度都能降低大量的安全庫存或者減少缺貨損失。

表4 Stacking模型與單一模型精度對比
本文針對單個模型在大樣本的銷售預測上不能取得很好的泛化能力的問題,建立了多模型融合下的Stacking。該模型取得了比單一模型更好的預測性能和泛化能力,在零售企業在庫存管理、經營管理、供應鏈管理中有較高的應用價值。由于Stacking模型總的框架比較復雜,總體訓練時間較長,未來可以考慮將模型在分布式環境下進行計算。還可以進一步地研究使用Stacking集成學習方法來處理實時數據,并根據Stacking集成學習方法來研發一套從數據獲取到知識獲取的數據處理系統,這勢必會有更高的應用價值。