洪 峰,潘法昱,趙建翊,高 楠,曹 斌,范 菁(浙江工業大學計算機科學與技術學院,杭州3003)
2(浙江省煙草公司寧波市公司,浙江寧波315000)
E-mail:hongfeng@zjut.edu.cn
煙草行業一直以來是我國經濟發展、財政收入的重要組成部分.煙草行業在堅持專賣制度的前提下,引入了市場競爭機制,形成市場和計劃相結合的模式.現有煙草行業的銷售和市場投放的服務模式是依靠自身經驗和市場反饋的,但是這種模式需要依賴大量的人工參與[1],從工作效率和準確率方面無法得到保證,進而不能很好解決區域性的煙草滯銷、脫銷等現實問題.事實上,面向煙草行業的銷售和投放屬于時間序列預測問題[2],因此本文也將從時序預測出發展開研究.
解決煙草行業的時間序列問題主流的方法是統計方法和機器學習.統計方法如自回歸滑動移動平均模型(ARIMA)[9,14],一種利用擬合的 ARIMA 模型進行聚類的方式,進行時間序列預測,該方法聚類效果好,預測速度快,方法簡潔易行,但是ARIMA模型只能利用一種特征進行時間預測,不能結合其他的特征數據,很難保證預測結果的準確性.在本文算法中結合了煙草銷量數據在內的24維特征數據,給算法預測的準確性提供了保證.在機器學習領域,也有相關方法對上述煙草行業的銷售投放預測問題進行過研究[10,12].其中,一種基于神經網絡算法的PSO-BP混合模型算法用來解決煙草供給預測,利用粒子群中粒子的位置表示神經網絡中當前迭代次數中的權屬集合,訓練過程中產生的誤差作為訓練的適應度,但是往往建立模型時間復雜度高,可解釋性差.還有例如李曉歌[3],謝星峰[4]都提出過利用神經網絡算法解決面向煙草行業的供給預測問題.雖然神經網絡算法能很好地契合煙草數據的非線性特征,以及根據擬合結果進行供給預測,得到預測結果準確性較高.但是它是一個黑盒操作,無法表示輸入數據與預測結果之間的關系;神經網絡的結構難以確定(確定隱含層的節點數);節點數過多,容易使模型在訓練中陷入局部極小值.現階段還有類似于長短時記憶神經網絡模型(LSTM)[20]的深度學習方法,但是此類方法的可解釋性差,本文的算法可以清晰的了解到算法肌理.
綜上考慮,我們提出了一種面向煙草行業的供給預測服務算法.以往算法都是利用回歸的方式進行建模預測,而本文將回歸的形式轉變為用分類的方法去進行預測.該算法首先針對煙草銷量數據進行預處理,包括去除異常值和數據合并.通過去異常值操作,保證算法的輸入數據不會存在因為法定節假日和風俗習慣所引起的異常數據,以及數據合并過程中產生的異常數據.然后利用處理完的數據建立數據集,并取出預測時間歷年前三個月的銷量數據,訓練隨機森林模型,得出銷量數據中每一維特征對于銷量的重要程度指標,然后輸入預測時間前一周的銷量數據,得出下一周的預測銷量.
同時在算法投放量預測模型中,采用比例的形式代替原有投放數量,具體為大類客戶在全體客戶投放量中所占比例,和在某一大類客戶中,各個小類客戶在該大類客戶投放量中所占比例.取出預測時間之前各大類客戶的比例數據,放入ARIMA模型進行訓練,然后輸入當前一周的比例數據,最終得出各個大類預測比例.接著利用在具體某一大類中,各個小類中所占該大類比例,最終得出各個小類在全體客戶投放量中所占比例算法.通過上述步驟,從而完成整個煙草預測服務模型.
本文的主要貢獻如下所示:
1)利用集成學習方法,避免在煙草數據的供給預測中會出現的過擬合現象;
2)在算法中加入了投放量預測模型,完善了供給服務,避免了現實中因投放不合理產生的滯銷、脫銷等問題出現;
3)首次采用了分類的方式,對煙草數據進行時間序列預測;
4)通過實驗對本文算法進行驗證,證明該算法能夠保證較好的準確性.
本節介紹了一系列重要的預備知識,以幫助理解本文算法.其中我們會討論在銷售預測模型中的隨機森林算法,以及在投放預測模型中的ARIMA模型.
隨機森林算法廣泛應用于分類,回歸問題上,是一種集成學習方法[6,7].顧名思義,隨機森林算法可以分為概念,一個是“隨機”,一個是“森林”.“隨機”指的是在訓練集中隨機并且有放回的抽取訓練樣本.若不采用隨機抽樣,算法中每棵決策樹的訓練樣本一樣,那么最終訓練出來的結果也是完全一樣的,那么隨機森林算法與普通決策樹的算法并沒有不同之處,同樣,隨機森林算法也包含了決策樹算法的不足之處[8,11],即過擬合,結果不穩定等問題.
此外,隨機森林算法在訓練樣本抽取是有放回地抽樣.因為訓練樣本僅僅只是通過隨機抽取,而不采取放回的形式,那么每棵樹的訓練樣本都是不同的,彼此之間沒有交集,所以每棵樹進行訓練產生結果存在一定的差異.然而隨機森林算法最后的結果是基于多棵樹的訓練結果,因此只是“片面地”采用不放回抽樣,對于算法而言并沒有益處.
“森林”的概念來源于集成學習方法,算法通過整合眾多決策樹,組成“森林”的形式,即將若干決策樹訓練結果進行投票,最終產生一個最好的訓練結果作為算法輸出.
簡而言之:隨機森林建立了多個決策樹,并將它們合并在一起以獲得更準確和穩定的預測.如圖1所示,當我們需要預測一個特征為x的樣本的值時,隨機森林會將x輸入到每一棵決策樹中,每個決策樹都會輸出一個值.最后對所有值取平均作為隨機森林的預測結果.

