利用深度学习进行序列预测时,模型参数的确定是很头疼的问题,因为模型参数的选择对于结果的影响非常大。现在最流行的深度学习模型当属长短期记忆(LSTM)了,它属于卷积神经网络(CNN)的一种改进,具有很多优点,可以避免模型发生梯度消失和梯度爆炸,而且具有长短期记忆的功能。我基于Matlab2021编写了一个BO-LSTM算法,其中BO指的是贝叶斯(Bayesian)算法,利用BO算法对LSTM模型的超参数进行优化选择,包括采取的历史回归长度、隐藏层数、隐藏层单元数、单元随机丢弃率、初始学习率,这样可以解决模型确定的问题。该程序可以直接用于对于时间序列的多步提前预测。为方便理解,我自定义了一个时间序列,然后进行了提前24步预测。可以自己根据需要进行修改,用来预测自己的序列。
下面简单对程序代码进行一个说明。
这个是程序运行的结果。结果展示了单步预测(即1步预测)和24步预测的结果。数据为随机生成。若有自己的数据可以读取,然后自行调参。这里横坐标的意义为:<=0的表示历史数据,>0的表示为未来数据。整体效果还是比较好的。
下面详细分析了24步预测误差结果。包括绝对误差、MAE、RMSE、MAPE。总体来说结果还行,但是这个是因为序列本身具有一定规律。这个结果每次是不一样的,有多种原因,模型训练结果也存在一定离散性,导致结果有所不同。
模型的训练过程,贝叶斯优化我选取了最大迭代步数为20步,通常默认为30步。下面是迭代过程的目标函数示意图。贝叶斯算法可以根据当前的历史结果,预测下一个最优点的位置,然后确定参数,然后训练,得到结果,再以此往复。
因为迭代需要20步,我的程序默认选择不显示每次迭代的收敛过程。如果需要看的话可以自己修改程序代码,将'Plots',"none", ... 修改为'Plots',"training-progress", ... 如果开启了查看收敛过程,会出现20个下面这种图。建议第一次运行的时候打开,这样可以看自己的收敛过程是否合理。
下面简单说明一下程序的实现思路和代码截图。
1.程序首先新建一个临时文件夹,用于存放贝叶斯优化过程的每次结果,以便优化后进行文件的调取。
2.创建时间序列数据。如果有真实的数据的话,建议用load或dlmread命令读取数据文件,此处必须保证时间序列变量为行向量。我这里用的是随机信号,省的还要上传数据文件,太麻烦了。这样一个m文件就可以搞定了。
3.确定要用哪些数据作为测试集,我这里是取了最后24个数据,作为测试集,也就相当于未来的数据。其它数据同时作为训练集和验证集。
注意:有的研究只设置了训练集,然后训练过程尽可能保证训练集的误差小。我觉得这种做法欠妥,很容易陷入过拟合的问题。所以我添加了验证集,训练过程需要查看验证集的误差情况。
4.设置优化器。确定LSTM模型的哪些参数是可能需要改变的,我这里选择了5种参数,包括采取的历史回归长度、隐藏层数、隐藏层单元数、单元随机丢弃率、初始学习率。可以自己定义参数的范围,这样贝叶斯算法就可以在这些参数范围内进行寻优。最大迭代次数我设置为了20步。
5.调用自定义的目标函数,利用贝叶斯算法对LSTM模型的超参数进行优化。目标函数的定义如下(仅展示了部分代码)。我觉得这部分是贝叶斯优化的核心,有点类似于遗传算法的适应度计算。
6.将训练的最优结果对应的超参数进行读取识别,同时读取最优超参数下的训练得到的LSTM模型。
7.根据最佳超参数,评估训练集和测试集的误差。这一步我是为了保险,如果只是为了预测,这一步可以不要。
8.进行单步预测和24步预测。我这里同时做了单步和24步预测,实际上我需要的只是24步预测,这个在风电预测里面比较常见。单步预测结果我也计算了,只是为了进行一个对比。现在很多文献都只对比单步预测的结果,我觉得这个是很扯的一件事情。事实上,单步预测我觉得意义并不大,只有对未来若干数据进行预测才有价值。当然这只是我个人的观点。欢迎大家讨论!
9.误差分析。我这里展示了4种误差的图,这也是最常用的误差评估指标了。
以上就是全部内容了!程序我只展示了部分,完整的下载链接请点击:基于贝叶斯优化算法的LSTM模型时间序列多步预测Matlab程序代码。(非免费,十几块钱,权当尊重一下劳动吧哈哈)。如果有问题也欢迎留言讨论,或者联系我的邮箱huweicheng92@163.com,我做了一些风速智能预测的研究,如果有能一起合作写文章的也非常欢迎。
————————————————
版权声明:本文为CSDN博主「hwc_yzt」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38919810/article/details/124768458