尤璞,劉星甫
(江南大學商學院,江蘇無錫 214122)
需求預測在各行各業都有著重要作用,準確的需求預測能讓管理者合理安排訂貨時間、生產計劃等環節,減少庫存成本和缺貨損失,提升企業核心競爭力。但由于需求變化多樣,掌握市場需求動態,作出準確的銷售預測,是一項巨大的挑戰。目前,國內外的許多學者對銷量預測做了大量研究,采用的方法主要是時間序列預測技術和以大數據技術為支撐的機器學習預測技術。時間序列模型是比較常見的預測模型,許多學者對時間序列模型進行改進或者對不同模型進行組合,取得了較好的預測效果。時間序列模型在假設需求是一種線性變化趨勢的基礎上對下一階段的需求進行預測,其操作簡單、容易實現,如果歷史銷售數據的趨勢性較強,就能夠較好地擬合數據。但是傳統時間序列模型的缺點也很明顯,它要求時序數據穩定,無法對復雜的非線性系統進行有效擬合,且容易發生多重共線性,導致預測不準確。
近年來,得益于互聯網技術的快速發展和物流服務水平的不斷提升,運用數據挖掘技術和機器學習算法等解決銷量預測問題也成為研究熱點。Loureiro等發現采用深度學習模型在預測時尚零售市場的銷售方面具有良好性能;吳娟娟等針對大數量級的序列預測,提出基于記憶機理的LSTM模型并用銷售額數據進行驗證,實驗結果表明LSTM模型表現優于傳統時間序列模型。相較于時間序列模型,機器學習模型可以更好地估計高維數據集,把握住需求變化中的非線性因素,作出更準確的預測。為進一步提升模型性能,一些機器學習技術的組合模型也應用于銷售預測。通過組合多個模型,單個模型的預測誤差可以被其他模型所彌補,因此可以獲得更好的預測效果。
上述研究雖然嘗試通過多種方法預測銷量,但至今沒有主導的預測技術。對于企業管理者而言,如何從多種預測技術中作出選擇也是一個難題。傳統的時間序列方法需要掌握一定的統計學知識才能熟練運用,且往往受限于固定的模型框架和較為嚴格的假設條件,對于需要快速響應的商業環境并不適用。而許多機器學習方法應用于銷售預測時,過于依賴歷史數據,需要預訓練大量數據才能達到良好的預測效果。此外,對于時間序列數據,在驗證模型時,常規的交叉驗證可能會造成數據泄露問題,影響模型在測試集上的表現。
針對銷售預測研究現狀,本文提出一種基于Stacking集成策略的銷售預測方法,將Prophet算法和隨機森林、BP神經網絡作為基學習器構建Stacking預測模型。該算法充分考慮了不同模型的差異性,使得不同算法的優勢得以結合,利用時間序列預測算法,即Prophet算法對數據的周期性進行擬合,再通過Stacking算法融合隨機森林和BP神經網絡對數據的非線性進行擬合,通過3種異質算法的融合取長補短。同時,將歷史銷售數據作為新特征,給數據加入了時序性,并采用日向前鏈的交叉驗證方法,避免了數據泄露,提升了預測效果,取得了比單個模型更好的預測性能。
Stacking算法是一種模型融合算法,通過融合不同的算法增強模型泛化性能,減少預測誤差。Stacking算法首先利用原始訓練數據訓練若干基學習器,再將其預測結果作為新的訓練集,訓練一個新的元學習器,最后由元學習器輸出最終結果。一個基本的兩層Stacking算法流程如圖1所示。

Fig.1 Two-layer Stacking model圖1 兩層Stacking模型
對于Stacking算法,學習器的選擇也是至關重要的一步,選擇合適的基學習器和元學習器才能最大程度地發揮取長補短的效果。一般而言,學習器的選擇有以下幾點需要注意:①各學習器的預測效果要接近且較為優秀;②各學習器要保持一定差異性;③元學習器一般選擇穩定性較好的簡單模型。
對于銷售預測而言,往往要在較短的時間內為商店的大量產品生成預測。傳統的時間序列模型往往需要掌握統計學知識才能應用于實踐,而且同時對大量時間序列建模需要耗費巨大精力,這對于中小企業的商業應用是一個難點。因此,首先選擇Prophet時間序列算法作為基學習器進行預測,該算法無需構造特征,就能夠對時間序列作出較好的預測,且可以通過編程實現大量商品的自動化預測。但Prophet算法的缺點也很明顯,它無法對數據中的非線性特征進行利用。因此,可以通過Stacking算法融合其他模型以克服Prophet算法的缺點。
綜合考慮以上幾點,選擇隨機森林、BP神經網絡、Prophet時間序列預測算法作為基學習器,其中隨機森林算法采用Bagging的集成學習方式,泛化能力較強、模型調參方便,在實際應用中取得良好效果。BP神經網絡算法能夠捕捉到時間序列中的非線性因素和趨勢,預測準確率高。3種異質算法的差異性保障了元學習器的的改善空間,使得模型的整體預測性能更加優異。第二層的元學習器選擇線性回歸Linear Regression,以確保穩定性和泛化性能。
1.3.1 模型構成及解釋
Prophet模型將預測序列分解為3個主要組成部分:趨勢、季節性和節假日。它們按式(1)進行組合。