圖1 隨機森林模型示意圖Fig.1 Random forest model diagram
ARIMA 模型[9,14],全程自回歸積分滑動平均模型(Autoregressive Integrated Moving Average Model),它包含三個部分,即AR(Auto Regression)自回歸模型,I(Integration)單整數階,以及MA(Moving Average)移動平均模型.
其中需要說明的是:1)AR描述的是時間序列在某一時刻的值與之前時刻的值之間的關系;2)I描述的是時間序列從非平穩序列經差分后轉為平穩序列的計量模型;3)MA(Moving Average)模型描述的是時間序列在當前時刻與前一時刻之間的差值;4)ARIMA實際上是AR和MA模型的組合,它與ARMA模型的區別在于ARMA模型針對平穩時間序列建立的模型,而ARIMA模型則是針對非平穩時間序列建模.
因此,總的來說,ARIMA模型將預測對象隨時間推移而形成的數據序列視為一個隨機序列,然后按照下述3個步驟進行建模:1)將非平穩序列轉化為平穩序列;2)確定模型的形式.即模型屬于AR、MA、ARMA中的哪一種,這主要是通過模型識別來解決的;3)確定變量的滯后階數.通過以上3個步驟,完成ARIMA模型的建模.
本文提出了一種準確高效的預測算法來預測煙草的銷量和投放量.
如圖2所示,算法主要可以分為3個步驟:1)歷史數據預處理;2)建立銷量預測模型;3)建立投放量預測模型.算法通過輸入煙草數據,經預處理后,通過銷量預測模型預測下一周的煙草銷量.數據輸入投放量預測模型中預測下一周各類客戶的投放量.
在現實情況中,數據存在一定的滯后性(本文所用數據出現銷售總量不等于投放量的情況),故對于投放量預測模型中所用數據進行處理,把具體每類客戶的投放量數值改為比例的形式進行替換,如小類客戶在各自大類客戶中所占比例,大類客戶在全體客戶中所占比例.然后把某一類客戶的比例數據放入ARIMA模型中進行訓練,最終預測下一周該類客戶的比例.

