
使用MATLAB LSTM工具箱函数进行高精度时间序列预测:网络参数最优化与误差评价
指标计算
最近在折腾时间序列预测,试了试Matlab自带的LSTM工具箱,发现这玩意儿比想象中好用。直接上
实战经验,先说清楚这货的预测效果确实能打,特别是对周期性明显的数据,误差能压到肉眼难辨的程度。
先搞个电力负荷数据集练手。Matlab自带的电力消费数据挺适合入门,直接load进来就是时间序列
。数据预处理这块别偷懒,该归一化就得归一化。见过有人拿原始数据硬塞进LSTM,结果网络死活不收敛,
最后发现是量纲问题。
```matlab
data = load('powerconsumption.mat');
data = data.PowerConsumption;
dataNormalized = (data - mean(data))/std(data);
```
接下来分割训练集和测试集有个小技巧。时间序列最忌讳随机分割,必须保持时间连贯性。我一般
按时间轴切分,前80%训练,后20%验证。注意要用滑动窗口生成特征,这里设置窗口长度60步,预测步长1步
:
```matlab
numTimeSteps = length(dataNormalized);
trainRatio = 0.8;
trainSize = floor(trainRatio*numTimeSteps);
XTrain = dataNormalized(1:trainSize-60);
YTrain = dataNormalized(61:trainSize);
XTest = dataNormalized(trainSize-59:end-1);
YTest = dataNormalized(trainSize+1:end);
```
网络结构配置是重头戏。LSTM层数不是越多越好,实测单层128个隐藏单元效果最佳。全连接层记得
加dropout防止过拟合,最后输出层用全连接接回归层。注意这个sequenceInputLayer的12对应数据特征
维度,单变量时间序列就设1:
```matlab
layers = [
sequenceInputLayer(1)
lstmLayer(128,'OutputMode','sequence')