使用神经网络解决时间序列预测问题的好处是网络可以在获得新数据时对权重进行更新。
在本教程中,你将学习如何使用新数据更新长短期记忆(LTCM)递归神经网络。
在学完本教程后,你将懂得:
让我们开始吧。
如何在时间序列预测问题中于训练期间更新LSTM
照片由 Esteban Alvarez拍摄并保留部分权利
教程概览
本教程分为 9 部分,它们分别是:
环 境
本教程假设您已安装Python SciPy 环境。您在学习本示例时可使用Python 2 或 3。
本教程假设您已使用TensorFlow或Theano后端安装Keras(2.0或更高版本)。
本教程还假设您已安装scikit-learn、Pandas、 NumPy 和 Matplotlib。
如果您在安装Python环境时需要帮助,请查看这篇文章:
洗发水销量数据集
该数据集描述某洗发水在3年内的月度销量。
数据单位为销售量,共有36个观察值。原始数据集由Makridakis、Wheelwright和Hyndman(1998)提供。
您可通过此链接下载和进一步了解该数据集。
下方示例代码加载并生成已加载数据集的视图。
运行该示例,以Pandas序列的形式加载数据集,并打印出头5行。
然后就可生成显示明显增长趋势的序列线图。
洗发水销量数据集线图
接下来,我们来看看本试验中使用的LSTM配置和测试工具。
试验测试工具
此部分描述本教程使用的测试工具。
数据划分
我们将把洗发水销量数据集分为两个集合:一个训练集和一个测试集。
前两年的销售数据将作为训练数据集,最后一年的数据将作为测试集。
我们将使用训练数据集创建模型,然后对测试数据集进行预测。
对测试数据集的持续性(persistence)预测(天真预测)的误差为136.761(单位:洗发水月度销量)。这种预测方法为测试工具提供了一个较低的性能合格界限。
模型评测
我们将使用滚动预测的方式,也称为步进式模型验证。
以每次一个的形式运行测试数据集的每个时间步。使用模型对时间步作出预测,然后收集测试组生成的实际预期值,模型将利用这些预期值预测下一时间步。
这模拟了现实生活中的场景,新的洗发水销量观察值会在月底公布,然后被用于预测下月的销量。
训练数据集和测试数据集的结构将对此进行模拟。我们将一步生成所有的预测。
最后,收集所有测试数据集的预测,计算误差值总结该模型的预测能力。采用均方根误差(RMSE)的原因是这种计算方式能够降低粗大误差对结果的影响,所得分数的单位和预测数据的单位相同,即洗发水月度销量。
数据准备
在用数据集拟合LSTM模型前,我们必须对数据进行转化。
在匹配模型和进行预测之前须对数据集进行以下三种数据转化。
在进行计算和得出误差分数之前,对预测值进行这些转化的逆转化使它们恢复至原来的区间内。
LSTM模型
我们将使用滚动预测的方式,也称为步进式模型验证。
须将批大小设置为1,因为我们将应用步进式验证法,对最后 12 个月的各月数据进行一步预测。
批大小为 1 意味着要使用在线训练(而不是批训练或 mini-batch 训练)的方法拟合模型。因此,模型拟合预计将会产生一些偏差。
理论上,需要使用更多的训练 epoch(例如 1000 或 1500),但是为了使运行次数处在合理区间,我们将epoch数减至500。
我们将使用高效的ADAM优化算法和均方误差损失函数拟合这个模型。
试验运行
每种试验方案将进行10次试验。
这样做的原因是LSTM网络的初始条件随机生成,得出的结果会大不相同,每进行一次试验,给定配置都会受到训练。
让我们开始进行试验吧。
试验:无更新
在第一个试验中,我们要评测的 LSTM 只受过一次训练,并且用来对每一个时间步进行预测。
我们称它为“不更新模型”或者“不变模型”,因为一旦先用训练数据拟合模型后,模型就不会进行更新。这就为我们提供了一个性能基准,我们希望在对模型进行适度更新的试验中,得出的性能能够优于该性能基准。
完整的代码编写如下所示:
运行示例,保存使用步进式验证法算得的测试数据集均方根误差分数。将这些分数保存在一个名为 experiment_fixed.csv 的文件夹中,之后会对它们进行分析。打印分数总结,如下所示。
从这些结果可以看出,该模型的测试均方根误差为 109.565465,而持续性(persistence )模型的均方根误差为 136.761(单位为洗发水月度销量),对比之下该模型的平均性能要优于持续性模型。
接下来,我们将开始探讨在进行步进式验证时更新模型的配置
试验:2 Update Epochs
在此试验中,我们将用所有训练数据拟合模型,然后在进行步进式验证期间于每次预测结束之后对模型进行更新。
然后将测试集中用于得出预测的每个测试模式添加到训练数据集中,这样模型就会得到更新。
在此试验中,在进行下一次预测之前要用额外的两个训练 epoch 对模型进行拟合。
使用的代码和第一个试验中使用的代码相同。改动的代码编写如下所示。
运行该试验,将最终的测试集均方根误差分数保存在“experiment_update_2.csv” 中,打印所以结果的总结统计,如下所示:
试验:5 Update Epochs
此试验重复上述试验,在将每个测试模式添加到训练测试集后使用额外5个epoch训练该模型。
运行该试验,将最终的测试集均方根误差分数保存在“experiment_update_5.csv” 中,打印所以结果的总结统计,如下所示:
试验:10 Update Epochs
此试验重复上述试验,在将每个测试模式添加到训练测试集后使用额外10个epoch训练该模型。
运行该试验,将最终的测试集均方根误差分数保存在“experiment_update_10.csv” 中,打印所以结果的总结统计,如下所示:
试验:20 Update Epochs
此试验重复上述试验,在将每个测试模式添加到训练测试集后使用额外20个epoch训练该模型。
运行该试验,将最终的测试集均方根误差分数保存在“experiment_update_20.csv” 中,打印所以结果的总结统计,如下所示:
试验:50 Update Epochs
此试验重复上述试验,在将每个测试模式添加到训练测试集后使用额外50个epoch训练该模型。
运行该试验,将最终的测试集均方根误差分数保存在“experiment_update_50.csv” 中,打印所以结果的总结统计,如下所示:
结果比较
在本部分,我们将把上述试验中保存的结果进行比较。
我们载入每个保存的结果,用描述统计的方法进行总结,然后使用箱须图比较这些结果。
完整的代码变形如下所示:
运行试验,首先计算和打印每个试验结果的描述统计。
如果从平均性能的角度看,我们可以看到,固定模型提供了一个很好的基准性能,
但是我们发现,中等数量的更新epoch数(20和50)得出的测试均方根误差均值更大。
我们看到,少量的更新epoch得出的测试集总体性能更好,特别是2个epoch,其次是5个epoch。这是个鼓舞人心的结果。
另外,还生成了一个箱须图,比较每次试验得出的测试均方根误差结果的分布。
此图清楚显示了每次试验得出的数据的中值(绿线)和中间50%。我们从该图和平均性能可以得出相同的结论:使用少量的训练epoch(2或5)能够得出最好的总体测试均方根误差分数。
我们从该线图可以看出,当更新次数增加至20 epoch时,测试均方根误差开始增加,然后在更新次数增加至50 epoch时又开始减小。这种迹象可能表明,将训练epoch数进一步增加到相当大的数量会增强模型性能(11 * 50 epochs) ,或者这也可能是少量重复(10)的一个假象。
比较更新epoch数的箱须图
特别需要指出的是,这些结果仅仅是相对此模型配置和数据集而言的。
尽管这些试验确实为你针对预测模型问题进行类似试验提供了类似框架,但是根据此特定试验得出的这些结果很难归纳成广泛适用的结论。
延伸
本部分罗列了针对上述试验的一些延伸想法。
总 结
在本教程中,你学习了当在 Python 中进行时间序列预测时如何在获得新数据时更新 LSTM 网络。
具体而言,你学习了:
本文作者 Jason Brownlee 博士是一位学术研究员、作家、专业开发者和机器学习从业人员。他致力于帮助开发者开始学习并掌握机器学习应用。
本文由 AI100 编译,转载需得到本公众号同意。
编译:AI100
原文链接:http://machinelearningmastery.com/update-lstm-networks-training-time-series-forecasting/