圖2 算法流程示意圖Fig.2 Algorithm process diagram
測模型中所使用特征數據是經由煙草局專家挑選出的可能會影響煙草銷量的特征.而上一步驟歷史數據預處理中,對于銷量數據中的特征數據進行刪減,剔除異常數據,并經過數據合并,從而取得新的特征數據.因為本文需要對當前時間煙草銷量進行預測,而無法獲取當前時間的煙草的真實銷量,考慮到煙草數據的季節性變化,本文利用當前時間的前三個月歷史數據作為本文訓練模型的訓練集.

圖3 日銷量箱線圖Fig.3 Daily sales boxplot diagram
主要思想:如圖4所示,我們在數據庫中取出2016、2017年近三個月的數據放入隨機森林模型中進行指標重要程度訓練,得出每一項指標重要程度之后保存該模型.然后在該模型中輸入本周數據,經過該模型訓練之后,最終得出下周預測銷量.

圖4 銷售模型建模示意圖Fig.4 Modeling process for sales diagram
舉例:假設當前時間為5月份,我們在數據庫中取出2016、2017年近三個月(3月,4月,5月)的數據放入隨機森林模型中進行指標重要程度訓練,得出每一項特征的重要程度,并進行歸一化處理,結果如表1中示例所示.
然后在模型中輸入當前一周的數據,最終得出下周預測銷量.
主要思想:如圖5所示,ARIMA模型將預測對象隨時間推移而形成的數據序列視為一個隨機序列,然后按照下述3個步驟進行建模:1)平穩序列、純隨機序列檢測;2)確定模型種類;通過模型識別來解決的;3)確定變量的滯后階數,通過模型識別完成的.其中ARIMA模型識別可以通過自相關系數AC和偏相關系數PAC進行識別.

表1 特征重要程度歸一化示例表Table 1 Feature importance normalization diagram
算法:通過繪制時間序列散點圖判斷該數據集是否平穩,如果平穩則不需要進行差分操作,ARIMA模型中參數d的值為0;如果不平穩則進行n階差分操作,使之變成平穩序列,參數d的值就是對數據差分階數n的值.

圖5 投放模型建模示意圖Fig.5 Modeling process for delivery diagram
對非純隨機序列做出acf圖和pacf圖,對圖中數據的變化趨勢進行判斷,如果acf圖出現拖尾,而pacf圖出現p階截尾的現象,則參數q為0,參數p為出現截尾時的階數,即選用AR(p)模型;如果acf圖出現q階截尾的現象,而pacf圖出現拖尾,則參數p為0,參數q為出現截尾時的階數,即選用MA(q)模型;如果acf圖出現拖尾,并且pacf圖出現拖尾,則參數p、q為出現拖尾的階數,即選用ARMA(p,q)模型.
在確定參數 p,d,q的值后,將數據送入 ARIMA(p,d,q)模型中進行訓練.模型訓練完成后即可直接輸出下次的預測值.在所有大類占比預測完成之后進行放縮操作,方法為將每個大類的預測值除以所有大類預測值的和,保證所有放縮后大類預測值的和為1.
為了降低模型復雜度,并加快預測速度,將取出的前4周小類在大類中占比的數據按小類進行數據求平均值操作,得到每個小類在前4周的平均占比數據.最后將小類平均占比乘上對應大類占比的預測值就得到了下周小類占比的數據.
本節將會通過一系列實驗對于本文所提算法進行準確性評估,具體是針對煙草銷量預測模型,投放量預測模型進行誤差分析.
本文所使用數據來源于N市煙草局,數據具體可以分為兩部分:1)2016年,2017年某一品牌的煙草銷量數據;2)2016年,2017年各類經銷商某一品牌煙草的投放量數據.
(4) B1中的成員均是Y中頂點色集合,因此,3,4,5,6中至少有3種色同時包含在每個C(ui)中,不妨設3,4,C(ui), i=1,2,…,10,從而每個C(ui)只能是以下集合之一:{1,3,4,5},{2,3,4,5},{1,3,4,5,6},{2,3,4,5,6},{1,2,3,4,5},{1,2,3,4,5,6},矛盾。
其中銷量數據包含日銷量在內專家選出的24維可能影響銷量特征數據;投放量數據包含7個大類客戶的投放數據以及各個大類客戶中包含的小類客戶共計21維投放量數據.
針對本文算法得到預測結果,我們采用廣泛使用的相對誤差、最高誤差、最低誤差、平均誤差來評估算法的準確性.相對誤差是衡量算法準確率的重要指標,相對誤差越低,表示算法的預測結果準確率越高.該組實驗數據經實驗產生最大的誤差即最高誤差,產生最小的誤差即最低誤差,所有數據的誤差的平均值即平均誤差,這三類誤差都是基于相對誤差實現的.相對誤差計算公式具體如下:

銷售模型所使用的數據經預處理之后,考慮到季節性變化的情況,實驗隨機選取了 2017.3.27 ~ 4.2,2017.6.26 ~5.2,2017.9.11 ~9.17,2017.11.6 ~11.12 這四個星期進行預測.將星期前三個月作為訓練集,對隨機森林模型進行訓練.例如2017.3.27 ~4.2,我們采用2016.1 到 2016.3.26 這三個月的數據作為訓練集進行訓練.

表2 銷量特征歸一化示意圖Table 2 Sales characteristics normalization diagram
經模型訓練,得出每一維特征對于煙草銷量的重要程度指標,經歸一化后,如表2所示.在該模型中輸入預測時間前3個月的銷量數據,最終得出預測結果,并與實際數據進行對比,結果如表3所示.

表3 銷售模型預測結果示意圖Table 3 Sales model forecast results diagram
表3中的差值為預測結果與實際數據的差值的絕對值.如表3所示,這四個星期的差值分別為57、70、81、86,他們的相對誤差分別為 0.017、0.011、0.041、0.21,平均誤差為0.076.實驗證明該銷售模型具有較好的預測準確性.
投放模型的數據為在2016年和2017年時間內向7個大類別的客戶,共計21個小類別客戶的產品投放量數據.實驗選取第96周的投放量作為實驗預測目的,并用第96周的真實投放量數據作為預測結果準確度衡量標準.

圖6 A類客戶數據散點圖Fig.6 Class A customer data scatter diagram
以A類客戶數據為例,首先取出A類客戶投放量比例歷史數據畫出散點圖,如圖6所示,發現A類數據已經較為平穩,故選擇不做差分處理,差分階數d取0,再做出acf圖(圖7)和pacf圖(圖8),從acf圖中看出在2階后有截拖尾現象,從pacf圖中看出在2階后有拖尾現象,得到p和q參數的值都為2,所以最終采用ARIMA(2,0,2)模型進行訓練,訓練完成之后輸入A類客戶前一周的數據,可以得到A類下一周的預測數據.

圖7 A類客戶自相關圖Fig.7 Class A customer autocorrelation diagram

圖8 A類客戶的偏相關圖Fig.8 Class A customer partial autocorrelation diagram
采用相同的方法對其他6個大類客戶類進行建模和預測,最終得出各大類客戶預測結果.將該預測結果與第96周的真實數據進行比較,得出如圖9所示的箱線圖.

