1.1 对传统时序中的方法进行深入理解
①、通过画出随时间变化的销量,来看数据是否有趋势、季节、周期等特性
②、再对其进行分解(加法、乘法都需要试一下)。
③、对其进行平稳性分析,主要有观察法(均值、方差是否随时间变化而变化)和单位根检验法(P值是否小于5%,小于5%才能认为是平
稳,不然需要对其进行差分),比如1阶差分能去掉趋势,12阶差分能去掉季节性等,最后在对差分后的数据进行单位根检验。
④、数据平稳后,开始确定AR过程和MA过程的阶数。AR和MA过程阶数的判断,都可以从1阶开始模拟,逐渐增加阶数。通过对阶数模拟后
的自相关图和偏自相关图进行分析,如果发现自相关在模拟的阶数开始拖尾、偏自相关开始截尾,说明该阶数合适。但如果1阶这样,
2阶也这样,那就说明情况比较复杂,仍不能确定。
⑤、如果实在通过自相关和偏自相关图找不出合适的阶数,那么可以通过计算AIC值来确定(多找几个阶数进行对比AIC,找出最大的。比
如通过观察可以认为阶数在5阶之内,那就可以计算每个阶数的AIC值,选出最大的)。
⑥、确定p和q的阶数后就可以建立arma模型。或者也可以用Facebook的properhat来做。
扩展阅读:自相关和偏自相关图解读:https://www.biaodianfu.com/acf-pacf.html,
AR(p)模型:自相关系数拖尾,偏自相关系数p阶截尾。
MA(q)模型:自相关系数q阶截尾,偏自相关系数拖尾。
ARMA(p,q)模型:自相关系数拖尾,偏自相关系数拖尾
你给的图自相关图一阶截尾,偏自相关图显示出显著的不截尾性,可以考虑用MA(1)模型拟合二阶差分后的序列。
因为前面已经进行二阶差分运算,实际上就是用ARIMA(p,2,q)模型拟合原序列。
1.2 找更多的时序预测例子
例子1(传统的时序分析过程):https://www.kaggle.com/jagangupta/time-series-basics-exploring-traditional-ts
例子2:(简单的LSTM方法):https://www.kaggle.com/karanjakhar/simple-and-easy-aprroach-using-lstm
①、首先,需要把数据转变成 [样本数,特征数,1]这样的格式,比如每一行是一条样本,每一列是一个时间点。
②、比如时序的长度有100,训练集可以选择0~99作为训练集,它的标签是100对应的值,测试集就选择1-100,因为我们要预测第101个值。
③、当然,模型从原始时间序列上随机抽取固定长度的样本进行训练。例如,如果原始时间序列的长度为 600 天,那么把训练样本的长
度设为200天,就可以有400种不同的起始点。--效果,好了一点。排名在45%。
例子3:(MLP、LSTM、CNN、CNN+LSTM各种方法介绍):https://www.kaggle.com/dimitreoliveira/deep-learning-for-time-series-forecasting
假设原数据格式为:X=[样本数,时间步长],Y=[样本数,1],每一行就是一条样本,每一列就是一个时间(比如dt).
①、MLP:输入格式为 [样本数,时间步长],直接接dense层,输出层在接dense降维到1。例如[2000,60]
②、LSTM:输入格式为 [样本数,时间步长,特征],一般特征为1,也就是单变量时序输入。例如[2000,60,1]
③、CNN:输入格式为 [样本,时间步长,特征],过完pooling层后,需要过一个flatten层展平,把数据展成一维,再过dense降维。例如[2000,60,1]
④、CNN+LSTM:输入格式为 [样本,子序列,时间步长,特征],比如原先时间步长为60,如果设置子序列为3,则变形后的时间步长为60/3=20,特征仍为1 ,例如[2000,3,20,1],
CNN+LSTM多了一个子序列,通过TimeDistributed实现,目的是“我们将进一步将每个样本划分为更多子序列。CNN模型将解释每个子序列,而LSTM将汇总来自这些子序列的解释”
其他:
keras中TimeDistributed和RepeatVector的解释:https://blog.csdn.net/ChaoFeiLi/article/details/89323078,基本上相当于np的reshape,但是是在model中改变输入输出的形状。
LSTM层中return_sequence和return_statue的解释:https://blog.csdn.net/Ahead_J/article/details/84671396
例子4:(使用LSTM自动编码器方法):https://www.kaggle.com/dimitreoliveira/time-series-forecasting-with-lstm-autoencoders/data
①、首先,先构造encode模型,模型的输入[样本,时间步长,特征],我们假定把原时间步长压缩成一个单值,因此我们的输出加了一个dense(1)
②、encode模型的输入数据和标签,都是它自己encoder_decoder.fit(X_train,X_train,batch_size=batch,epochs=epochs)
③、通过keras中的Model,可以取出训练好的模型中的某几层,比如rpt_vector_layer = Model(inputs=encoder_decoder.inputs, outputs=encoder_decoder.layers[3].output),
然后通过rpt_vector_layer.predict(X_train[:1])进行预测输出。
④、最后,我们通过构建编码器encoder = Model(inputs=encoder_decoder.inputs, outputs=encoder_decoder.layers[2].output),来进行输出train_encoded = encoder.predict(X_train)
⑤、一般会把把自编码出来的值,加到原数据中作为一列新的特征,再训练模型。