g
(t
)為趨勢項,用于擬合時間序列中的分段線性增長或邏輯增長等非周期性變化。其表達式如式(2)所示。
C
代表容量,k
代表模型的增長率,b
代表偏移量。s
(t
)表示周期項,一般以周或者年為單位,具體表達式如式(3)所示。
T
代表周期,N
表示周期個數,n
表示周期,a
和b
均為學習參數。h(t
)表示時間序列中具有非固定周期的節假日或重大事件時間節點對預測值造成的影響,用戶可以手動輸入。
D
為節日集合,Z
(t
)為指示函數,k表示節假日對預測的影響,ε
為誤差項,表示未在模型中體現的異常變動。隨機森林基于Bagging算法對多棵決策樹進行集成,每一棵決策樹訓練樣本都由隨機采樣獲得,且所選擇的特征也是隨機的,這使得隨機森林不容易陷入過擬合,最后組合大量決策樹的預測結果并將其作為一個整體輸出。隨機森林算法使用重采樣技術,每棵決策樹的分類性能都是獨立的,可以采取并行學習方式,使得算法訓練時間短,能夠有效地運行在大數據集上。
神經網絡是機器學習中比較常用的模型,由于其強大的學習能力和非線性建模能力,而被廣泛應用于時間序列預測中。而BP神經網絡是一種多層前饋神經網絡,一般由3部分組成:輸入層、隱含層、輸出層,每層神經元與下一層神經元全互連。在加入了激活函數之后,提高了神經網絡對模型的表達能力,不再是輸入的線性組合,而是幾乎可以逼近任意函數。訓練時首先由輸入變量進行正向傳播計算,再通過誤差反向傳播對網絡的各連接權值進行修正。一個簡單的三層BP神經網絡結構如圖2所示。

Fig.2 Three-layer BPneural network圖2 三層BP神經網絡結構
機器學習模型除有許多需要在訓練過程中優化的參數外,還有大量在訓練前需要人為調節的超參數。在實際應用中,一般通過交叉驗證和網格搜索調節超參數。對于時間序列預測,傳統的交叉驗證方法可能會造成用未來數據預測當前數據的情況,不僅存在數據泄露問題,而且這樣的預測也沒有現實意義。因此,本文采用日向前鏈(Day Forward Chaining)的交叉驗證方式,用前面的數據進行訓練,后面的數據進行驗證,逐步推進的方式避免了數據泄露問題,真實模擬時間序列的前后關系。日向前鏈交叉驗證如圖3所示。對于Prophet模型,不同商品的時間序列不同,需要為每一個商店—商品組合分別進行建模預測。因此,將測試集中商店—商品組合的歷史銷售情況組成時間序列作為訓練集訓練Prophet模型,輸出預測結果。

Fig.3 Day forward chaining cross validation圖3 日向前鏈交叉驗證
預測方法整體流程大致如下:①對原始數據進行預處理后,利用特征工程構成新的特征集合,利用相關性分析進行特征選擇,刪除冗余特征;②劃分原始數據集,使用3次日向前鏈的交叉驗證方式,對隨機森林模型和BP神經網絡模型進行訓練和超參數調優,對于Prophet模型,利用商品的歷史銷售額作為訓練集直接進行訓練;③各基學習器分別在驗證集和測試集上輸出預測結果,分別作為元學習器的訓練集和測試集;④對新生成的數據集進行數據標準化處理,對元學習器進行訓練,并在測試集上輸出預測結果。
本文基于Stacking框架的銷售預測流程如圖4所示。
本文模型采用Python的scikit-learn包加以實現。實驗在矩池云云平臺與Python3.7環境下完成,實驗環境為Intel(R)Xeon(R)CPU E5-2678 v3@2.50GHz,8GB RAM設備。實驗數據來源于kaggle數據科學平臺上公開的商店商品需求預測競賽。實驗數據包含10家店鋪在2013-2017年的商品銷售數據,共計913 000條數據,由于數據已經過處理,并不存在缺失值和異常值,因此無需進行數據清洗。預測目標是2017年7月至12月10件商品的月銷售數據。為全面衡量預測模型的準確性,同時考慮以下3個評價指標:
(1)RMSE均方根誤差,如式(8)所示。

(2)MAE平均絕對誤差,如式(9)所示。

Fig.4 Flow of Stacking framework圖4 Stacking框架流程

(3)MAPE平均絕對百分比誤差,如式(10)所示。