圖9 各大類客戶預測結果箱線圖Fig.9 Boxplot of forecast results for all major customers
從圖中可以看到7個大類客戶數據預測結果的最低誤差在0.013左右,最高誤差在0.15左右,大部分的誤差范圍在0.03到0.09的范圍內,平均誤差為 0.064,可見該模型具有較好的預測效果.
計算每個大類中小類的占比情況.這里不再使用ARIMA模型,實驗計算一個大類中各個小類在該大類中的占比,然后利用平均值作為每個大類中各個小類所占比例情況的預測值.然后該預測值和大類在全體客戶中的所占比例得出小類客戶在全體客戶中所占比例情況.如圖10所示.

圖10 各小類客戶預測結果箱線圖Fig.10 Each class customer forecast results boxplot
從圖中可以看到各小類客戶在全體客戶中所占比例最高誤差為0.16左右,最低誤差為0.015左右,大部分的誤差范圍在0.025到0.095之間,整體的平均誤差為0.068,針對小類客戶的預測也具有較好的效果.
此外,實驗嘗試直接對小類客戶數據進行ARIMA模型建模.而實驗結果一方面模型數量大大增加,時間耗費和計算量大大增加,而且預測結果的平均相對誤差達到30%.
面向煙草行業的供給預測問題本質上就是一個時間序列預測問題[13],然而由于供給預測中煙草銷量數據具有短期性,季節性,非線性等特點,該問題的解決需要更加針對性的預測方法.為此國內許多學者在該問題上做了許多工作.
一般在煙草行業內進行時間序列預測的方法主要可以分為兩類:單模型和混合模型.單模型即利用一個模型實現時間序列預測的功能.例如陳日進[15]使用傳統時間序列預測法中的一次指數平滑預測法對于煙草銷量進行預測,該方法適用于較為平穩以及變化趨勢不明顯的煙草數據其中平滑系數的取值對于銷量預測結果有較大影響,平滑系數取值也需要多次進行測試才能保證銷量預測結果的誤差較低.還有例如基于灰色預測模型的灰色預測法[16],該方法是通過給予的煙草銷量數據,建立數學模型,并根據該模型對煙草銷量進行預測.但是該方法在波動變化明顯的數據中,預測結果誤差往往較大.劉璐等人[5]利用SVM(支持向量機,Support Vector Machine)解決面向煙草行業的供給預測問題.雖然SVM可以解決部分煙草數據量較小的問題,而且也能避免上述神經網絡結果選擇和局部極小點問題,但是SVM對于參數調節和函數的選擇十分敏感,容易引起預測結果的不準確.
混合模型即利用幾種模型進行混合實現時間預測的目的.目前在混合模型中主流的還是基于機器學習的混合模型.例如靳志偉[17]提出了基于BP神經網絡的煙草預測PSO-BP混合算法,利用粒子群中粒子的位置表示神經網絡中當前迭代次數中的權屬集合,訓練過程中產生的誤差作為訓練的適應度,但是往往建立模型時間復雜度高,可解釋性差.羅艷輝等人[18]提出了基于ARMA的混合算法,利用PERT模型和ARMA模型針對煙草時間序列進行預測,得到的預測值以一定的權值比例相加得到最終的預測結果.該方法加入了一定的人為判斷,只能處理較小的數據,在大數據量的操作中預測結果不會很好.羅彪等人[19]將傳統的節假日設為虛擬變量,構建基于時間序列分解和虛擬變量的改進模型,在現實操作中預測結果不太理想.
本篇文章提出一種面向煙草行業供給預測服務.算法利用隨機森林模型,得出數據中每一維特征數據的重要程度,利用當前時間的數據作為輸入得出下一周銷量的預測;化大類客戶和小類客戶數據為比例的形式,利用ARIMA模型對它們進行預測.最后本文通過實驗比較,證明了算法得到的預測結果與真實數據的準確性較高,能夠銷量平均誤差為0.076,大類客戶投放量平均誤差為0.13,小類客戶投放量平均誤差0.068.
本文后續工作將從以下幾個方面展開:
1)增加對于時間序列驗證過程,保證其準確率;
2)對于算法的公平性進行進一步的討論.