《现代库存管理:模型、算法与Python实现》 课件 第3章-时间序列方法_第1页
《现代库存管理:模型、算法与Python实现》 课件 第3章-时间序列方法_第2页
《现代库存管理:模型、算法与Python实现》 课件 第3章-时间序列方法_第3页
《现代库存管理:模型、算法与Python实现》 课件 第3章-时间序列方法_第4页
《现代库存管理:模型、算法与Python实现》 课件 第3章-时间序列方法_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现代库存管理:模型、算法与Python实现第3章时间序列方法数据集本节采用’DC001_SKU044’的周度销售数据作为示例导入上一章定义的预测相关的基本函数读入并筛选数据绘制该unit的周销量趋势数据集选择2020年4月1日为分割时间点,在此之前的数据为训练集,共117条数据,在此之后的数据为测试集,共18条数据,测试集比例为13.3%#数据切分

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指数平滑方法移动平均法基本思想:利用过去一段时间数据的均值,作为对未来的预测需要决定的参数:选择过去多长时间的数据,即预测窗口期代码示例forwindow_lengthin[2,8]:

unit_fit=unit_data.rolling(window=window_length).mean()

plot_fitness(unit_data,unit_fit)3.1指数平滑方法移动平均法窗口期越短,对数据的变动跟踪地越紧密细致;窗口期越长,则越能反应数据的平均变动趋势3.1指数平滑方法简单指数平滑法

3.1指数平滑方法简单指数平滑法

3.1指数平滑方法简单指数平滑法

defsimple_exp_smoothing(data,initialization=None,alpha=0.4):

"""

data:历史需求序列,索引为时间,值为历史需求值

initialization:初始化值,默认为原始数据的首个观察值,也可设定为一段时间均值

alpha:模型参数,默认设置为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指数平滑方法简单指数平滑法

2.2需求预测方法的分类简单指数平滑法3.1指数平滑方法简单指数平滑法

fromstatsmodels.tsa.apiimportSimpleExpSmoothing

defalpha_fitting(data):

model=SimpleExpSmoothing(data).fit()

returnmodel.model.params["smoothing_level"]3.1指数平滑方法简单指数平滑法利用该函数,得到最小化训练集上均方误差的最优参数约为0.9。将最优参数下的模型带入测试集进行预测,整体预测准确率为71.1%best_alpha=alpha_fitting(unit_train_data)

pred=simple_exp_smoothing(unit_test_data,unit_train_data[-1],best_alpha)

print(f'最优模型参数为$\\alpha$={alpha}')

plot_fitness(unit_test_data,pred,

title='预测准确率为'

+str(pred_evaluate(unit_test_data,pred)))

最优模型参数为$\alpha$=0.93.1指数平滑方法简单指数平滑法

3.1指数平滑方法Holt-Winters方法针对简单指数平滑法的不足,Holt和Winters分别对模型做出了改进,形成了Holt-Winters方法主要思路是将数据分解为趋势项、季节项和水平项(可以对应于微观因素),对于每一个构成项采用简单指数平滑法进行预测,再逆向组合得到最终预测值根据分解方式的不同,这一方法有加法形式和乘法形式,选择哪一种形式主要取决于季节性因素的影响方式。在实际中,我们可以同时尝试两种模型,并选择评估结果更好的模型用于预测3.1指数平滑方法Holt-Winters方法

3.1指数平滑方法Holt-Winters方法通过Python对简单指数平滑法进行额外的参数设置,便可以实现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指数平滑方法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指数平滑方法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指数平滑方法Holt-Winters方法在这组数据上,更复杂的Holt-Winters方法并没有提供比简单指数平滑法更好的预测这主要是因为,该方法是为趋势性和季节性较强的数据集设计的,而本组数据覆盖时间较短,没有明显的宏观趋势,也无法呈现出季节趋势,整体而言波动较为剧烈,微观趋势更为明显因此,并非越复杂的模型就一定有更好的效果,不同的模型有不同的假设和适用场景,只有根据数据选择了合适的方法,才能最好地利用数据和模型,得到合理的预测3.2

ARIMA模型

3.2

ARIMA模型模型假设和数据检验某一随机过程是(弱)平稳序列的标准定义为:随机过程的均值和方差是与时间无关的有限常数,且两个时间点的协方差只与时间间隔有关ARMA模型要求用于建模的数据是(弱)平稳的,直观来看表现为序列围绕某一确定水平上下波动,不呈现明显的上升或下降趋势当原始序列非平稳时,可以通过差分进行处理,直观来看,对于一个带有升降趋势或季节周期的时间序列,两期之间的变动可能是平稳的,即变动序列的均值和方差不随时间改变,从而可以首先对需求变动进行预测,再反推得到需求预测,这种包含差分过程的ARMA模型被称为ARIMA模型考虑到模型的实际意义,差分的次数一般不会超过两次,即差分阶数一般小于23.2

ARIMA模型模型假设和数据检验

3.2

ARIMA模型模型假设和数据检验因此,在面对一个时间序列时,可以按照如下流程判断ARIMA模型的适用性:3.2

ARIMA模型参数选择

3.2

ARIMA模型参数选择实践中,可以安装调用Pmdarima库实现ARIMA模型的自动定阶并完成预测,该库同时支持对差分阶数的自动拟合importpmdarimaaspm

defnonseasonal_arima_training(train,test,p,q,d=None):

"""