y
^為預測值,預測指標越小表示預測得越準確。3個預測指標越小,說明模型性能越好。對于機器學習任務而言,特征工程是構造有效預測模型的必經之路。合理的特征工程能夠減少冗余特征,去除數據噪音,對模型效果的改善起重要作用,同時還能減少模型訓練時間。
3.1.1 特征構造
原始數據僅包含商品類別(item)、商店標識(store),以及日期(data)和銷量(sales),涵蓋的信息量較少,要使模型預測性能達到最佳,必須從原始數據中挖掘出更多的有用信息。將日期分解為年、月、周,并且增加從0開始的月份數,便于模型挖掘出更多的非線性趨勢。在銷售預測中,當期銷售情況往往與歷史銷售額有緊密聯系,因此還構造了商品的月平均銷售作為新特征,使各機器學習模型可以準確地學習到銷售數據的時序特性,從而作出準確預測。因為要預測6個月的銷售額,為避免數據泄露,商品的月平均銷售采取前半年以及一年前的數據作為滯后值。
機器學習的特征并不是越多越好,特征過多時,可能包含了許多嘈雜的無關特征,影響模型性能發揮,并且增大了計算量。此時需要對特征進行選擇,刪去冗余特征,主要目的是減少特征數量以提高模型性能,并且能夠減少模型計算量。采用Pearson相關系數查看各特征之間的相關性,其結果如圖5所示。可以發現,年份和月份數的相關性很高,相關性高的特征可能存在冗余信息,因此刪去其中一個。此外,月銷售額的滯后值與預測目標存在較高的相關性,這說明數據存在較強的線性特征,可能存在一定的周期性,這有利于基于時間序列模型進行預測。預測目標與其他特征之間的相關性不高,均未達到0.5,說明各特征與銷量之間存在復雜的非線性關系,時間序列模型無法挖掘這部分信息,可以通過融合BP神經網絡和隨機森林算法提升預測性能。
在特征構造與特征選擇的基礎上,為保證Stacking算法發揮最佳性能,需要對基學習器的超參數進行調整優化。
首先采用日向前鏈的交叉驗證方法與網格搜索對隨機森林和BP神經網絡模型進行超參數優化。完成數據集劃分后,利用訓練集訓練模型,在驗證集上評估模型性能,以選取模型的超參數。同時,考慮計算量和預測準確率,僅對幾個核心參數進行優化調參。對于Prophet模型,需要輸入商品的歷史銷售數據作為時間序列,需要對每個商品分別進行建模預測,如果對每個預測模型都手動調參,則需要耗費巨大的時間和精力,因此只采用默認參數進行預測,設置預測的頻率為月。模型超參數如表1所示。

Table1 Corepara meters of models表1 模型核心參數

Fig.5 Correlation of features圖5 特征相關性
完成各模型的超參數調優后,重新訓練模型,分別在驗證集和測試集上輸出預測結果,作為Stacking模型第二層元學習器的訓練集和測試集。用新的數據集對元學習器進行訓練,輸出最后結果。根據預測的評價指標,各單模型和Stacking模型的最終預測效果如表2所示。

Table 2 Index of prediction ability of model表2 各模型預測能力指標
為了更直觀地表現模型預測效果,隨機挑選其中一件商品將各單模型和Stacking模型的預測效果進行比較,結果如圖6所示。
從表2可以看出,隨機森林模型的預測效果最差,在單模型中各項指標均存在較大誤差,一方面是由于隨機森林在解決回歸問題上的表現沒有分類問題上的優秀,它無法給出連續的輸出;另一方面是實驗數據維度較低,隨機森林無法挖掘出有效信息。Prophet算法表現良好,這是由于數據存在明顯的周期性,算法能夠有效擬合線性趨勢,因此作出誤差較低的預測。BP神經網絡在單模型中的表現最好,MAPE僅為3%,這表明商品銷售和特征的關系趨近于更復雜的非線性關系,也說明本文構造的歷史均值特征有助于模型作出更好的預測。Stacking模型的各項預測指標都為最低值,相較于表現最差的隨機森林模型,預測誤差下降約1.42%,這表明該模型充分吸收了3個基學習器的優點,作出了更好的預測。結合圖6可知,雖然Stacking模型和各單模型的誤差相差并不大,但在單個商品預測上表現仍然更接近實際銷售額。在企業的實際生產運作中,每提高1%的精度都能為企業降低大量安全庫存,減少生產成本,提高企業核心競爭力。

Fig.6 Comparison of prediction results of models圖6 各模型預測效果
本文對機器學習算法在銷售預測中的應用進行了研究,在隨機森林、BP神經網絡等解決回歸問題的經典算法基礎上通過Stacking算法融合了先進的Prophet時間序列預測算法,利用kaggle數據科學平臺上公開的銷售預測數據進行實驗,結果表明該模型在銷售預測中有一定應用價值。
本文引入的Stacking算法在銷售預測實驗中表現出一定的有效性,但仍存在諸多不足,后續待進一步探索和解決的問題包括:①在學習器選擇上,并未考慮其他算法,元學習器選擇了較為簡單穩定的線性回歸,未來可考慮選擇更多的基學習器和更復雜先進的元學習以實現模型更好的表現;②商品銷售的影響因素有很多,例如點擊量、評論數、折扣等,本文并未考慮較多的影響因素,將來可以從這些方面考慮構造特征,挖掘更多信息;③本文所用的數據集較小,并未采取并行化的策略,在現實商業場景中可能會遇到大數據情況。Stacking模型運算量大、運行時間久,未來研究中有必要通過采取分布式計算方法提高效率。