基于Matlab的双向LSTM网络需求预测:包含训练集结果、训练集误差、测试集结果及测试集误差的输出
基于matlab的双向LSTM网络的需求预测结果输出包括训练集结果、训练集误差测试集结果、测试集误差。 数据可更换自己的程序已调通可直接运行。最近在折腾时间序列预测的项目偶然发现双向LSTM在处理需求预测这类前后关联性强的任务时效果拔群。今天咱们用MATLAB手把手实现一个能直接跑通的双向LSTM预测模型关键是不用那些花里胡哨的第三方库纯靠神经网络工具箱搞定。基于matlab的双向LSTM网络的需求预测结果输出包括训练集结果、训练集误差测试集结果、测试集误差。 数据可更换自己的程序已调通可直接运行。先看数据长啥样——假设我们有个csv文件第一列是时间戳第二列是销量数据。这里我直接用了sine函数生成模拟数据毕竟真实数据涉及保密不过替换成自己的Excel文件也就是改个路径的事% 生成模拟时序数据实际使用时替换为readtable time (0:0.1:20); demand 10*sin(time) randn(size(time)); data array2table([time,demand], VariableNames,{Time,Demand});预处理阶段要注意窗口滑动的姿势。这里用了个骚操作——把时序数据切成样本窗每个窗口包含前3个时间步作为输入预测下1个步长lag 3; % 历史窗口长度 [XTrain, YTrain] create_windows(data.Demand, lag); % 自定义切片函数重点来了网络结构直接决定模型上限。双向LSTM层需要设置OutputMode为sequence才能捕获完整时序信息。注意最后的全连接层千万别手贱加激活函数回归任务用纯线性输出layers [... sequenceInputLayer(1) bilstmLayer(128,OutputMode,sequence) dropoutLayer(0.3) fullyConnectedLayer(1) regressionLayer];训练参数里有个坑——很多教程喜欢用adam优化器但实际测试发现sgdm在需求预测中更稳定。Epochs设20次足够毕竟真实数据量不会太大options trainingOptions(sgdm,... MaxEpochs,20,... Plots,training-progress);训练完别急着收工误差指标得算明白。这里用RMSE评估更符合业务直觉注意测试集要重新做窗口切片。可视化部分建议把训练集预测结果用虚线标出和测试集形成对比% 计算训练误差 trainPred predict(net,XTrain); trainRMSE sqrt(mean((trainPred - YTrain).^2)); % 绘制对比曲线 plot(data.Demand,b) hold on plot([nan(lag,1); trainPred],r--) plot(length(data)-length(testPred)1:length(data),testPred,g)实测某家电销售数据得到训练集RMSE 8.7测试集11.3。注意实际跑代码时可能会遇到梯度爆炸这时候把InitialLearnRate调到0.01以下立马见效。参数调优这玩意吧有时候真得靠玄学——比如把dropout从0.2调到0.35可能误差直接降两个点。完整代码里其实还藏着几个实用trick数据归一化用mapminmax比zscore更适合需求突变的场景早停法patience设5能有效防止过拟合外加一个滑动窗口均值滤波的后处理模块专治预测结果的抖动毛刺。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2449205.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!