吳娟娟,任 帥,張衛(wèi)鋼,伍 菁,李香云
(長(zhǎng)安大學(xué) 信息工程學(xué)院,陜西 西安 710064)
零售商店日銷售額預(yù)測(cè)是從已有的日銷售額資料中總結(jié)出商品的日銷售額規(guī)律,并且用此規(guī)律動(dòng)態(tài)預(yù)測(cè)未來一段時(shí)間內(nèi)的日銷售額,從而指導(dǎo)未來的銷售方法或手段,提高銷量,獲取更大利潤(rùn)。日銷售額的分析是一個(gè)復(fù)雜且不規(guī)則的非線性系統(tǒng)。重點(diǎn)分析并且找到影響商品銷售額的一些主要因素。但由于新產(chǎn)品的開發(fā)、季節(jié)性變換、促銷活動(dòng)、節(jié)假日、天氣及政策的變化等各種原因,傳統(tǒng)分析方法的準(zhǔn)確性在一定程度上受到很大質(zhì)疑。因此,希望建立一個(gè)非線性系統(tǒng),其參數(shù)可以隨預(yù)測(cè)環(huán)境的變化而變化,從而克服該缺點(diǎn)。
為了得到更精準(zhǔn)的預(yù)測(cè)結(jié)果,許多學(xué)者根據(jù)市場(chǎng)的調(diào)研和研究,運(yùn)用多種方法針對(duì)已有的數(shù)據(jù)進(jìn)行分析和對(duì)比[1]。比如:Xgboost單模型[2]、指數(shù)平滑法、ARIMA模型和GARCH模型等[3-4]。但是Xgboost單模型采用預(yù)排序,在迭代之前,對(duì)節(jié)點(diǎn)的特征做預(yù)排序,遍歷選擇最優(yōu)分割點(diǎn),數(shù)據(jù)量大時(shí),貪心法耗時(shí),數(shù)據(jù)分割的復(fù)雜度高;指數(shù)平滑法精確率不高;ARIMA模型對(duì)于趨勢(shì)性較強(qiáng)的數(shù)據(jù)集預(yù)測(cè)效果比較好,但如果遇到趨勢(shì)不那么強(qiáng)的數(shù)據(jù)集,則效果不太理想;對(duì)于非對(duì)稱現(xiàn)象,GARCH模型無法解釋該現(xiàn)象,為了保證其非負(fù)性,假設(shè)模型表達(dá)式中的全部系數(shù)都大于零,這些約束中所隱含的任何一個(gè)滯后項(xiàng)的增大將會(huì)增加因而排除了的隨機(jī)波動(dòng)行為,導(dǎo)致在估計(jì)該模型時(shí)有可能會(huì)出現(xiàn)震蕩現(xiàn)象;LSTM模型[5]避免了長(zhǎng)期依賴問題,采用特殊隱式單元,在繼承了大部分RNN模型特性的同時(shí)解決了梯度反傳過程中[6]由于逐步縮減而產(chǎn)生的Vanishing Gradient問題[7],適用于非線性回歸變量,可以解決多個(gè)輸入變量的問題,模型準(zhǔn)確度高,訓(xùn)練速度快,并行處理能力強(qiáng)。LSTM更適合用于處理與短期時(shí)間序列高度相關(guān)的問題,在n個(gè)示例批次中不斷迭代,能夠快速和準(zhǔn)確地對(duì)大量短期時(shí)間序列數(shù)據(jù)進(jìn)行處理,是解決時(shí)間序列預(yù)測(cè)問題最常用的工具。
針對(duì)大數(shù)量級(jí)的序列預(yù)測(cè),文中建立了一種Tensorflow框架下基于記憶機(jī)理的LSTM模型。以預(yù)測(cè)值和實(shí)際值的誤差為優(yōu)化目標(biāo),從網(wǎng)絡(luò)結(jié)構(gòu)的搭建,學(xué)習(xí)率、窗口設(shè)置上改進(jìn)網(wǎng)絡(luò)模型預(yù)測(cè)的準(zhǔn)確性,采用RMSProps算法修正模型自適應(yīng)率。最后,應(yīng)用銷售額數(shù)據(jù)進(jìn)行驗(yàn)證,并與傳統(tǒng)時(shí)間序列預(yù)測(cè)模型進(jìn)行對(duì)比,實(shí)驗(yàn)結(jié)果表明建立的LSTM模型在銷售額預(yù)測(cè)上具有良好的優(yōu)越性。
LSTM是一種改進(jìn)的RNN,比一般的RNN能夠記住更長(zhǎng)周期上的信息模式,在解決很多問題上都取得了成功,例如自然語言處理、中文文本分類研究、機(jī)器翻譯等。
目前為止,實(shí)際應(yīng)用中最有效的序列模型為門控RNN(gate RNN),包括基于長(zhǎng)短期記憶網(wǎng)絡(luò)(long short-term memory)和基于門控循環(huán)單元(gate recurrent unit)的網(wǎng)絡(luò)。LSTM網(wǎng)絡(luò)比一般的RNN結(jié)構(gòu)更適于長(zhǎng)期依賴,在序列處理問題上獲得很好的表現(xiàn)[8]。LSTM結(jié)構(gòu)如圖1所示。
圖1 LSTM結(jié)構(gòu)
Input gates:
(1)
Forget gates:
(2)
Cells:
(3)
(4)
Output gates:
Cell outputs:
(6)
(7)
Cell outputs:
(8)
Output gates:
(9)
States:
(10)
Cells:
(11)
Forget gates:
(12)
Input gates:
(13)
式(8)中g(shù)和前向傳播中的h含義相同,即泛指,由于它不一定只能輸出到下一個(gè)時(shí)間的自身,或許還會(huì)輸出到下一個(gè)時(shí)間其他的隱層。
大多數(shù)深度學(xué)習(xí)算法通常以最小化代價(jià)函數(shù)、損失函數(shù)(loss)或誤差函數(shù)J(θ)作為優(yōu)化目標(biāo)。J(θ)用來描述預(yù)測(cè)值和真實(shí)值的偏離程度,文中指的是均方根值。優(yōu)化可以分成兩個(gè)階段,第一階段是使用前向傳播算法計(jì)算得到預(yù)測(cè)值,再將預(yù)測(cè)值與真實(shí)值比較得到它們之間的差距;第二階段使用反向傳播算法,計(jì)算出損失函數(shù)對(duì)所有參數(shù)的梯度,然后按照梯度和學(xué)習(xí)率(learning rate)利用梯度下降法(gradient decent)更新每一個(gè)參數(shù)。假設(shè)θ表示神經(jīng)網(wǎng)絡(luò)參數(shù),優(yōu)化過程可看作迭代更新并尋找一個(gè)參數(shù)θ,使得J(θ)最小。
梯度下降的計(jì)算過程指沿著梯度下降的方向求解極小值,迭代公式為:
x*=argminf(x)
(14)
梯度下降的計(jì)算過程指沿著梯度下降的方向求解極小值,迭代公式為:
xt+1=xt+ηg
(15)
其中,g表示梯度負(fù)方向,η表示梯度方向上的搜索步長(zhǎng),在LSTM中表示為學(xué)習(xí)率。學(xué)習(xí)率太大容易導(dǎo)致發(fā)散,太小收斂速度太慢,對(duì)模型精度起著至關(guān)重要的作用。
梯度下降法要在全部訓(xùn)練數(shù)據(jù)上最小化損失,當(dāng)樣本容量非常大或是迭代次數(shù)加大時(shí)會(huì)非常消耗計(jì)算資源。隨機(jī)梯度下降(stochastic gradient descent,SGD)優(yōu)化損失函數(shù),按照數(shù)據(jù)生成分布抽取m個(gè)小批量(獨(dú)立同分布的)樣本,每一次迭代只計(jì)算一個(gè)樣本的loss,然后再遍歷所有的小批量樣本,進(jìn)行一輪完整的計(jì)算。再計(jì)算其梯度的均值,最后獲得梯度的無偏估計(jì),更新如下所示:
隨機(jī)梯度下降算法在第k個(gè)訓(xùn)練迭代的更新方法
輸入?yún)?shù):學(xué)習(xí)率η
輸入?yún)?shù):初始參數(shù)θ
While 滿足do,則停止
從訓(xùn)練數(shù)據(jù)集中采集m個(gè)小批量樣本{x(1),x(2),…,x(m)},xt對(duì)應(yīng)輸出目標(biāo)yt
End while
SGD算法中關(guān)鍵的參數(shù)是學(xué)習(xí)率,在LSTM應(yīng)用中會(huì)隨著時(shí)間的推移逐漸改變學(xué)習(xí)率。
學(xué)習(xí)率對(duì)模型的性能有顯著的影響,決定了參數(shù)移動(dòng)到最優(yōu)值的速度。若幅度過大,會(huì)導(dǎo)致參數(shù)可能越過最優(yōu)值;幅度過小,容易引起運(yùn)算冗余,導(dǎo)致長(zhǎng)時(shí)間運(yùn)算無法收斂。目前常用的學(xué)習(xí)率算法有AdaGrad[9]、RMSProp[10]、Adam[11]等。Schaul[12]展示了許多算法在大量學(xué)習(xí)任務(wù)上極具價(jià)值的比較。有結(jié)果表明,RMSProp和AdaDelta算法表現(xiàn)都相當(dāng)良好。文中使用如下方法改變學(xué)習(xí)率:
RMSProp算法
輸入?yún)?shù):全局學(xué)習(xí)率η,衰減速率ρ
輸入?yún)?shù):初始化參數(shù)θ,初始化累積變量γ=0
While滿足do,則停止
從訓(xùn)練數(shù)據(jù)集中采集m個(gè)小批量樣本{x(1),x(2),…,x(m)},xt對(duì)應(yīng)輸出目標(biāo)yt
累積梯度:γ=ργ+(1-ρ)g⊙g
應(yīng)用更新:θ←θ+Δθ
End while
RMSprop是一種自適應(yīng)學(xué)習(xí)率方法,通過自動(dòng)調(diào)整學(xué)習(xí)率,從而改變更新方式。
深度學(xué)習(xí)算法中使用超參數(shù)來控制計(jì)算,選擇超參數(shù)有兩種方法:手動(dòng)選擇和自動(dòng)選擇。手動(dòng)選擇超參數(shù)的主要目標(biāo)是調(diào)整模型的有效容量以匹配任務(wù)的復(fù)雜性。但手動(dòng)選擇需要了解超參數(shù)、泛化誤差、訓(xùn)練誤差和計(jì)算環(huán)境等問題,高度依賴平臺(tái)。自動(dòng)選擇超參數(shù)算法不需要制定學(xué)習(xí)算法的超參數(shù),常見的有網(wǎng)格搜索、隨機(jī)搜索。
LSTM預(yù)測(cè)模型中包含很多參數(shù),其中以學(xué)習(xí)率、分割窗口、狀態(tài)向量大小最為關(guān)鍵。將這些超參數(shù)笛卡爾乘積得到一組超級(jí)參數(shù)。Bernoulli and Bengio[13]對(duì)比了網(wǎng)格搜索和隨機(jī)搜索,發(fā)現(xiàn)隨機(jī)搜索能更快地減小驗(yàn)證誤差。
文中采用基于TensorFlow[14-15]的LSTM模型的零售商店日銷售額預(yù)測(cè)方法,建立的預(yù)測(cè)模型可以預(yù)測(cè)某大型連鎖零售商店未來7天的日銷售額,預(yù)測(cè)的基本步驟如圖2所示。
圖2 基本步驟
(1)確定預(yù)測(cè)目標(biāo)。
根據(jù)相關(guān)業(yè)務(wù)背景分析原始數(shù)據(jù)源,預(yù)測(cè)未來7天的日銷售額情況。
(2)數(shù)據(jù)收集、探索及預(yù)處理。
實(shí)驗(yàn)使用的數(shù)據(jù)是某大型連鎖零售商店在2018年1月1日至2018年6月30日的銷售數(shù)據(jù)(數(shù)據(jù)有缺失),共267家店,每家店181條數(shù)據(jù)。分析各個(gè)因素與銷售額的關(guān)系,找出影響因變量的自變量,包括內(nèi)部數(shù)據(jù)、外部數(shù)據(jù)以及額外數(shù)據(jù)。由于原始數(shù)據(jù)源并非完整的數(shù)據(jù)源,其中會(huì)出現(xiàn)缺省值或者異常值這些噪聲數(shù)據(jù),所以需要對(duì)缺省值和異常值進(jìn)行處理,補(bǔ)全有效數(shù)據(jù)源,然后對(duì)數(shù)據(jù)進(jìn)行離散化、歸一化處理。以1000011店為例,處理得到的部分?jǐn)?shù)據(jù)如表1所示。
表1 銷售額數(shù)據(jù)
其中,gid表示商店ID,共267家(181條數(shù)據(jù));fildate表示銷售時(shí)間;d(dayofweek)表示當(dāng)天處于周幾;voc表示國(guó)家法定節(jié)假日;w(weather)表示天氣(100-晴,010-雨,001-雪)。
文中利用天氣、處在周幾以及是否為節(jié)假日等特征因素來分析對(duì)銷售額的影響,根據(jù)特征建立模型實(shí)現(xiàn)對(duì)銷售額的預(yù)測(cè)。
(3)應(yīng)用建模。
首先,將數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集;其次,對(duì)于訓(xùn)練集做特征篩選,提取有信息量的特征變量,并且去掉無信息量等的干擾特征變量;最后,應(yīng)用算法建立LSTM模型后,結(jié)合測(cè)試集對(duì)算法模型的輸出參數(shù)進(jìn)行優(yōu)化,提高泛化能力,從而提高預(yù)測(cè)精度,得到最終的訓(xùn)練模型。
(4)評(píng)價(jià)指標(biāo)。
預(yù)測(cè)回歸類模型精度常用的評(píng)價(jià)方法[16]有RMSE(root mean squared error,均方根誤差)、MAPE(mean absolute percentage error,平均絕對(duì)百分比誤差)、MAE(mean absolute error,MAE)和MPE(mean percentage error,平均百分比誤差)。文中將選取MAPE和MAE作為衡量標(biāo)準(zhǔn),MAPE的大小用來衡量一個(gè)模型預(yù)測(cè)結(jié)果的好壞,MAPE的值越小,則模型的預(yù)測(cè)結(jié)果越好,MAE的值更好地反映了預(yù)測(cè)值誤差的實(shí)際情況,MAE的值越小,模型預(yù)測(cè)的誤差越小。
分別采用LSTM和Xgboost對(duì)1001281店2018年6月24日—2018年6月30日的每日銷售額進(jìn)行預(yù)測(cè),LSTM和Xgboost的預(yù)測(cè)結(jié)果如圖3所示。文中采用絕對(duì)百分誤差[17]和平均絕對(duì)誤差[18]作為最終算法質(zhì)量的衡量標(biāo)準(zhǔn),MAPE和MAE越低則表明算法誤差越小,公式如下:
(16)
(17)
圖3 LSTM、Xgboost一周日銷售額預(yù)測(cè)結(jié)果
LSTM和Xgboost零售商店日銷售額預(yù)測(cè)模型的預(yù)測(cè)性能指標(biāo)如表2所示。
表2 兩種方法的預(yù)測(cè)性能指標(biāo)
可見,無論是MAPE還是MAE,LSTM模型的預(yù)測(cè)效果都稍優(yōu)于Xgboost。
文中基于TensorFlow框架建立了LSTM模型并預(yù)測(cè)了商品銷售額,然后與Xgboost模型的預(yù)測(cè)結(jié)果進(jìn)行了比較。在保證參數(shù)調(diào)優(yōu)的情況下,根據(jù)MAPE和MAE評(píng)價(jià)標(biāo)準(zhǔn),對(duì)比二者的預(yù)測(cè)結(jié)果,發(fā)現(xiàn)LSTM模型的MAPE為0.031 932,MAE為168.320 7,而Xgboost模型的MAPE為0.056 097,MAE為251.710 8。結(jié)果表明,LSTM模型的準(zhǔn)確性更好,用其預(yù)測(cè)商品的銷售額是可行的。該方法具有較高的實(shí)用價(jià)值。但實(shí)際商品銷售往往受到政治、經(jīng)濟(jì)、文化等多種因素的影響,用該方法預(yù)測(cè)仍存在不足,如何對(duì)各種因素進(jìn)行取舍,將是今后努力的方向。