周 雨, 段永瑞
(同濟大學 經(jīng)濟與管理學院, 上海 200092)
信息化浪潮以及大數(shù)據(jù)技術(shù)的蓬勃發(fā)展為各行各業(yè)帶來了機遇與挑戰(zhàn), 通過數(shù)據(jù)驅(qū)動管理決策活動將可能為企業(yè)創(chuàng)造巨大的商業(yè)價值[1].零售企業(yè)通常儲存著大量的銷售明細數(shù)據(jù), 這些數(shù)據(jù)為企業(yè)進行銷售預(yù)測活動提供了可行性, 銷售預(yù)測是零售企業(yè)進行多項管理決策活動的基礎(chǔ), 因而對于企業(yè)具有重要意義, 例如精準的銷售預(yù)測可以有效減少因庫存積壓或庫存短缺造成的利益損失、幫助管理者更好地制定市場營銷策略以及提升客戶滿意度水平, 從而使企業(yè)建立起長期的競爭優(yōu)勢[2].
銷售預(yù)測通常被當作時間序列預(yù)測問題來進行處理, 為了滿足企業(yè)在戰(zhàn)略、戰(zhàn)術(shù)及日常運營等不同層級上的決策需要, 銷售明細數(shù)據(jù)需要相應(yīng)的在時間、供應(yīng)鏈及產(chǎn)品等多個維度上進行不同程度的聚合.目前大多數(shù)研究主要集中于解決高聚合級別如總銷售的預(yù)測問題, 對于低聚合級別如商品SKU預(yù)測的相關(guān)研究還相對較少[3], 而后者相對更難獲得準確的預(yù)測結(jié)果, 其原因在于低層級往往包含較多的數(shù)據(jù)噪聲, 且影響銷售波動的因素及其作用效果十分復(fù)雜, 不同商品的銷售情況可能存在較大的差異.近些年來, 許多研究對銷售的影響因素進行了討論, 除了歷史銷售表現(xiàn)之外, 部分文獻發(fā)現(xiàn)促銷和價格等相關(guān)因素能夠有效提升促銷期的預(yù)測表現(xiàn)[4,5].Huber等通過實證分析驗證了日歷因素如節(jié)假日對于銷售預(yù)測的提升作用[6].此外, 一些文獻還討論了天氣因素對于預(yù)測結(jié)果的影響[7,8].
從預(yù)測方法上看, 常見的時間序列預(yù)測方法如指數(shù)平滑法[9]、ARIMA與狀態(tài)空間模型[10]已經(jīng)得到了較為廣泛的討論, 然而傳統(tǒng)時間序列方法的缺陷在于僅使用內(nèi)部變量進行預(yù)測且無法有效捕捉非線性因素的影響.因此, 許多文獻提出基于數(shù)據(jù)驅(qū)動的機器學習方法將時間序列預(yù)測問題轉(zhuǎn)化為監(jiān)督學習的方式進行處理, 其中較為常見的方法包括神經(jīng)網(wǎng)絡(luò)模型如極限學習機ELM[11]、深度學習網(wǎng)絡(luò)DNN[12]以及回歸算法如支持向量回歸SVR[13,14]、基于回歸樹的集成算法如隨機森林[15]、XGBoost[16]等.此外, 部分文獻認為結(jié)合聚類的預(yù)測模型可以有效提升預(yù)測效果, Venkatesh等對111個ATM機的每日現(xiàn)金需求量進行了預(yù)測, 他們根據(jù)現(xiàn)金需求量的周季節(jié)性特征對ATM機進行了聚類, 并在每個類別上分別訓練了多種神經(jīng)網(wǎng)絡(luò)模型, 實驗結(jié)果表明基于聚類的預(yù)測模型總是優(yōu)于不聚類的預(yù)測模型[17].Lu等構(gòu)建了基于獨立成分分析、GHSOM聚類與SVR的月銷售預(yù)測模型, 根據(jù)38家PC銷售分公司的歷史銷售數(shù)據(jù)對它們進行了類別的劃分, 并對每一個類別獨立訓練了SVR預(yù)測模型, 實驗結(jié)果表明該模型能有效提升預(yù)測效果[18].這些研究所提出的預(yù)測模型在本質(zhì)上是類似的, 即在進行預(yù)測之前首先使用聚類算法將整個數(shù)據(jù)集劃分為幾個子數(shù)據(jù)集, 通過提升數(shù)據(jù)集中的數(shù)據(jù)相似程度以達到減少數(shù)據(jù)噪聲的目的, 之后再通過每個子數(shù)據(jù)集中的數(shù)據(jù)構(gòu)建出的數(shù)據(jù)池來進行預(yù)測模型的訓練, 這樣所得到的預(yù)測模型的預(yù)測結(jié)果更加準確和穩(wěn)定.不過需要注意的是, 以上研究在預(yù)測變量的選擇上僅考慮了歷史滯后因素, 因此所提出的模型仍舊存在一定的改進空間.
總的來說, 目前的相關(guān)研究仍主要集中于解決總銷售預(yù)測或單個商品的銷售預(yù)測問題, 對于多個商品的銷售預(yù)測場景的討論還相對不足, 因此本文將K-means聚類算法與SVR、隨機森林、XGBoost等機器學習回歸算法相結(jié)合以構(gòu)建預(yù)測模型來解決零售行業(yè)中多個商品的日銷量預(yù)測問題, 通過構(gòu)建數(shù)據(jù)池的方式擴充了用于模型訓練的數(shù)據(jù)量, 為了驗證模型的預(yù)測效果,本文將所提出的模型與基準模型以及不使用聚類的預(yù)測模型進行了對比分析, 所有模型的訓練與評估都是在真實的零售銷售數(shù)據(jù)集上完成的.
本文結(jié)合聚類與機器學習算法構(gòu)建了商品級別的銷售預(yù)測模型, 模型的基本流程如圖1所示.針對所要分析的問題場景, 我們分別以Y= (y1,y2, …,yt, …,yn)以及X= [xij],i= 1, 2,…,n,j= 1, 2,…,m表示某件商品在n個時間點上的銷售量以及與銷售量相關(guān)的外部變量的取值, 則對于任意一個商品而言, 預(yù)測目標即是基于已有數(shù)據(jù)預(yù)測該商品在下一個時間點的銷售量yn+1.
圖1 基于聚類與機器學習的預(yù)測模型
零售企業(yè)往往需要對多種商品進行銷量預(yù)測, 考慮到不同商品銷量的波動模式可能有較大的差異, 若直接使用所有商品的數(shù)據(jù)訓練模型則會引入大量的數(shù)據(jù)噪聲, 這可能會導致所訓練出的模型有較大的預(yù)測偏差, 因此在預(yù)測之前首先通過聚類分析將具有類似銷售波動模式的商品進行劃分, 以此來達到降低數(shù)據(jù)噪聲的目的.
K-means算法因其簡單高效的特點在諸多領(lǐng)域得到了廣泛應(yīng)用[19].該算法的核心思想為: 首先從全部數(shù)據(jù)樣本中隨機選取K個初始聚類中心點θi(1≤i≤K)并計算其余樣本點距離各聚類中心的歐式距離, 并將該樣本點劃分到距離其最近的聚類中心所代表的簇中,之后計算每個簇中所有樣本的均值以作為新的聚類中心并進行下一次迭代, 算法的停止準則為達到最大的迭代次數(shù)或所有聚類中心都不再變化為止.
為了符合真實的預(yù)測場景, 我們將原始銷售數(shù)據(jù)從時間點t1切割為訓練集和測試集兩部分, 并假設(shè)僅有訓練集是已知的, 接著以商品在訓練期上每個時間點的銷量作為輸入變量來實現(xiàn)商品的聚類, 由此, 樣本點與聚類中心間的歐式距離計算公式為:
其中,s即為某件商品在訓練期的樣本數(shù)據(jù),sj,θij分別代表商品s與商品簇中心θi的第j個變量的取值.通常情況下, 我們以整體誤差平方和來衡量聚類的效果,計算公式如下:
機器學習可以將時間序列預(yù)測轉(zhuǎn)化為監(jiān)督學習的方式來進行處理, 為了構(gòu)建機器學習模型訓練所需要數(shù)據(jù)形式, 我們首先需要在原始時序數(shù)據(jù)上使用滑動時間窗口對內(nèi)部變量即歷史滯后值進行提取: 假設(shè)使用過去l個時間點上的歷史數(shù)據(jù)作為預(yù)測變量, 則在長度為n的原始數(shù)據(jù)Y= (y1,y2, …,yt, …,yn)上總共可以得到n-l個樣本數(shù)據(jù):
其中,X表示預(yù)測變量矩陣即特征矩陣,Y為目標變量.進一步, 我們可以將外部變量加入到當前的特征矩陣X中, 從而得到最終的特征矩陣和目標變量矩陣:
機器學習需要有充足的數(shù)據(jù)量為其提供支持, 數(shù)據(jù)量不足將很可能導致過擬合情況的發(fā)生, 使得所訓練出的模型僅在特定的訓練數(shù)據(jù)集上擁有良好的擬合效果而不具備對未來進行預(yù)測的可用性.一般情況下單個時間序列對象所包含的數(shù)據(jù)量較少, 在進行訓練集和測試集的劃分后使得可用于模型訓練的數(shù)據(jù)變得更加有限, 導致在單個時間序列對象的預(yù)測問題上機器學習方法的表現(xiàn)甚至劣于更為簡單的時間序列預(yù)測方法[20].為了解決這一問題, 本文利用不同商品的數(shù)據(jù)來構(gòu)建數(shù)據(jù)池, 并基于整個數(shù)據(jù)池的數(shù)據(jù)進行模型訓練和測試: 假設(shè)DS表示由商品s的歷史銷售數(shù)據(jù)與相關(guān)的外部變量數(shù)據(jù)按照上述方式處理所得到的特征數(shù)據(jù)與目標變量數(shù)據(jù), 則所有商品都可以按照相同的方式進行處理, 最終我們將所得到的全部數(shù)據(jù)進行合并:D= ∪Ds,s=1,2,···,N.
至此, 我們可以基于數(shù)據(jù)池D進行訓練集、驗證集與測試集的劃分.訓練集數(shù)據(jù)用于模型的訓練, 使模型能夠?qū)μ卣髦蹬c目標變量之間的映射關(guān)系進行學習.驗證集的主要作用體現(xiàn)在通過超參數(shù)調(diào)優(yōu)以避免模型出現(xiàn)過擬合與欠擬合的情況, 最后, 模型預(yù)測效果的評估在測試集數(shù)據(jù)上進行, 本文使用MAE與SMAPE作為預(yù)測效果的評估指標:
其中,m為測試集的樣本總數(shù),yi為真實值,y~i為預(yù)測值。
本文所使用的數(shù)據(jù)來源于國內(nèi)某家零售企業(yè)所提供的真實銷售數(shù)據(jù)集, 我們選取了清潔用品品類下160件商品從2011年4月1日至2011年11月8日共222個時間點的日銷售數(shù)據(jù)進行分析, 對于少量缺失值使用了該時間點前后兩周的平均銷量進行了填充.其中2011年4月1日至2011年9月27日共180個時間點的數(shù)據(jù)用于構(gòu)建訓練集和驗證集, 之后的42個時間點用于構(gòu)建測試集, 圖2顯示了隨機抽取出的兩件商品的銷售時序圖, 從圖中我們可以看出商品呈現(xiàn)出明顯的周季節(jié)性特點, 但兩種商品的銷量趨勢以及波動幅度都存在著明顯的區(qū)別.這些規(guī)律在我們所分析的其他商品上是較為普遍存在的.
圖2 商品銷售時序圖
預(yù)測變量的選擇往往依賴于特定領(lǐng)域的知識, 我們參考了已有研究的相關(guān)結(jié)論并在數(shù)據(jù)探索性分析的基礎(chǔ)上構(gòu)建了本文的預(yù)測變量.
時間序列預(yù)測具備可行性的前提為假設(shè)過去出現(xiàn)過的數(shù)據(jù)模式在未來還會以類似的方式出現(xiàn), 因此自回歸時間序列數(shù)據(jù)即歷史滯后值是最常用也是最直接的預(yù)測變量.然而目前對于滯后值的選擇范圍還沒有文獻進行過系統(tǒng)的討論, 一般情況下對于短期預(yù)測而言使用近期的滯后值來進行預(yù)測會得到更為準確的預(yù)測效果, 此外, 基于滯后值計算的相關(guān)統(tǒng)計值也常被用來進行時間序列的預(yù)測.
外部變量的加入有助于提升機器學習模型的預(yù)測效果.除了用于劃取歷史滯后值之外, 由時間維度衍生出的時不變的日歷變量如月份、工作日與周末、節(jié)假日等在時間序列預(yù)測場景下很可能起到積極的作用.考慮到所分析的多數(shù)商品具有較為明顯的周季節(jié)性特點, 本文主要關(guān)注了商品銷量在一周內(nèi)的變化趨勢以及在法定節(jié)假日期間的銷售情況, 并分別計算了相應(yīng)的銷售均值.從圖3中我們可以看到, 非節(jié)假日期間商品銷量有著明顯的周季節(jié)性特點, 這與銷售時序圖所反映出的現(xiàn)象是一致的, 考慮到消費者在周末有更充裕的時間進行集中購物, 商家也會在周末推出相應(yīng)的促銷優(yōu)惠活動, 因此周末的商品銷量要明顯地高于工作日.此外, 節(jié)假日期間的銷量普遍高于非節(jié)假日, 特別是我們發(fā)現(xiàn)本應(yīng)屬于工作日的周一和周二的商品銷量在節(jié)假日期間有了明顯的增長.因此, 本文在建立預(yù)測模型時納入了相關(guān)的日歷變量.最后, 我們還考慮將商品價格作為預(yù)測變量, 由于價格本身也可以被看作是時間序列數(shù)據(jù), 因此對于價格變量同樣使用了時間滑窗的方式進行處理, 即我們考慮了短期價格波動對商品銷量的影響, 本文使用的所有預(yù)測變量見表1.
圖3 周季節(jié)性與節(jié)假日對商品銷量的影響
表1 預(yù)測變量
本文使用了多種機器學習回歸算法構(gòu)建預(yù)測模型,其中包括支持向量回歸(Support Vector Regression,SVR)、集成算法隨機森林(Random Forest, RF)[21]以及XGBoost (eXtreme Gradient Boosting)算法[22].作為實驗對照, 本文選用了Na?ve以及季節(jié)性指數(shù)平滑作為基準方法, Na?ve將上一個時間點的真實值作為預(yù)測值來進行預(yù)測, 故又被稱為隨機游動預(yù)測法, 該方法因其簡單且有效的特點而被廣泛地用作基準方法[23].Hyndman等對指數(shù)平滑家族做了完備的闡述[24], 結(jié)合本文的預(yù)測場景我們選擇了季節(jié)性指數(shù)平滑來對每個商品進行單獨預(yù)測, 使用了過去七天的歷史銷量作為該方法的預(yù)測變量.
3.3.1 支持向量回歸
支持向量回歸是在統(tǒng)計學習理論基礎(chǔ)上發(fā)展起來的基于結(jié)構(gòu)風險最小化原理的機器學習算法, 該算法通過核函數(shù)將低維空間的非線性問題轉(zhuǎn)化為高維空間的線性問題來進行求解, 因而能夠有效降低過度擬合的可能性, 具有較強的泛化能力[25].本文選用徑向基函數(shù)作為支持向量回歸的核函數(shù), 使得該算法能夠更好地處理非線性關(guān)系.
3.3.2 隨機森林
隨機森林是基于決策樹的Bagging類集成學習算法, 其核心思想是通過構(gòu)建多個相互獨立的決策樹并采用平均值計算或多數(shù)表決原則對每個決策樹輸出的結(jié)果進行處理以得到最終的結(jié)果.為了保證隨機性, 在構(gòu)建每個決策樹時都采用隨機有放回抽樣的方式對訓練集數(shù)據(jù)進行樣本抽取, 并且在每個節(jié)點都通過隨機選取特征子集來決定分支結(jié)果.隨機森林有諸多優(yōu)點,由于對獨立的決策樹采用并行計算方式, 使得其在大型數(shù)據(jù)集上也有較快的計算速度, 此外隨機森林能夠處理高維數(shù)據(jù)、不同類型的特征以及缺省值數(shù)據(jù), 且不要求對數(shù)據(jù)進行規(guī)范化.
3.3.3 XGBoost
XGBoost是基于梯度提升樹算法GBDT的高效實現(xiàn)與改進算法, 本質(zhì)上屬于Boosting類的集成學習算法.Boosting通過逐步迭代的方式將多個弱學習器結(jié)合為強學習器, 其中每一步迭代所構(gòu)建的弱學習器都是根據(jù)已有弱學習器的預(yù)測殘差進行進一步學習的.GBDT在進行目標函數(shù)優(yōu)化時僅使用到了一階導數(shù)信息, 而XGBoost對損失函數(shù)進行了二階泰勒展開并增加正則項以避免過擬合情況的發(fā)生.XGBoost具有高準確度、能夠并行計算、可以分布式處理高維稀疏特征等優(yōu)點.
本文首先使用全部訓練集數(shù)據(jù)對機器學習預(yù)測模型進行了訓練, 采用十折交叉驗證以及網(wǎng)格搜索法進行了超參數(shù)選擇, 并在測試集數(shù)據(jù)上驗證了模型的預(yù)測效果, 表2對各模型的預(yù)測評估指標結(jié)果進行了匯總.從預(yù)測指標反映的結(jié)果來看, 季節(jié)性指數(shù)平滑以及基于機器學習的預(yù)測模型結(jié)果都要優(yōu)于基準方法Na?ve,其中3種基于機器學習的預(yù)測模型的預(yù)測效果又要好于季節(jié)性指數(shù)平滑, 由于季節(jié)性指數(shù)平滑是基于單個商品的銷售數(shù)據(jù)來進行預(yù)測的, 所考慮的預(yù)測信息有限, 且不能很好地處理非線性關(guān)系, 因此在多個商品的預(yù)測場景下通過構(gòu)建數(shù)據(jù)池來擴充數(shù)據(jù)量和預(yù)測變量的選擇范圍更有助于發(fā)揮出機器學習模型的預(yù)測效果.最后, 支持向量回歸的預(yù)測結(jié)果優(yōu)于隨機森林以及XGBoost, 其相比于Na?ve在SMAPE及MAE指標上分別獲得了20.45%以及18.56%的提升.
表2 基準模型與機器學習模型的預(yù)測結(jié)果
進一步, 本文進行了實驗以驗證聚類是否能夠進一步提升機器學習預(yù)測模型的預(yù)測效果.聚類數(shù)對最終的預(yù)測效果具有直接影響, 過少的聚類數(shù)意味著不能很好地識別具有相似銷售模式的商品, 即不能很好地實現(xiàn)降低數(shù)據(jù)噪聲的作用, 而過多的聚類數(shù)會導致子數(shù)據(jù)集中包含較少的數(shù)據(jù)量, 這將會影響到預(yù)測模型的最終預(yù)測效果.基于以上考慮, 我們分別取聚類數(shù)K=2, 3, 4并實驗了3種機器學習模型在不同聚類數(shù)下的預(yù)測結(jié)果, 為了方便對比, 我們使用K=1來表示不使用聚類的情況.
表3匯總了不同聚類數(shù)下各預(yù)測模型的預(yù)測結(jié)果,從中我們可以看到結(jié)合聚類的機器學習模型的預(yù)測效果在原有基礎(chǔ)上都有了進一步的提升, 其中K-SVR模型在聚類數(shù)K=2時得到了最優(yōu)預(yù)測結(jié)果, 而K-RF以及K-XGBoost模型則在聚類數(shù)K=3時表現(xiàn)最佳, 當聚類數(shù)為4時預(yù)測效果的提升程度則最小, 因此我們認為將商品劃分為2或3個商品簇是相對合適的.此外,無論在哪種情況下支持向量回歸的預(yù)測結(jié)果總是優(yōu)于兩種集成算法, 因此相較于聚類而言, 算法的選擇對最終的預(yù)測結(jié)果有著更大的影響.
表3 基于聚類與機器學習的預(yù)測模型的預(yù)測結(jié)果
為了更加直觀的對比不同模型的預(yù)測結(jié)果, 繪制了不同預(yù)測模型的預(yù)測值與真實值的散點圖, 具體情見圖4.其中樣本分布越集中于對角線說明預(yù)測誤差越小.
圖4 不同模型預(yù)測值與真實值關(guān)系散點圖
銷售預(yù)測能夠為零售企業(yè)安排生產(chǎn)計劃、控制庫存水平以及制定營銷策略等多項管理決策活動提供支持.目前的大部分研究是針對單個時間序列對象如總銷售或某個特定商品的銷售情況進行分析的,而在真實預(yù)測場景中企業(yè)往往需要對多個商品進行預(yù)測, 本文認為基于聚類分析與機器學習方法的預(yù)測模型能夠很好地應(yīng)用于此類預(yù)測場景, 其原因主要為在此類預(yù)測場景下可以通過構(gòu)建數(shù)據(jù)池的方式來增加用于訓練機器學習模型的數(shù)據(jù)量以及預(yù)測變量的選擇范圍.此外, 考慮到數(shù)據(jù)池構(gòu)建的同時會引入數(shù)據(jù)噪聲, 因此在訓練模型之前可以通過聚類分析將具有相似銷售模式的商品進行劃分.本文基于K-means聚類與支持向量回歸、隨機森林、XGBoost構(gòu)建了3種不同的預(yù)測模型, 并使用真實的零售企業(yè)銷售數(shù)據(jù)對模型進行了驗證.結(jié)果表明3種預(yù)測模型的預(yù)測效果要明顯好于基準預(yù)測方法, 其中表現(xiàn)最優(yōu)的預(yù)測模型K-SVR (K=2)在SMAPE及MAE兩項預(yù)測評估指標上相較于Na?ve方法分別提升了21.23%和20.46%.
本文所提出的預(yù)測思路不僅對零售行業(yè)的銷量預(yù)測問題具有參考意義, 其還可以應(yīng)用到類似的時間序列預(yù)測場景中.對于未來的研究方向我們認為可以嘗試將更多性能優(yōu)異的機器學習算法用于此類預(yù)測場景.此外由于K-means聚類算法的缺陷之一為需要手動設(shè)定聚類數(shù), 因此也可以嘗試使用其他類型的聚類算法如層次聚類法.