尤璞,劉星甫
(江南大學(xué)商學(xué)院,江蘇無錫 214122)
需求預(yù)測在各行各業(yè)都有著重要作用,準(zhǔn)確的需求預(yù)測能讓管理者合理安排訂貨時(shí)間、生產(chǎn)計(jì)劃等環(huán)節(jié),減少庫存成本和缺貨損失,提升企業(yè)核心競爭力。但由于需求變化多樣,掌握市場需求動態(tài),作出準(zhǔn)確的銷售預(yù)測,是一項(xiàng)巨大的挑戰(zhàn)。目前,國內(nèi)外的許多學(xué)者對銷量預(yù)測做了大量研究,采用的方法主要是時(shí)間序列預(yù)測技術(shù)和以大數(shù)據(jù)技術(shù)為支撐的機(jī)器學(xué)習(xí)預(yù)測技術(shù)。時(shí)間序列模型是比較常見的預(yù)測模型,許多學(xué)者對時(shí)間序列模型進(jìn)行改進(jìn)或者對不同模型進(jìn)行組合,取得了較好的預(yù)測效果。時(shí)間序列模型在假設(shè)需求是一種線性變化趨勢的基礎(chǔ)上對下一階段的需求進(jìn)行預(yù)測,其操作簡單、容易實(shí)現(xiàn),如果歷史銷售數(shù)據(jù)的趨勢性較強(qiáng),就能夠較好地?cái)M合數(shù)據(jù)。但是傳統(tǒng)時(shí)間序列模型的缺點(diǎn)也很明顯,它要求時(shí)序數(shù)據(jù)穩(wěn)定,無法對復(fù)雜的非線性系統(tǒng)進(jìn)行有效擬合,且容易發(fā)生多重共線性,導(dǎo)致預(yù)測不準(zhǔn)確。
近年來,得益于互聯(lián)網(wǎng)技術(shù)的快速發(fā)展和物流服務(wù)水平的不斷提升,運(yùn)用數(shù)據(jù)挖掘技術(shù)和機(jī)器學(xué)習(xí)算法等解決銷量預(yù)測問題也成為研究熱點(diǎn)。Loureiro等發(fā)現(xiàn)采用深度學(xué)習(xí)模型在預(yù)測時(shí)尚零售市場的銷售方面具有良好性能;吳娟娟等針對大數(shù)量級的序列預(yù)測,提出基于記憶機(jī)理的LSTM模型并用銷售額數(shù)據(jù)進(jìn)行驗(yàn)證,實(shí)驗(yàn)結(jié)果表明LSTM模型表現(xiàn)優(yōu)于傳統(tǒng)時(shí)間序列模型。相較于時(shí)間序列模型,機(jī)器學(xué)習(xí)模型可以更好地估計(jì)高維數(shù)據(jù)集,把握住需求變化中的非線性因素,作出更準(zhǔn)確的預(yù)測。為進(jìn)一步提升模型性能,一些機(jī)器學(xué)習(xí)技術(shù)的組合模型也應(yīng)用于銷售預(yù)測。通過組合多個(gè)模型,單個(gè)模型的預(yù)測誤差可以被其他模型所彌補(bǔ),因此可以獲得更好的預(yù)測效果。
上述研究雖然嘗試通過多種方法預(yù)測銷量,但至今沒有主導(dǎo)的預(yù)測技術(shù)。對于企業(yè)管理者而言,如何從多種預(yù)測技術(shù)中作出選擇也是一個(gè)難題。傳統(tǒng)的時(shí)間序列方法需要掌握一定的統(tǒng)計(jì)學(xué)知識才能熟練運(yùn)用,且往往受限于固定的模型框架和較為嚴(yán)格的假設(shè)條件,對于需要快速響應(yīng)的商業(yè)環(huán)境并不適用。而許多機(jī)器學(xué)習(xí)方法應(yīng)用于銷售預(yù)測時(shí),過于依賴歷史數(shù)據(jù),需要預(yù)訓(xùn)練大量數(shù)據(jù)才能達(dá)到良好的預(yù)測效果。此外,對于時(shí)間序列數(shù)據(jù),在驗(yàn)證模型時(shí),常規(guī)的交叉驗(yàn)證可能會造成數(shù)據(jù)泄露問題,影響模型在測試集上的表現(xiàn)。
針對銷售預(yù)測研究現(xiàn)狀,本文提出一種基于Stacking集成策略的銷售預(yù)測方法,將Prophet算法和隨機(jī)森林、BP神經(jīng)網(wǎng)絡(luò)作為基學(xué)習(xí)器構(gòu)建Stacking預(yù)測模型。該算法充分考慮了不同模型的差異性,使得不同算法的優(yōu)勢得以結(jié)合,利用時(shí)間序列預(yù)測算法,即Prophet算法對數(shù)據(jù)的周期性進(jìn)行擬合,再通過Stacking算法融合隨機(jī)森林和BP神經(jīng)網(wǎng)絡(luò)對數(shù)據(jù)的非線性進(jìn)行擬合,通過3種異質(zhì)算法的融合取長補(bǔ)短。同時(shí),將歷史銷售數(shù)據(jù)作為新特征,給數(shù)據(jù)加入了時(shí)序性,并采用日向前鏈的交叉驗(yàn)證方法,避免了數(shù)據(jù)泄露,提升了預(yù)測效果,取得了比單個(gè)模型更好的預(yù)測性能。
Stacking算法是一種模型融合算法,通過融合不同的算法增強(qiáng)模型泛化性能,減少預(yù)測誤差。Stacking算法首先利用原始訓(xùn)練數(shù)據(jù)訓(xùn)練若干基學(xué)習(xí)器,再將其預(yù)測結(jié)果作為新的訓(xùn)練集,訓(xùn)練一個(gè)新的元學(xué)習(xí)器,最后由元學(xué)習(xí)器輸出最終結(jié)果。一個(gè)基本的兩層Stacking算法流程如圖1所示。
Fig.1 Two-layer Stacking model圖1 兩層Stacking模型
對于Stacking算法,學(xué)習(xí)器的選擇也是至關(guān)重要的一步,選擇合適的基學(xué)習(xí)器和元學(xué)習(xí)器才能最大程度地發(fā)揮取長補(bǔ)短的效果。一般而言,學(xué)習(xí)器的選擇有以下幾點(diǎn)需要注意:①各學(xué)習(xí)器的預(yù)測效果要接近且較為優(yōu)秀;②各學(xué)習(xí)器要保持一定差異性;③元學(xué)習(xí)器一般選擇穩(wěn)定性較好的簡單模型。
對于銷售預(yù)測而言,往往要在較短的時(shí)間內(nèi)為商店的大量產(chǎn)品生成預(yù)測。傳統(tǒng)的時(shí)間序列模型往往需要掌握統(tǒng)計(jì)學(xué)知識才能應(yīng)用于實(shí)踐,而且同時(shí)對大量時(shí)間序列建模需要耗費(fèi)巨大精力,這對于中小企業(yè)的商業(yè)應(yīng)用是一個(gè)難點(diǎn)。因此,首先選擇Prophet時(shí)間序列算法作為基學(xué)習(xí)器進(jìn)行預(yù)測,該算法無需構(gòu)造特征,就能夠?qū)r(shí)間序列作出較好的預(yù)測,且可以通過編程實(shí)現(xiàn)大量商品的自動化預(yù)測。但Prophet算法的缺點(diǎn)也很明顯,它無法對數(shù)據(jù)中的非線性特征進(jìn)行利用。因此,可以通過Stacking算法融合其他模型以克服Prophet算法的缺點(diǎn)。
綜合考慮以上幾點(diǎn),選擇隨機(jī)森林、BP神經(jīng)網(wǎng)絡(luò)、Prophet時(shí)間序列預(yù)測算法作為基學(xué)習(xí)器,其中隨機(jī)森林算法采用Bagging的集成學(xué)習(xí)方式,泛化能力較強(qiáng)、模型調(diào)參方便,在實(shí)際應(yīng)用中取得良好效果。BP神經(jīng)網(wǎng)絡(luò)算法能夠捕捉到時(shí)間序列中的非線性因素和趨勢,預(yù)測準(zhǔn)確率高。3種異質(zhì)算法的差異性保障了元學(xué)習(xí)器的的改善空間,使得模型的整體預(yù)測性能更加優(yōu)異。第二層的元學(xué)習(xí)器選擇線性回歸Linear Regression,以確保穩(wěn)定性和泛化性能。
1.3.1 模型構(gòu)成及解釋
Prophet模型將預(yù)測序列分解為3個(gè)主要組成部分:趨勢、季節(jié)性和節(jié)假日。它們按式(1)進(jìn)行組合。
g
(t
)為趨勢項(xiàng),用于擬合時(shí)間序列中的分段線性增長或邏輯增長等非周期性變化。其表達(dá)式如式(2)所示。C
代表容量,k
代表模型的增長率,b
代表偏移量。s
(t
)表示周期項(xiàng),一般以周或者年為單位,具體表達(dá)式如式(3)所示。T
代表周期,N
表示周期個(gè)數(shù),n
表示周期,a
和b
均為學(xué)習(xí)參數(shù)。h(t
)表示時(shí)間序列中具有非固定周期的節(jié)假日或重大事件時(shí)間節(jié)點(diǎn)對預(yù)測值造成的影響,用戶可以手動輸入。D
為節(jié)日集合,Z
(t
)為指示函數(shù),k表示節(jié)假日對預(yù)測的影響,ε
為誤差項(xiàng),表示未在模型中體現(xiàn)的異常變動。隨機(jī)森林基于Bagging算法對多棵決策樹進(jìn)行集成,每一棵決策樹訓(xùn)練樣本都由隨機(jī)采樣獲得,且所選擇的特征也是隨機(jī)的,這使得隨機(jī)森林不容易陷入過擬合,最后組合大量決策樹的預(yù)測結(jié)果并將其作為一個(gè)整體輸出。隨機(jī)森林算法使用重采樣技術(shù),每棵決策樹的分類性能都是獨(dú)立的,可以采取并行學(xué)習(xí)方式,使得算法訓(xùn)練時(shí)間短,能夠有效地運(yùn)行在大數(shù)據(jù)集上。
神經(jīng)網(wǎng)絡(luò)是機(jī)器學(xué)習(xí)中比較常用的模型,由于其強(qiáng)大的學(xué)習(xí)能力和非線性建模能力,而被廣泛應(yīng)用于時(shí)間序列預(yù)測中。而BP神經(jīng)網(wǎng)絡(luò)是一種多層前饋神經(jīng)網(wǎng)絡(luò),一般由3部分組成:輸入層、隱含層、輸出層,每層神經(jīng)元與下一層神經(jīng)元全互連。在加入了激活函數(shù)之后,提高了神經(jīng)網(wǎng)絡(luò)對模型的表達(dá)能力,不再是輸入的線性組合,而是幾乎可以逼近任意函數(shù)。訓(xùn)練時(shí)首先由輸入變量進(jìn)行正向傳播計(jì)算,再通過誤差反向傳播對網(wǎng)絡(luò)的各連接權(quán)值進(jìn)行修正。一個(gè)簡單的三層BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示。
Fig.2 Three-layer BPneural network圖2 三層BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
機(jī)器學(xué)習(xí)模型除有許多需要在訓(xùn)練過程中優(yōu)化的參數(shù)外,還有大量在訓(xùn)練前需要人為調(diào)節(jié)的超參數(shù)。在實(shí)際應(yīng)用中,一般通過交叉驗(yàn)證和網(wǎng)格搜索調(diào)節(jié)超參數(shù)。對于時(shí)間序列預(yù)測,傳統(tǒng)的交叉驗(yàn)證方法可能會造成用未來數(shù)據(jù)預(yù)測當(dāng)前數(shù)據(jù)的情況,不僅存在數(shù)據(jù)泄露問題,而且這樣的預(yù)測也沒有現(xiàn)實(shí)意義。因此,本文采用日向前鏈(Day Forward Chaining)的交叉驗(yàn)證方式,用前面的數(shù)據(jù)進(jìn)行訓(xùn)練,后面的數(shù)據(jù)進(jìn)行驗(yàn)證,逐步推進(jìn)的方式避免了數(shù)據(jù)泄露問題,真實(shí)模擬時(shí)間序列的前后關(guān)系。日向前鏈交叉驗(yàn)證如圖3所示。對于Prophet模型,不同商品的時(shí)間序列不同,需要為每一個(gè)商店—商品組合分別進(jìn)行建模預(yù)測。因此,將測試集中商店—商品組合的歷史銷售情況組成時(shí)間序列作為訓(xùn)練集訓(xùn)練Prophet模型,輸出預(yù)測結(jié)果。
Fig.3 Day forward chaining cross validation圖3 日向前鏈交叉驗(yàn)證
預(yù)測方法整體流程大致如下:①對原始數(shù)據(jù)進(jìn)行預(yù)處理后,利用特征工程構(gòu)成新的特征集合,利用相關(guān)性分析進(jìn)行特征選擇,刪除冗余特征;②劃分原始數(shù)據(jù)集,使用3次日向前鏈的交叉驗(yàn)證方式,對隨機(jī)森林模型和BP神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練和超參數(shù)調(diào)優(yōu),對于Prophet模型,利用商品的歷史銷售額作為訓(xùn)練集直接進(jìn)行訓(xùn)練;③各基學(xué)習(xí)器分別在驗(yàn)證集和測試集上輸出預(yù)測結(jié)果,分別作為元學(xué)習(xí)器的訓(xùn)練集和測試集;④對新生成的數(shù)據(jù)集進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化處理,對元學(xué)習(xí)器進(jìn)行訓(xùn)練,并在測試集上輸出預(yù)測結(jié)果。
本文基于Stacking框架的銷售預(yù)測流程如圖4所示。
本文模型采用Python的scikit-learn包加以實(shí)現(xiàn)。實(shí)驗(yàn)在矩池云云平臺與Python3.7環(huán)境下完成,實(shí)驗(yàn)環(huán)境為Intel(R)Xeon(R)CPU E5-2678 v3@2.50GHz,8GB RAM設(shè)備。實(shí)驗(yàn)數(shù)據(jù)來源于kaggle數(shù)據(jù)科學(xué)平臺上公開的商店商品需求預(yù)測競賽。實(shí)驗(yàn)數(shù)據(jù)包含10家店鋪在2013-2017年的商品銷售數(shù)據(jù),共計(jì)913 000條數(shù)據(jù),由于數(shù)據(jù)已經(jīng)過處理,并不存在缺失值和異常值,因此無需進(jìn)行數(shù)據(jù)清洗。預(yù)測目標(biāo)是2017年7月至12月10件商品的月銷售數(shù)據(jù)。為全面衡量預(yù)測模型的準(zhǔn)確性,同時(shí)考慮以下3個(gè)評價(jià)指標(biāo):
(1)RMSE均方根誤差,如式(8)所示。
(2)MAE平均絕對誤差,如式(9)所示。
Fig.4 Flow of Stacking framework圖4 Stacking框架流程
(3)MAPE平均絕對百分比誤差,如式(10)所示。
y
^為預(yù)測值,預(yù)測指標(biāo)越小表示預(yù)測得越準(zhǔn)確。3個(gè)預(yù)測指標(biāo)越小,說明模型性能越好。對于機(jī)器學(xué)習(xí)任務(wù)而言,特征工程是構(gòu)造有效預(yù)測模型的必經(jīng)之路。合理的特征工程能夠減少冗余特征,去除數(shù)據(jù)噪音,對模型效果的改善起重要作用,同時(shí)還能減少模型訓(xùn)練時(shí)間。
3.1.1 特征構(gòu)造
原始數(shù)據(jù)僅包含商品類別(item)、商店標(biāo)識(store),以及日期(data)和銷量(sales),涵蓋的信息量較少,要使模型預(yù)測性能達(dá)到最佳,必須從原始數(shù)據(jù)中挖掘出更多的有用信息。將日期分解為年、月、周,并且增加從0開始的月份數(shù),便于模型挖掘出更多的非線性趨勢。在銷售預(yù)測中,當(dāng)期銷售情況往往與歷史銷售額有緊密聯(lián)系,因此還構(gòu)造了商品的月平均銷售作為新特征,使各機(jī)器學(xué)習(xí)模型可以準(zhǔn)確地學(xué)習(xí)到銷售數(shù)據(jù)的時(shí)序特性,從而作出準(zhǔn)確預(yù)測。因?yàn)橐A(yù)測6個(gè)月的銷售額,為避免數(shù)據(jù)泄露,商品的月平均銷售采取前半年以及一年前的數(shù)據(jù)作為滯后值。
機(jī)器學(xué)習(xí)的特征并不是越多越好,特征過多時(shí),可能包含了許多嘈雜的無關(guān)特征,影響模型性能發(fā)揮,并且增大了計(jì)算量。此時(shí)需要對特征進(jìn)行選擇,刪去冗余特征,主要目的是減少特征數(shù)量以提高模型性能,并且能夠減少模型計(jì)算量。采用Pearson相關(guān)系數(shù)查看各特征之間的相關(guān)性,其結(jié)果如圖5所示。可以發(fā)現(xiàn),年份和月份數(shù)的相關(guān)性很高,相關(guān)性高的特征可能存在冗余信息,因此刪去其中一個(gè)。此外,月銷售額的滯后值與預(yù)測目標(biāo)存在較高的相關(guān)性,這說明數(shù)據(jù)存在較強(qiáng)的線性特征,可能存在一定的周期性,這有利于基于時(shí)間序列模型進(jìn)行預(yù)測。預(yù)測目標(biāo)與其他特征之間的相關(guān)性不高,均未達(dá)到0.5,說明各特征與銷量之間存在復(fù)雜的非線性關(guān)系,時(shí)間序列模型無法挖掘這部分信息,可以通過融合BP神經(jīng)網(wǎng)絡(luò)和隨機(jī)森林算法提升預(yù)測性能。
在特征構(gòu)造與特征選擇的基礎(chǔ)上,為保證Stacking算法發(fā)揮最佳性能,需要對基學(xué)習(xí)器的超參數(shù)進(jìn)行調(diào)整優(yōu)化。
首先采用日向前鏈的交叉驗(yàn)證方法與網(wǎng)格搜索對隨機(jī)森林和BP神經(jīng)網(wǎng)絡(luò)模型進(jìn)行超參數(shù)優(yōu)化。完成數(shù)據(jù)集劃分后,利用訓(xùn)練集訓(xùn)練模型,在驗(yàn)證集上評估模型性能,以選取模型的超參數(shù)。同時(shí),考慮計(jì)算量和預(yù)測準(zhǔn)確率,僅對幾個(gè)核心參數(shù)進(jìn)行優(yōu)化調(diào)參。對于Prophet模型,需要輸入商品的歷史銷售數(shù)據(jù)作為時(shí)間序列,需要對每個(gè)商品分別進(jìn)行建模預(yù)測,如果對每個(gè)預(yù)測模型都手動調(diào)參,則需要耗費(fèi)巨大的時(shí)間和精力,因此只采用默認(rèn)參數(shù)進(jìn)行預(yù)測,設(shè)置預(yù)測的頻率為月。模型超參數(shù)如表1所示。
Table1 Corepara meters of models表1 模型核心參數(shù)
Fig.5 Correlation of features圖5 特征相關(guān)性
完成各模型的超參數(shù)調(diào)優(yōu)后,重新訓(xùn)練模型,分別在驗(yàn)證集和測試集上輸出預(yù)測結(jié)果,作為Stacking模型第二層元學(xué)習(xí)器的訓(xùn)練集和測試集。用新的數(shù)據(jù)集對元學(xué)習(xí)器進(jìn)行訓(xùn)練,輸出最后結(jié)果。根據(jù)預(yù)測的評價(jià)指標(biāo),各單模型和Stacking模型的最終預(yù)測效果如表2所示。
Table 2 Index of prediction ability of model表2 各模型預(yù)測能力指標(biāo)
為了更直觀地表現(xiàn)模型預(yù)測效果,隨機(jī)挑選其中一件商品將各單模型和Stacking模型的預(yù)測效果進(jìn)行比較,結(jié)果如圖6所示。
從表2可以看出,隨機(jī)森林模型的預(yù)測效果最差,在單模型中各項(xiàng)指標(biāo)均存在較大誤差,一方面是由于隨機(jī)森林在解決回歸問題上的表現(xiàn)沒有分類問題上的優(yōu)秀,它無法給出連續(xù)的輸出;另一方面是實(shí)驗(yàn)數(shù)據(jù)維度較低,隨機(jī)森林無法挖掘出有效信息。Prophet算法表現(xiàn)良好,這是由于數(shù)據(jù)存在明顯的周期性,算法能夠有效擬合線性趨勢,因此作出誤差較低的預(yù)測。BP神經(jīng)網(wǎng)絡(luò)在單模型中的表現(xiàn)最好,MAPE僅為3%,這表明商品銷售和特征的關(guān)系趨近于更復(fù)雜的非線性關(guān)系,也說明本文構(gòu)造的歷史均值特征有助于模型作出更好的預(yù)測。Stacking模型的各項(xiàng)預(yù)測指標(biāo)都為最低值,相較于表現(xiàn)最差的隨機(jī)森林模型,預(yù)測誤差下降約1.42%,這表明該模型充分吸收了3個(gè)基學(xué)習(xí)器的優(yōu)點(diǎn),作出了更好的預(yù)測。結(jié)合圖6可知,雖然Stacking模型和各單模型的誤差相差并不大,但在單個(gè)商品預(yù)測上表現(xiàn)仍然更接近實(shí)際銷售額。在企業(yè)的實(shí)際生產(chǎn)運(yùn)作中,每提高1%的精度都能為企業(yè)降低大量安全庫存,減少生產(chǎn)成本,提高企業(yè)核心競爭力。
Fig.6 Comparison of prediction results of models圖6 各模型預(yù)測效果
本文對機(jī)器學(xué)習(xí)算法在銷售預(yù)測中的應(yīng)用進(jìn)行了研究,在隨機(jī)森林、BP神經(jīng)網(wǎng)絡(luò)等解決回歸問題的經(jīng)典算法基礎(chǔ)上通過Stacking算法融合了先進(jìn)的Prophet時(shí)間序列預(yù)測算法,利用kaggle數(shù)據(jù)科學(xué)平臺上公開的銷售預(yù)測數(shù)據(jù)進(jìn)行實(shí)驗(yàn),結(jié)果表明該模型在銷售預(yù)測中有一定應(yīng)用價(jià)值。
本文引入的Stacking算法在銷售預(yù)測實(shí)驗(yàn)中表現(xiàn)出一定的有效性,但仍存在諸多不足,后續(xù)待進(jìn)一步探索和解決的問題包括:①在學(xué)習(xí)器選擇上,并未考慮其他算法,元學(xué)習(xí)器選擇了較為簡單穩(wěn)定的線性回歸,未來可考慮選擇更多的基學(xué)習(xí)器和更復(fù)雜先進(jìn)的元學(xué)習(xí)以實(shí)現(xiàn)模型更好的表現(xiàn);②商品銷售的影響因素有很多,例如點(diǎn)擊量、評論數(shù)、折扣等,本文并未考慮較多的影響因素,將來可以從這些方面考慮構(gòu)造特征,挖掘更多信息;③本文所用的數(shù)據(jù)集較小,并未采取并行化的策略,在現(xiàn)實(shí)商業(yè)場景中可能會遇到大數(shù)據(jù)情況。Stacking模型運(yùn)算量大、運(yùn)行時(shí)間久,未來研究中有必要通過采取分布式計(jì)算方法提高效率。