时间序列预测快速入门
此示例说明如何使用深度网络设计器创建一个简单的长短期记忆 (LSTM) 网络来预测时间序列数据。
LSTM 网络是一种循环神经网络 (RNN),它通过遍历时间步并更新 RNN 状态来处理输入数据。RNN 状态包含在所有先前时间步中记住的信息。您可以使用 LSTM 神经网络,通过将先前的时间步作为输入来预测时间序列或序列的后续值。
加载序列数据
从 WaveformData
加载示例数据。要访问此数据,请以实时脚本形式打开此示例。Waveform 数据集包含以合成方式生成的具有三个通道且具有不同长度的波形。此示例训练一个 LSTM 神经网络,根据先前时间步提供的值来预测波形的将来值。
load WaveformData
可视化一些序列。
idx = 1;
numChannels = size(data{idx},2);
figure
stackedplot(data{idx},DisplayLabels="Channel " + (1:numChannels))
对于此示例,请使用辅助函数 prepareForecastingData
,该函数作为支持文件包含在此示例中,用于准备训练数据。该函数使用以下步骤准备数据:
要预测序列在将来时间步的值,请将目标指定为将值移位了一个时间步的训练序列。在输入序列的每个时间步,LSTM 神经网络都学习预测下一个时间步的值。不要在训练序列中包含最终时间步。
将数据划分为训练集(包含 90% 数据)和测试集(包含 10% 数据)。
[XTrain,TTrain,XTest,TTest] = prepareForecastingData(data,[0.9 0.1]);
为了更好地拟合并防止训练发散,您可以将预测变量和目标值归一化,以使通道的均值和单位方差为零。在进行预测时,还必须使用与训练数据相同的统计量对测试数据进行归一化。有关详细信息,请参阅使用深度网络设计器编译时间序列预测网络。
定义网络架构
要构建网络,请打开深度网络设计器。
deepNetworkDesigner
要创建序列网络,请在序列到序列分类网络(未训练) 部分中点击 LSTM。
这会打开一个适合序列分类问题的预置网络。通过编辑最终层,您可以将分类网络转换为回归网络。
首先,删除 softmax 层。
接下来,调整层的属性,使其适用于 Waveform 数据集。由于目标是预测时间序列中将来的数据点,因此输出大小必须与输入大小相同。在此示例中,输入数据有三个输入通道,因此网络输出也必须有三个输出通道。
选择序列输入层 input
,并将 InputSize 设置为 3。
选择全连接层 fc
,并将 OutputSize 设置为 3。
要检查网络是否准备好进行训练,请点击分析。深度学习网络分析器报告零错误或警告,因此,网络已准备就绪,可以开始进行训练。要导出网络,请点击导出。该 App 将网络保存在变量 net_1
中。
指定训练选项
指定训练选项。在选项中进行选择需要经验分析。要通过运行试验探索不同训练选项配置,您可以使用Experiment Manager。由于循环层一次处理一个时间步的序列数据,最终时间步中的任何填充都会对层输出产生负面影响。通过将 SequencePaddingDirection
选项设置为 "left"
,来填充或截断左侧的序列数据。
options = trainingOptions("adam", ... MaxEpochs=300, ... SequencePaddingDirection="left", ... Shuffle="every-epoch", ... Plots="training-progress", ... Verbose=false);
训练神经网络
使用 trainnet
函数训练神经网络。由于目标是回归,因此使用均方误差 (MSE) 损失。
net = trainnet(XTrain,TTrain,net_1,"mse",options);
预测将来时间步
闭环预测通过使用先前的预测作为输入来预测序列中的后续时间步。
选择第一个测试观测值。通过使用 resetState
函数重置状态,来初始化 RNN 状态。然后使用 predict
函数进行初始预测 Z
。使用输入数据的所有时间步更新 RNN 状态。
X = XTest{1}; T = TTest{1}; net = resetState(net); offset = size(X,1); [Z,state] = predict(net,X(1:offset,:)); net.State = state;
要进行进一步的预测,请遍历时间步并使用 predict
函数和上一个时间步的预测值进行预测。每次预测后,更新 RNN 状态。通过将先前的预测值迭代传递给 RNN 来预测接下来的 200 个时间步。由于 RNN 不需要输入数据来进行任何进一步的预测,因此您可以指定任意数量的时间步来进行预测。初始预测的最后一个时间步是第一个预测的时间步。
numPredictionTimeSteps = 200; Y = zeros(numPredictionTimeSteps,numChannels); Y(1,:) = Z(end,:); for t = 2:numPredictionTimeSteps [Y(t,:),state] = predict(net,Y(t-1,:)); net.State = state; end numTimeSteps = offset + numPredictionTimeSteps;
将预测值与输入值进行比较。
figure l = tiledlayout(numChannels,1); title(l,"Time Series Forecasting") for i = 1:numChannels nexttile plot(X(1:offset,i)) hold on plot(offset+1:numTimeSteps,Y(:,i),"--") ylabel("Channel " + i) end xlabel("Time Step") legend(["Input" "Forecasted"])
这种预测方法称为闭环预测。有关时间序列预测和执行开环预测的详细信息,请参阅使用深度学习进行时间序列预测。
另请参阅
dlnetwork
| trainingOptions
| trainnet
| scores2label
| 深度网络设计器