《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第3章-時間序列方法_第1頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第3章-時間序列方法_第2頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第3章-時間序列方法_第3頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第3章-時間序列方法_第4頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第3章-時間序列方法_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

現(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ù)有時會造成運行時間過長或是求解失敗)在實際運用中,可以考慮實際意義限制最大滯后階數(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.statespace.varmaximportVARMAX

defvarmax(train,test):

model=VARMAX(train).fit()

pred=pd.DataFrame()

foriinrange(len(test)):

iflen(pred)==

0:

pred=model.forecast()

else:

pred=pd.concat([pred,model.forecast()])

model=model.append(pd.DataFrame(test.iloc[i]).T)

returnpred,modelpred,model=varmax(sku_train_data,sku_test_data)

unit_accuracy_dict={unit:pred_evaluate(sku_test_data[unit],pred[unit])

forunitinunit_list}

print("VARMA模型的平均預測準確率為:"

+str(np.mean(list(unit_accuracy_dict.values()))))3.5

考慮層級結構的時間序列預測通過多個產(chǎn)品的需求序列往往呈現(xiàn)出一定的層級結構,即不同產(chǎn)品之間可以按照一定的指標進行聚合,由于這樣的結構存在,我們將同時面對單個產(chǎn)品的需求序列和聚合層級的需求序列因此,我們希望得到的預測需要滿足一定的實際約束,即對單產(chǎn)品的預測經(jīng)過聚合后應該與對應聚合層級的預測相似,而一般的分步法(即分別預測再聚合)很難保證這一點本節(jié)介紹的預測模型HTS正是為了解決這一問題而提出的,通過調(diào)用scikit-hts庫可以完成HTS模型的構建和使用3.5

考慮層級結構的時間序列預測HTS模型python代碼實現(xiàn)如下fromhtsimportHTSRegressor

defhts(data,pred_period,model_choice='auto_arima',revision_choice='OLS'):

"""

data:索引是時間序列,列名為DC,值周總銷量

model_choice:'auto_arima'、'holt_winters'、'sarimax'、'prophet'

revision_choice:

'OLS','WLSS','WLSV'

'OLS'-optimalcombinationusingordinaryleastsquares(Default),

'WLSS'-optimalcombinationusingstructurallyweightedleastsquares,

'WLSV'-optimal

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論