train:训练数据

test:测试数据

p:自回归项最大阶数

q:移动平均项最大阶数

"""

#自动选择指定阶数内最优模型

model=pm.auto_arima(train,

start_p=0,#p最小值

start_q=0,#q最小值

d=d,

test='adf',#如果未输入差分值,ADF检验确认差分阶数d

max_p=p,#p最大值

max_q=q,#q最大值

stepwise=True

#stepwise为False则不进行完全组合遍历

)3.2

ARIMA模型参数选择应用该方法时,需要提前给定最大滞后阶数,在给定的范围内选择AIC最小的模型一般而言,模型滞后阶数不应过大,这一方面是由ARIMA模型的性质决定的(例如高阶AR模型可以由低阶MA模型等价表示),另一方面也是考虑到算力限制(过高阶数有时会造成运行时间过长或是求解失败)在实际运用中,可以考虑实际意义限制最大滞后阶数pred=[]

fornew_obintest.values.tolist():

pred.append(model.predict(n_periods=1)[0])

model.update(new_ob)

returnpred,model

(接上页)3.2

ARIMA模型参数选择由于本节数据是周度数据,选择4阶(对应一个月左右)作为最大滞后阶数得到的ARIMA模型在测试集上的准确率约为72.5%,相较Holt-Winters方法有所提升,这主要因为ARIMA模型更适合捕捉数据的微观特征在训练集上表现最好的是ARIMA(1,1,1)模型,即使用滞后一阶的真实数据和预测误差,对原始数据进行一阶差分后的平稳序列进行预测#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模型参数选择ARIMA模型的预测效果plot_fitness(unit_test_data,pred,

title='预测准确率为'

+str(pred_evaluate(unit_test_data,pred)))

3.2

ARIMA模型考虑季节性因素的sARIMA模型sARIMA模型是对ARIMA模型无法考虑季节性的不足进行的改进。

Pmdarima库可以通过修改参数设置实现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信息准则实现自动定阶的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模型需要输入一个包含了相同层级全部信息的矩阵形式的历史数据,准备和模型效果评估过程代码如下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

考虑层级结构的时间序列预测通过多个产品的需求序列往往呈现出一定的层级结构,即不同产品之间可以按照一定的指标进行聚合,由于这样的结构存在,我们将同时面对单个产品的需求序列和聚合层级的需求序列因此,我们希望得到的预测需要满足一定的实际约束,即对单产品的预测经过聚合后应该与对应聚合层级的预测相似,而一般的分步法(即分别预测再聚合)很难保证这一点本节介绍的预测模型HTS正是为了解决这一问题而提出的,通过调用scikit-hts库可以完成HTS模型的构建和使用3.5

考虑层级结构的时间序列预测HTS模型python代码实现如下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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论