版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)第1章現(xiàn)代庫存管理概述1.1什么是庫存庫存是指為了使生產(chǎn)正常且不間斷的開展或為了更加及時地滿足顧客的需求,在各個生產(chǎn)階段或分銷環(huán)節(jié)之間設置的物品儲備庫存是供應鏈的六大功能模塊之一,在促進企業(yè)降本增效、供需匹配中發(fā)揮關鍵作用對于企業(yè)來說,庫存是一項流動資產(chǎn),會給投資帶來相應的回報庫存的四方面功能:供需匹配:持有安全庫存應對不確定性規(guī)模效應:促使企業(yè)批量補貨來降低補貨的成本快速履約:持有更多的庫存,庫存分散前置庫存分離:供應鏈網(wǎng)絡一定程度的解耦1.2庫存管理解決的問題通過適量的庫存,實現(xiàn)超儲與缺貨之間的最佳或最經(jīng)濟合理的平衡,是庫存管理的核心目標企業(yè)的存貨不足,可能會造成供貨不及時,供應鏈斷裂、喪失交易機會或市場占有率商品庫存會產(chǎn)生一定的持貨成本,同時存在由于商品擠壓或者損壞而產(chǎn)生的庫存風險因此,在庫存管理中,既要保持合理的庫存數(shù)量,防止缺貨、實現(xiàn)一定的規(guī)模效應,同時又要避免庫存過量,發(fā)生不必要的庫存費用1.2庫存管理解決的問題以簡單兩級分銷網(wǎng)絡為例,中央倉從供應商補貨,然后為下游的區(qū)域倉供應庫存,每個區(qū)域倉對相應區(qū)域的顧客需求進行履約1.3現(xiàn)代庫存管理的挑戰(zhàn)在具體業(yè)務場景下,實際因素使得庫存管理目標的實現(xiàn)更具挑戰(zhàn)庫存管理場景的多樣化啤酒飲料行業(yè):重量大、體積大、貨值低的重泡貨售賣鮮食的零售商超、餐飲門店:保質(zhì)期較短消費電子行業(yè)代工廠:采用訂單生產(chǎn)模式危險化學品的補貨過程:特殊運輸策略,保障安全運輸需求來源的多樣化與庫存網(wǎng)絡的復雜性零售企業(yè)線上線下全渠道融合,企業(yè)面臨的訂單來源多樣化為了快速滿足全渠道的需求,企業(yè)庫存供應網(wǎng)絡的結構日漸復雜1.3現(xiàn)代庫存管理的挑戰(zhàn)需求與供應不確定性高企業(yè)促銷手段層出不窮在售的商品種類繁多,很大一部分是長尾品疫情的反復變化消費者對缺貨的容忍度降低消費者的轉(zhuǎn)移成本降低,粘性變?nèi)酰M者缺乏耐?1.4
現(xiàn)代庫存管理的發(fā)展趨勢在消費、產(chǎn)業(yè)升級和技術變革的作用之下,庫存網(wǎng)絡逐步發(fā)展為依賴人工智能、機器學習、云計算等新興技術的數(shù)字化矩陣式庫存網(wǎng)絡,呈現(xiàn)出以下幾點發(fā)展趨勢:庫存網(wǎng)絡扁平化代理商的去中間化庫存設置點前移布局前置倉,提升用戶體驗物流配送格局逐漸轉(zhuǎn)變?yōu)殡娚唐脚_+前置倉+即時物流(或消費者)1.4
現(xiàn)代庫存管理的發(fā)展趨勢數(shù)字化建設互聯(lián)網(wǎng)、物聯(lián)網(wǎng)、大數(shù)據(jù)、人工智能等新一代信息技術和現(xiàn)代化管理理念方法作為基礎以價值創(chuàng)造為導向、以數(shù)據(jù)為驅(qū)動,對供應鏈活動進行整體規(guī)劃設計與運作1.5現(xiàn)代庫存管理優(yōu)化案例近年來,國內(nèi)涌現(xiàn)出了像杉數(shù)科技(北京)有限公司(簡稱杉數(shù)科技)這樣為數(shù)字化轉(zhuǎn)型的企業(yè)提供智慧供應鏈解決方案的公司接下來介紹杉數(shù)科技的兩個庫存管理優(yōu)化案例1.5現(xiàn)代庫存管理優(yōu)化案例背景介紹企業(yè)B是目前全球頂級的食品制造商除了線下門店,公司布局了多個線上渠道、供應中心和工廠全渠道履約網(wǎng)絡零售企業(yè)全渠道庫存優(yōu)化案例1.5現(xiàn)代庫存管理優(yōu)化案例面臨的問題針對需求特性不一的渠道,如何實現(xiàn)智能預測并提高履約能力隨著每年產(chǎn)品數(shù)量的增加,以及各類產(chǎn)品繁復的市場特征,庫存缺貨和冗余現(xiàn)象頻繁發(fā)生,導致庫存成本持續(xù)增加解決方案根據(jù)渠道特性定制需求預測算法模型,為企業(yè)量身打造了新一代電商智能計劃系統(tǒng)可視化展示系統(tǒng)儲存的數(shù)據(jù)信息實現(xiàn)全渠道需求的預測和計劃制定提供算法輸出參考以及批量編輯功能幫助用戶提高計劃效率采用插件式的設計架構,可以基于場景定制更新算法包方案落地后,測試商品的月需求預測準確率提升了約6%,助力企業(yè)供應鏈智能化轉(zhuǎn)型升級1.5現(xiàn)代庫存管理優(yōu)化案例背景介紹H公司是全球領先的信息與通信基礎設施和智能終端提供商生產(chǎn)制造網(wǎng)絡中包含數(shù)十萬個節(jié)點,數(shù)百萬條邊,存在大量共享組件及可替代原材料過去的安全庫存策略流程煩瑣,成品交付滿足率較低,也沒有深度挖掘全網(wǎng)絡安全庫存共享的價值面臨的問題安全庫存是庫存管理中應對需求不確定性的有效工具,如何在規(guī)模龐大的復雜制造網(wǎng)絡上設置安全庫存,在提升終端產(chǎn)品的服務水平的同時最小化系統(tǒng)總安全庫存成本如何對整個制造網(wǎng)絡上的安全庫存進行全局優(yōu)化,有效地刻畫需求不確定性、全局優(yōu)化安全庫存布局、平衡成本與滿足率的情況下優(yōu)化安全庫存量、同時保證求解效率復雜制造網(wǎng)絡安全庫存優(yōu)化案例1.5現(xiàn)代庫存管理優(yōu)化案例打造了一套自動化、智能化的網(wǎng)絡安全庫存優(yōu)化解決方案解決方案現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)第2章需求預測基礎2.1需求預測的基本結構一般認為需求的實現(xiàn)值由兩部分構成:可預測的需求模式:這部分由商品特征、經(jīng)濟規(guī)律等客觀規(guī)律決定不可預測的隨機因素:由一些難以刻畫的顧客購買行為和隨機影響導致
2.1需求預測的基本結構
2.1需求預測的基本結構產(chǎn)品的需求模式同時受到內(nèi)在規(guī)律和外生因素的影響內(nèi)在規(guī)律可以進一步分解為趨勢性、季節(jié)性這兩種共通的需求變動規(guī)律和產(chǎn)品本身決定的需求特性,由產(chǎn)品本身的性質(zhì)決定外生影響的來源則非常廣泛,往往需要針對具體的產(chǎn)品進行具體分析和刻畫2.2需求預測方法的分類時間序列方法
宏觀趨勢
2.2需求預測方法的分類時間序列方法在使用時間序列模型時,最重要的是理解模型采用了哪一種分解模型,以及刻畫的是序列中的哪一部分
宏觀因素微觀因素
趨勢性季節(jié)性一元多元簡單指數(shù)平滑√√
Holt-Winters√√
ARIMA
√
sARIMA
√√
VARMA
√sVARMA
√
√HTS
√prophet√√√
2.2需求預測方法的分類機器學習方法特點優(yōu)勢劣勢線性模型簡單的線性回歸形式,可以通過正則化項演化為LASSO或Ridge模型形式簡單只能擬合線性關系CART樹基于二分樹的結構構建,是后續(xù)許多集成方法的基礎結構簡單,擬合能力強大對數(shù)據(jù)敏感,容易過擬合神經(jīng)網(wǎng)絡由線性變換、非線性激活函數(shù)和網(wǎng)絡結構組成多層網(wǎng)絡理論上可以以任意精度逼近任意函數(shù),具有強大的擬合能力網(wǎng)絡結構復雜,模型參數(shù)較多,容易調(diào)試不當或過擬合隨機森林以并行的決策樹為基礎模型,通過簡單加權集成最終結果相比決策樹更加穩(wěn)健,可以并行運算,計算速度快相比于GBDT集成方法效果較差XGBoost以決策樹為基礎模型,不斷強化對殘差的學習基于GBDT思想改進,能在實現(xiàn)較好模型效果同時以較快的速度完成運算對于較大的數(shù)據(jù)運行較慢;參數(shù)設置復雜,容易過擬合lightGBM以決策樹為基礎模型,不斷強化對殘差的學習在海量數(shù)據(jù)的場景下,能夠以較小的內(nèi)存和較快的速度完成計算參數(shù)設置復雜,容易過擬合Stacking以多種預測模型為基礎模型,通過機器學習模型集成最終結果模型形式簡單,效果強大,能夠集成不同模型的優(yōu)勢,包容性強容易過擬合2.2需求預測方法的分類比較和總結機器學習方法是數(shù)據(jù)驅(qū)動的,時間序列方法是模型驅(qū)動的機器學習模型的效果受到特征選擇、模型選擇、參數(shù)選擇等諸多因素的影響,實際運用效果還要取決于業(yè)務場景、數(shù)據(jù)性質(zhì)和模型調(diào)試等諸多方面由于強大的擬合能力,在一個數(shù)據(jù)規(guī)模相對較小或是內(nèi)在規(guī)律簡單的數(shù)據(jù)集上,機器學習很容易過度擬合隨機擾動因素,從而導致較差的泛化能力;而時間序列則能夠集中于把握宏觀趨勢,較好地剔除隨機擾動的偶然影響機器學習得到的結果往往較難得到直觀理解,解釋力較弱,較難結合已有經(jīng)驗進行輔助判斷和調(diào)整;時間序列模型具有簡單清晰的模型結構,非常便于使用、解讀和調(diào)整2.3數(shù)據(jù)預處理在進行需求預測之前,通常要對數(shù)據(jù)進行預處理及分析。盡管不同企業(yè)的業(yè)務場景與產(chǎn)品的需求規(guī)律不同,但數(shù)據(jù)處理的步驟與方法是類似的本節(jié)以食品飲料快消品公司W(wǎng)2018年1月1日~2020年7月30日77個產(chǎn)品在18個分銷中心(distributioncenter,DC)的銷售數(shù)據(jù)為對象一般而言,盡管原始數(shù)據(jù)的具體格式不盡相同,需求預測任務的數(shù)據(jù)集至少包含以下信息:
商品名,有時存在品類信息,構成兩級及以上的產(chǎn)品類別層級結構銷售地點,有時存在國家/區(qū)域—城市—終端銷售點的地理層級結構時間,一般以日為顆粒度實際銷量首先,從數(shù)據(jù)文件夾讀入銷售數(shù)據(jù)表格,并查看表格前十行,以獲得對數(shù)據(jù)結構的基本了解注意數(shù)據(jù)路徑的設置,相比于將文件地址作為一個完整字段,單獨指定文件夾路徑和表格名稱更具靈活性,更適用于具有較多數(shù)據(jù)表格需要管理以及可能存在數(shù)據(jù)遷移的場景2.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作importpandasaspd
data_dir=
'../../data/forecast_data/'
sales_data=pd.read_csv(data_dir+
'sales_data.csv')
print(sales_data.head(10))2.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作可以看到,本節(jié)所使用的數(shù)據(jù)集恰好對應了需求預測任務的四個基本元素,并通過dc_id和sku_id組合成unit_id,從而標識更細致的顆粒度
datedc_idsku_idunit_idsale
02018-05-01DC001SKU024DC001_SKU0240
12018-05-01DC001SKU070DC001_SKU0700
22018-05-01DC001SKU078DC001_SKU0789
32018-05-01DC001SKU044DC001_SKU044589
42018-05-01DC001SKU051DC001_SKU05143
52018-05-01DC001SKU063DC001_SKU0632751
62018-05-01DC001SKU099DC001_SKU09996
72018-05-01DC001SKU100DC001_SKU100200
82018-05-01DC001SKU101DC001_SKU10142
92018-05-01DC001SKU102DC001_SKU102102.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作
數(shù)據(jù)類型轉(zhuǎn)換時間數(shù)據(jù)在csv等文件中常以字符串形式儲存,對這種格式的數(shù)據(jù)無法使用一些針對時間戳格式的便捷操作。因此,在讀入帶有時間的數(shù)據(jù)時,往往需要確認時間數(shù)據(jù)類型并進行數(shù)據(jù)類型的轉(zhuǎn)換sales_data['date']=pd.to_datetime(sales_data['date'])2.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作
數(shù)據(jù)整理當拿到的原始數(shù)據(jù)的排列并不按照商品、DC和時間順序進行排列時,我們并不知道數(shù)據(jù)從何時開始、到何時結束,也不知道究竟有多少種商品和DC。所以接下來我們進行對表格的排序、時間范圍的識別、商品種類和DC個數(shù)的統(tǒng)計工作表格的排序#排序
sales_data=sales_data.sort_values(
by=['dc_id','sku_id','date']).reset_index(drop=True)
print(sales_data.head())
datedc_idsku_idunit_idsale
02018-02-02DC001SKU001DC001_SKU0017
12018-02-03DC001SKU001DC001_SKU0010
22018-02-04DC001SKU001DC001_SKU0010
32018-02-05DC001SKU001DC001_SKU0012
42018-02-06DC001SKU001DC001_SKU0010時間范圍的識別商品種類及DC個數(shù)的統(tǒng)計2.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作
#商品種類和DC個數(shù)統(tǒng)計
all_sku_list=sales_data['sku_id'].unique().tolist()
print(f'商品個數(shù)為:{len(all_sku_list)}')
all_dc_list=sales_data['dc_id'].unique().tolist()
print(f'DC個數(shù)為:{len(all_dc_list)}')#時間范圍的識別
print(f'數(shù)據(jù)起始時間為:{sales_data["date"].min()}')
print(f'數(shù)據(jù)結束時間為:{sales_data["date"].max()}')數(shù)據(jù)起始時間為:2018-01-0100:00:00
數(shù)據(jù)結束時間為:2020-07-3000:00:00
商品個數(shù)為:77
DC個數(shù)為:182.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作
部分數(shù)據(jù)篩選上述數(shù)據(jù)表格包含了所擁有的全部信息,但當我們僅需要其中部分信息時,可以將這部分數(shù)據(jù)存放到一個新的數(shù)據(jù)表中,便于之后取用unit_id=
'DC001_SKU044'
unit_df=sales_data[sales_data['unit_id']==unit_id]
print(unit_df.head())
datedc_idsku_idunit_idsale
212282018-01-01DC001SKU044DC001_SKU04479
212292018-01-02DC001SKU044DC001_SKU044492
212302018-01-03DC001SKU044DC001_SKU0441261
212312018-01-04DC001SKU044DC001_SKU0441067
212322018-01-05DC001SKU044DC001_SKU0445352.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作
描述性統(tǒng)計pandas自帶的數(shù)據(jù)分析函數(shù)describe()可以自動統(tǒng)計數(shù)值型數(shù)據(jù)的均值方差等信息,也可以自動統(tǒng)計非數(shù)值型數(shù)據(jù)的個數(shù)、唯一值數(shù)量、最高頻率等信息print(unit_df['sale'].describe())count940.000000
mean1199.408511
std913.354405
min0.000000
25%628.000000
50%1106.000000
75%1661.750000
max7777.000000
Name:sale,dtype:float642.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作
數(shù)據(jù)聚合對于非時間類型的類別信息,我們一般可以通過groupby方法,將原始數(shù)據(jù)按照某一類進行聚合下面的代碼展示了將原始的銷售數(shù)據(jù)按照商品進行聚合,統(tǒng)計每一類產(chǎn)品的日度銷售情況,并按照日期和商品類別進行排序print(sales_data.groupby(['sku_id','date'])['sale']\
.agg(['sum','mean','median','std'])\
.sort_values(by=['date','sku_id']).reset_index()[:5])2.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作
數(shù)據(jù)聚合由于日度銷量往往波動性較高,有時需要將原始的日銷量數(shù)據(jù)聚合為一段時間內(nèi)的總銷量數(shù)據(jù),例如周銷量、月銷量等可以通過resample方法實現(xiàn),下列代碼展示了我們?nèi)绾螌⒃紨?shù)據(jù)聚合得到每個unit的周銷量數(shù)據(jù)weekly_sales_df=sales_data.groupby('unit_id')[['date','sale']]\
.resample('W',on='date').sum().reset_index()
print(weekly_sales_df.head())2.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作缺失值處理由于對于真實數(shù)據(jù),往往需要考察其完整性,并對缺失值做出一定的處理一般地,我們需要針對每個商品單元考察記錄完整性,即每個商品標識下的數(shù)據(jù)是否完整覆蓋了數(shù)據(jù)集時間對于缺失數(shù)據(jù),不同的成因?qū)瞬煌慕鉀Q方式這可能是正常的商業(yè)現(xiàn)象,即某天的銷售量為零,對此我們可以用0填充缺失數(shù)據(jù);這可能是數(shù)據(jù)遺失導致的,缺失部分存在銷售,但銷量并未被記錄,此時可以用插值的方式進行填充也可能是因為產(chǎn)品上市和銷售時間不一致,某些新品、促銷品、季節(jié)品本身在市時間就較短,此時可以選擇將這些產(chǎn)品與常規(guī)品區(qū)別開,單獨構建模型,或者通過定性分析的方式單獨進行分析和處理2.3數(shù)據(jù)預處理數(shù)據(jù)導入及基礎操作數(shù)據(jù)輸出在完成上述的基本數(shù)據(jù)整理工作后,我們可以將得到的新數(shù)據(jù)表格輸出,在后續(xù)進行深入分析和模型構建時,可以直接讀取整理好的結果,從而避免重復的數(shù)據(jù)預處理工作weekly_sales_df.to_csv(data_dir+
'weekly_sales_data.csv',index=False)2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化導入Python中常用的可視化工具包,matplotlib和seaborn,并統(tǒng)一繪圖格式代碼示例#導入繪圖包
importmatplotlib.pyplotasplt
importseabornassns
#設置畫圖風格
sns.set_theme(style='darkgrid')
#設置畫布大小
plt.rcParams['figure.figsize']=(12.0,6.0)
#設置清晰度
plt.rcParams['figure.dpi']=
500#導入繪圖包
importmatplotlib.pyplotasplt
importseabornassns
2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化(接上頁)#設置畫圖風格
sns.set_theme(style='darkgrid')
importmatplotlib
matplotlib.rc('font',family='SongtiSC')
parameters={'figure.figsize':[12.0,6.0],
'figure.dpi':500,
'axes.labelsize':14,
'xtick.labelsize':14,
'ytick.labelsize':14,
'legend.fontsize':14,
'font.weight':'bold'
}
plt.rcParams.update(parameters)2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化下列代碼定義了針對某一個產(chǎn)品銷量的季節(jié)性繪制函數(shù),通過將不同年份的數(shù)據(jù)疊加,可以更直觀地看到不同年份間是否存在相似的季節(jié)性變動
#季節(jié)性繪制函數(shù)
defplot_year_seasonality(data,date_col,qty_col):
"""
data:pd.DataFrame格式數(shù)據(jù)
date_col:data中標識日期的列名,需轉(zhuǎn)換為日期格式
qty_col:data中標識銷量的列名
"""
#以1-12月設置橫坐標
month_all_list=list(range(1,12
+
1))
plt.xticks(range(len(month_all_list)),month_all_list,rotation=60)
#設置曲線顏色和曲線標識
color=['#787878','#1c79d9','black']
marker=['o','^','s']
#初始化標簽列表
legend_list=[]
2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化color=['#787878','#1c79d9','black']
marker=['o','^','s']
#初始化標簽列表
legend_list=[]
#將傳入數(shù)據(jù)按照月份聚合
data=data.resample('M',on=date_col).agg({qty_col:'sum'})
#提取數(shù)據(jù)涉及年份,并逐年遍歷
plot_year=list(set(data.index.year))
color_idx=
0
foryearinplot_year:
#提取當年所有數(shù)據(jù),以月份為橫坐標,月總銷量為縱坐標繪制折線圖
data_year=data[data.index.year==year]
data_inds=data_year.index.month
data_val=data_year[qty_col]
plt.plot(data_inds-
1,data_val,c=color[color_idx],
marker=marker[color_idx])
#為曲線添加標簽
legend_list.append(year)
#動態(tài)改變下一次繪圖曲線顏色
color_idx+=
1
2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化
#展示繪制圖像
plt.xlabel('月份')
plt.ylabel('銷量')
plt.legend(legend_list,loc='upperright')
plt.show()
2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化分別考察’SKU044’和’SKU008’在’DC001’的銷量季節(jié)性。可以發(fā)現(xiàn),’SKU044’的銷量季節(jié)性并不明顯,相比之下’SKU008’則呈現(xiàn)出一定的季節(jié)規(guī)律:在3-7月呈現(xiàn)出銷量上升的共同趨勢,在9月~次年2月呈現(xiàn)出銷量下降的共同趨勢2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化下列代碼定義了針對某一個產(chǎn)品銷量的趨勢性繪制函數(shù),利用產(chǎn)品的月銷量數(shù)據(jù)繪制折線圖,來直觀地考察其上升下降趨勢#趨勢性繪制函數(shù)
defplot_trend(data,date_col,qty_col):
data=data.resample('M',on=date_col).sum()
plt.plot(data['sale'],color='#1c79d9',marker='o')
plt.xlabel('時間')
plt.ylabel('銷量')
plt.show()
2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化選擇’DC001_SKU044’和’DC017_SKU002’兩個unit分別繪制其趨勢圖像??梢钥吹?,前者呈現(xiàn)出一定的上升趨勢,同時疊加了一定的季節(jié)性波動;而后者則出現(xiàn)了較為明顯的下降趨勢。在針對這兩個unit進行需求預測時,為了獲得更好的預測效果,需要將產(chǎn)品的趨勢性納入模型考慮2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化當一個商品在多個地區(qū)進行銷售時,其在各區(qū)域之間的需求可能存在一定的相關性,這是由商品屬性決定的共同趨勢。同時,不同產(chǎn)品之間也可能存在相互關聯(lián)不管是在模型構建還是特征構建中,我們都可以將相關因素納入其中,以提升預測模型的準確性這一操作在經(jīng)過格式轉(zhuǎn)換的數(shù)據(jù)上可以通過調(diào)用內(nèi)置函數(shù)corr()實現(xiàn),同時,也可以通過繪制熱力圖,更直觀地觀察相關性sku_df=sales_data[sales_data[‘sku_id’]==
‘SKU076’]
corr=sku_df[[‘date’,‘dc_id’,‘sale‘]]\
.pivot(index='date',columns='dc_id',values='sale').corr()
sns.heatmap(corr,annot=True,cmap="Blues")<AxesSubplot:xlabel='dc_id',ylabel='dc_id'>
2.3數(shù)據(jù)預處理時序數(shù)據(jù)可視化熱力圖解讀可以通過圖中標注出的相關系數(shù)考察變量相關性,相關系數(shù)的取值范圍在-1到1之間,越接近于1表明正相關程度越高,越接近于-1表明負相關程度越高,越接近于0表明相關性越弱也可以結合圖例,從色塊顏色直觀地考察變量之間的相關性2.3數(shù)據(jù)預處理異常點檢驗
2.3數(shù)據(jù)預處理異常點檢驗下面兩個函數(shù)定義了上述兩種異常值檢測方法,輸入DataFrame格式的數(shù)據(jù)并指定要考察異常值的數(shù)據(jù)列名,函數(shù)便會返回離群值的標識defsigma_outlier(data,qty_col):
upper=data[qty_col].mean()+
3
*data[qty_col].std()
lower=data[qty_col].mean()-
3
*data[qty_col].std()
returndata[
(data[qty_col]>upper)|(data[qty_col]<lower)].index.tolist()defquantile_outlier(data,qty_col):
q1=data[qty_col].quantile(q=0.25)
q3=data[qty_col].quantile(q=0.75)
upper=q3+
1.5
*(q3-q1)
lower=q1-
1.5
*(q3-q1)
returndata[(data[qty_col]>upper)|(data[qty_col]<lower)].index
2.4評價預測模型的方法在預測任務中,兩組不同的預測結果何者更好,往往并不直觀。在某些數(shù)據(jù)集上一種方法可能比另一種方法的預測結果更接近真實值,而在其他數(shù)據(jù)集上則可能反之因此,我們需要一套規(guī)范化的指標對預測結果進行評估,以便選擇最合適的預測方法2.4評價預測模型的方法樣本內(nèi)外誤差數(shù)據(jù)泄露(dataleakage):其實質(zhì)是進行模型評估的數(shù)據(jù)同時被用于模型訓練,為了更好地預測未來值,而不是最優(yōu)擬合歷史數(shù)據(jù),所以需要避免數(shù)據(jù)泄露模型在已知數(shù)據(jù)集上表現(xiàn)優(yōu)于在未知數(shù)據(jù)集上表現(xiàn)的現(xiàn)象,被稱為過擬合,這樣的模型被稱為泛化能力差。這種現(xiàn)象是預測中常常會遇到的,需要盡力避免進行模型訓練和模型評估所用的數(shù)據(jù)集應該沒有交集,以避免因數(shù)據(jù)泄露導致的對模型的不公允評估與選擇2.4評價預測模型的方法樣本內(nèi)外誤差在實踐中,將數(shù)據(jù)集按照一定的比例切分為訓練集(即用于模型訓練的數(shù)據(jù))和測試集(即用于模型評估的數(shù)據(jù))在和時間順序無關的數(shù)據(jù)集中,一般隨機選擇數(shù)據(jù)劃分為這兩個集合,以保證兩個集合具有類似的數(shù)據(jù)結構在時序場景下,需要遵循數(shù)據(jù)集的時間屬性,將靠前的數(shù)據(jù)劃分為訓練集,靠后的數(shù)據(jù)劃分為測試集。在進行切分的時候,也不再按照比例的方式?jīng)Q定兩個數(shù)據(jù)集合的大小,而是根據(jù)一個指定的時間,對數(shù)據(jù)進行前后切分模型在訓練集上給出的預測結果與真實數(shù)據(jù)的偏差程度稱為樣本內(nèi)誤差,在測試集上的偏差則稱為樣本外誤差一般而言,以最小化樣本內(nèi)誤差為目標進行各預測模型的訓練,以最小化樣本外誤差為標準進行模型間的選擇2.4評價預測模型的方法預測評估指標
2.4評價預測模型的方法預測評估指標
importnumpyasnp
defcal_mse(y_true,y_pred):
returnnp.mean([(y_pred[i]-y_true[i])**
2
foriinrange(len(y_pred))])
defcal_rmse(y_true,y_pred):
returnnp.sqrt(cal_mse(y_true,y_pred))
defcal_mae(y_true,y_pred):
returnnp.mean([abs(y_pred[i]-y_true[i])foriinrange(len(y_pred))])
2.4評價預測模型的方法預測評估指標defcal_mape(y_true,y_pred):
returnnp.mean([abs(y_pred[i]-y_true[i])/max(1.0,y_true[i])foriin
range(len(y_pred))])
defcal_wmape(y_true,y_pred):
sum_error=sum([abs(y_pred[i]-y_true[i])foriinrange(len(y_pred))])
sum_true=max(1.0,sum(y_true))
returnsum_error/sum_true
在需求預測業(yè)務中,我們常將wMAPE視為模型的錯誤率,而將1-wMAPE作為模型準確性的一個代表defpred_evaluate(y_true,y_pred):
returnround(max(0,1
-cal_wmape(y_true,y_pred)),3)2.4評價預測模型的方法誤差分析常見的誤差來源數(shù)據(jù)性質(zhì)數(shù)據(jù)不完整,所收集的數(shù)據(jù)中遺漏了某些對結果具有影響力的重要因素數(shù)據(jù)的聚合程度較低時,數(shù)據(jù)中的隨機性影響較大用于數(shù)據(jù)評估的測試集性質(zhì)也會影響評估效果需求性質(zhì)產(chǎn)品需求本身具有特殊性質(zhì)或可預測性較低產(chǎn)品正處于需求拐點期模型方法模型的錯誤選擇或是模型的不當調(diào)試現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)第3章時間序列方法數(shù)據(jù)集本節(jié)采用’DC001_SKU044’的周度銷售數(shù)據(jù)作為示例導入上一章定義的預測相關的基本函數(shù)讀入并篩選數(shù)據(jù)繪制該unit的周銷量趨勢數(shù)據(jù)集選擇2020年4月1日為分割時間點,在此之前的數(shù)據(jù)為訓練集,共117條數(shù)據(jù),在此之后的數(shù)據(jù)為測試集,共18條數(shù)據(jù),測試集比例為13.3%#數(shù)據(jù)切分
unit_data=unit_data.set_index('date')['sale']
test_start_date=pd.Timestamp(2020,4,1)
unit_train_data=unit_data[unit_data.index<test_start_date]
unit_test_data=unit_data[unit_data.index>=test_start_date]3.1指數(shù)平滑方法移動平均法基本思想:利用過去一段時間數(shù)據(jù)的均值,作為對未來的預測需要決定的參數(shù):選擇過去多長時間的數(shù)據(jù),即預測窗口期代碼示例forwindow_lengthin[2,8]:
unit_fit=unit_data.rolling(window=window_length).mean()
plot_fitness(unit_data,unit_fit)3.1指數(shù)平滑方法移動平均法窗口期越短,對數(shù)據(jù)的變動跟蹤地越緊密細致;窗口期越長,則越能反應數(shù)據(jù)的平均變動趨勢3.1指數(shù)平滑方法簡單指數(shù)平滑法
3.1指數(shù)平滑方法簡單指數(shù)平滑法
3.1指數(shù)平滑方法簡單指數(shù)平滑法
defsimple_exp_smoothing(data,initialization=None,alpha=0.4):
"""
data:歷史需求序列,索引為時間,值為歷史需求值
initialization:初始化值,默認為原始數(shù)據(jù)的首個觀察值,也可設定為一段時間均值
alpha:模型參數(shù),默認設置為0.4
"""
ifinitializationis
None:
fitting=[data.values[0]]
else:
fitting=[initialization]
foriinrange(len(data)):
fitting.append(alpha*data.values[i]+(1
-alpha)*fitting[-1])
returnpd.Series(fitting[:-1],index=data.index)3.1指數(shù)平滑方法簡單指數(shù)平滑法
2.2需求預測方法的分類簡單指數(shù)平滑法3.1指數(shù)平滑方法簡單指數(shù)平滑法
fromstatsmodels.tsa.apiimportSimpleExpSmoothing
defalpha_fitting(data):
model=SimpleExpSmoothing(data).fit()
returnmodel.model.params["smoothing_level"]3.1指數(shù)平滑方法簡單指數(shù)平滑法利用該函數(shù),得到最小化訓練集上均方誤差的最優(yōu)參數(shù)約為0.9。將最優(yōu)參數(shù)下的模型帶入測試集進行預測,整體預測準確率為71.1%best_alpha=alpha_fitting(unit_train_data)
pred=simple_exp_smoothing(unit_test_data,unit_train_data[-1],best_alpha)
print(f'最優(yōu)模型參數(shù)為$\\alpha$={alpha}')
plot_fitness(unit_test_data,pred,
title='預測準確率為'
+str(pred_evaluate(unit_test_data,pred)))
最優(yōu)模型參數(shù)為$\alpha$=0.93.1指數(shù)平滑方法簡單指數(shù)平滑法
3.1指數(shù)平滑方法Holt-Winters方法針對簡單指數(shù)平滑法的不足,Holt和Winters分別對模型做出了改進,形成了Holt-Winters方法主要思路是將數(shù)據(jù)分解為趨勢項、季節(jié)項和水平項(可以對應于微觀因素),對于每一個構成項采用簡單指數(shù)平滑法進行預測,再逆向組合得到最終預測值根據(jù)分解方式的不同,這一方法有加法形式和乘法形式,選擇哪一種形式主要取決于季節(jié)性因素的影響方式。在實際中,我們可以同時嘗試兩種模型,并選擇評估結果更好的模型用于預測3.1指數(shù)平滑方法Holt-Winters方法
3.1指數(shù)平滑方法Holt-Winters方法通過Python對簡單指數(shù)平滑法進行額外的參數(shù)設置,便可以實現(xiàn)Holt-Winters模型的構造和使用fromstatsmodels.tsa.holtwintersimportExponentialSmoothing
defholt_winters(data,pred_length,trend='additive',damped_trend=True,
seasonal='additive',seasonal_periods=52):
model=ExponentialSmoothing(data,trend=trend,seasonal=seasonal,
damped_trend=damped_trend,
seasonal_periods=seasonal_periods).fit()
pred=model.forecast(steps=pred_length)
returnpred3.1指數(shù)平滑方法Holt-Winters方法加性模型預測效果#加性模型
pred=holt_winters(data=unit_train_data,pred_length=len(unit_test_data),
trend=’additive’,seasonal=’additive’)
plot_fitness(unit_test_data,pred,
title=’預測準確率為’
+str(pred_evaluate(unit_test_data,pred)))3.1指數(shù)平滑方法Holt-Winters方法乘性模型預測效果#乘性模型
pred=holt_winters(data=unit_train_data,pred_length=len(unit_test_data),
trend='additive',seasonal='multiplicative')
plot_fitness(unit_test_data,pred,
title='預測準確率為'
+str(pred_evaluate(unit_test_data,pred)))3.1指數(shù)平滑方法Holt-Winters方法在這組數(shù)據(jù)上,更復雜的Holt-Winters方法并沒有提供比簡單指數(shù)平滑法更好的預測這主要是因為,該方法是為趨勢性和季節(jié)性較強的數(shù)據(jù)集設計的,而本組數(shù)據(jù)覆蓋時間較短,沒有明顯的宏觀趨勢,也無法呈現(xiàn)出季節(jié)趨勢,整體而言波動較為劇烈,微觀趨勢更為明顯因此,并非越復雜的模型就一定有更好的效果,不同的模型有不同的假設和適用場景,只有根據(jù)數(shù)據(jù)選擇了合適的方法,才能最好地利用數(shù)據(jù)和模型,得到合理的預測3.2
ARIMA模型
3.2
ARIMA模型模型假設和數(shù)據(jù)檢驗某一隨機過程是(弱)平穩(wěn)序列的標準定義為:隨機過程的均值和方差是與時間無關的有限常數(shù),且兩個時間點的協(xié)方差只與時間間隔有關ARMA模型要求用于建模的數(shù)據(jù)是(弱)平穩(wěn)的,直觀來看表現(xiàn)為序列圍繞某一確定水平上下波動,不呈現(xiàn)明顯的上升或下降趨勢當原始序列非平穩(wěn)時,可以通過差分進行處理,直觀來看,對于一個帶有升降趨勢或季節(jié)周期的時間序列,兩期之間的變動可能是平穩(wěn)的,即變動序列的均值和方差不隨時間改變,從而可以首先對需求變動進行預測,再反推得到需求預測,這種包含差分過程的ARMA模型被稱為ARIMA模型考慮到模型的實際意義,差分的次數(shù)一般不會超過兩次,即差分階數(shù)一般小于23.2
ARIMA模型模型假設和數(shù)據(jù)檢驗
3.2
ARIMA模型模型假設和數(shù)據(jù)檢驗因此,在面對一個時間序列時,可以按照如下流程判斷ARIMA模型的適用性:3.2
ARIMA模型參數(shù)選擇
3.2
ARIMA模型參數(shù)選擇實踐中,可以安裝調(diào)用Pmdarima庫實現(xiàn)ARIMA模型的自動定階并完成預測,該庫同時支持對差分階數(shù)的自動擬合importpmdarimaaspm
defnonseasonal_arima_training(train,test,p,q,d=None):
"""
train:訓練數(shù)據(jù)
test:測試數(shù)據(jù)
p:自回歸項最大階數(shù)
q:移動平均項最大階數(shù)
"""
#自動選擇指定階數(shù)內(nèi)最優(yōu)模型
model=pm.auto_arima(train,
start_p=0,#p最小值
start_q=0,#q最小值
d=d,
test='adf',#如果未輸入差分值,ADF檢驗確認差分階數(shù)d
max_p=p,#p最大值
max_q=q,#q最大值
stepwise=True
#stepwise為False則不進行完全組合遍歷
)3.2
ARIMA模型參數(shù)選擇應用該方法時,需要提前給定最大滯后階數(shù),在給定的范圍內(nèi)選擇AIC最小的模型一般而言,模型滯后階數(shù)不應過大,這一方面是由ARIMA模型的性質(zhì)決定的(例如高階AR模型可以由低階MA模型等價表示),另一方面也是考慮到算力限制(過高階數(shù)有時會造成運行時間過長或是求解失?。┰趯嶋H運用中,可以考慮實際意義限制最大滯后階數(shù)pred=[]
fornew_obintest.values.tolist():
pred.append(model.predict(n_periods=1)[0])
model.update(new_ob)
returnpred,model
(接上頁)3.2
ARIMA模型參數(shù)選擇由于本節(jié)數(shù)據(jù)是周度數(shù)據(jù),選擇4階(對應一個月左右)作為最大滯后階數(shù)得到的ARIMA模型在測試集上的準確率約為72.5%,相較Holt-Winters方法有所提升,這主要因為ARIMA模型更適合捕捉數(shù)據(jù)的微觀特征在訓練集上表現(xiàn)最好的是ARIMA(1,1,1)模型,即使用滯后一階的真實數(shù)據(jù)和預測誤差,對原始數(shù)據(jù)進行一階差分后的平穩(wěn)序列進行預測#Non-SeasonalARIMA
pred,model=nonseasonal_arima_training(unit_train_data,unit_test_data,
p=4,q=4,d=1)
pred=pd.Series(pred,index=unit_test_data.index)
print(model.summary())
plot_fitness(unit_test_data,pred,
title='ARIMA,Accuracy='
+str(pred_evaluate(unit_test_data,pred)))
3.2
ARIMA模型參數(shù)選擇ARIMA模型的預測效果plot_fitness(unit_test_data,pred,
title='預測準確率為'
+str(pred_evaluate(unit_test_data,pred)))
3.2
ARIMA模型考慮季節(jié)性因素的sARIMA模型sARIMA模型是對ARIMA模型無法考慮季節(jié)性的不足進行的改進。
Pmdarima庫可以通過修改參數(shù)設置實現(xiàn)sARIMA模型sARIMA模型的預測效果plot_fitness(unit_test_data,pred,
title='預測準確率為'
+str(pred_evaluate(unit_test_data,pred)))
3.3
Prophet模型Prophet模型
3.3
Prophet模型Prophet模型
3.3
Prophet模型Prophet模型
3.3
Prophet模型Prophet模型通過AIC信息準則實現(xiàn)自動定階的VARMA模型python代碼如下fromfbprophetimportProphet
unit_train_prophet=unit_train_data.reset_index()\
.rename(columns={'date':'ds','sale':'y'})
unit_test_prophet=unit_test_data.reset_index()\
.rename(columns={'date':'ds','sale':'y'})importos
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
model=Prophet(daily_seasonality=True,weekly_seasonality=True)\
.fit(unit_train_prophet)future=model.make_future_dataframe(periods=len(unit_test_prophet),
freq='W',include_history=False)
pred=model.predict(future)
pred_prophet=pd.Series(pred['yhat'].values,index=pred['ds'])
plot_fitness(unit_test_data,pred_prophet,
title='預測準確率為'
+str(pred_evaluate(unit_test_data,pred_prophet)))3.3
Prophet模型Prophet模型Prophet模型的預測效果3.4
考慮相互作用的VARMA模型
3.4
考慮相互作用的VARMA模型VARMA模型需要輸入一個包含了相同層級全部信息的矩陣形式的歷史數(shù)據(jù),準備和模型效果評估過程代碼如下fromstatsmodels.tsa.statesp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2教案設計新方向:2024年的《認識自己》
- 山東省日照市2021-2022學年八年級上學期期中數(shù)學試題(含答案與解析)
- 2019年注冊土木工程師(水利水電工程)《專業(yè)基礎考試》真題及詳解
- 六年級上冊語文教學計劃5篇
- 人教版八年級數(shù)學下冊第二十章-數(shù)據(jù)的分析同步練習試卷(含答案解析)
- 2024屆新高考高中語文早讀及晚讀材料匯編
- 2024-2025學年新教材高中政治第一單元中國共產(chǎn)黨的領導第一課第1課時中華人民共和國成立前各種政治力量作業(yè)含解析新人教版必修3
- 2024高考生物一輪復習第4單元細胞的生命歷程含減數(shù)分裂第12講細胞的有絲分裂學案
- 通史版2025版高考歷史一輪復習作業(yè)提升練四十第二次世界大戰(zhàn)與雅爾塔體系下的冷戰(zhàn)與和平含解析
- 2024-2025學年新教材高中化學第八章化學與可持續(xù)發(fā)展第2節(jié)化學品的合理使用作業(yè)含解析新人教版必修2
- 【精】人民音樂出版社人音版五年級上冊音樂《外婆的澎湖灣》課件PPT
- 弱電維護保養(yǎng)方案
- 《建筑企業(yè)財務 》課件
- 滬科版九年級物理全一冊知識點總結(滬教版)
- 飛輪儲能在電網(wǎng)調(diào)頻中的工程應用
- 家長會課件:家庭教育為主題家長會課件
- 麻醉藥品和第一類精神藥品使用及殘余液銷毀登記記錄
- 六年級英語上冊期中考試質(zhì)量分析
- 臨床微生物學檢驗:實驗六 腸道桿菌的檢驗(一)
- Invoice商業(yè)發(fā)票模板
- 中藥房用中藥飲片用戶需求書
評論
0/150
提交評論