主要内容

基于深度学习的时间序列预测

这个例子展示了如何使用长短期记忆(LSTM)网络预测时间序列数据。

要预测序列的未来时间步的值,可以训练序列到序列回归LSTM网络,其中响应是值移动一个时间步的训练序列。也就是说,在输入序列的每个时间步,LSTM网络学习预测下一个时间步的值。

要预测未来多个时间步长的值,使用predictAndUpdateState函数一次预测一个时间步骤,并在每次预测时更新网络状态。

此示例使用数据集水痘.该实例训练了一个LSTM网络,根据前几个月的病例数预测水痘病例数。

加载序列数据

加载示例数据。水痘包含单个时间序列,时间步长对应月份,值对应案例数。输出是一个单元格数组,其中每个元素都是一个时间步骤。将数据重塑为行向量。

数据= chickenpox_dataset;数据=({}):数据;图绘制(数据)包含(“月”)伊拉贝尔(“案例”)头衔(“每月水痘病例”

对训练和测试数据进行分区。训练序列的前90%,测试序列的后10%。

NUMTIMESTEPTRAIN=地板(0.9*numel(数据));dataTrain=数据(1:numTimeStepsTrain+1);数据测试=数据(NUMTIMESTEP应变+1:结束);

标准化数据

为了更好的拟合和防止训练发散,将训练数据标准化,使其均值和单位方差均为零。在预测时,必须使用与训练数据相同的参数对测试数据进行标准化。

mu=平均值(数据序列);sig=标准值(数据序列);数据序列标准化=(数据序列-mu)/sig;

准备预测和响应

为了预测序列未来时间步长的值,将响应指定为平移一个时间步长的训练序列。即在输入序列的每一个时间步长,LSTM网络学习预测下一个时间步长的值。预测器是没有最后时间步长的训练序列。

XTrain=标准化数据列车(1:end-1);YTrain=数据列车标准化(2:结束);

定义LSTM网络架构

创建LSTM回归网络。指定LSTM层具有200个隐藏单位。

numFeatures = 1;numResponses = 1;numHiddenUnits = 200;层= [...sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits) fulllyconnectedlayer (numResponses) regressionLayer];

指定培训选项。将解算器设置为“亚当”并训练250个历元。为防止梯度爆炸,将梯度阈值设置为1。指定初始学习率0.005,并在125个历元后乘以系数0.2,降低学习率。

选项=培训选项(“亚当”...“MaxEpochs”,250,...“梯度阈值”1....“InitialLearnRate”, 0.005,...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”, 125,...“LearnRateDropFactor”, 0.2,...“冗长”,0,...“阴谋”“训练进步”);

火车LSTM网络

使用指定的训练选项来训练LSTM网络trainNetwork

net=列车网络(XTrain、YTrain、图层、选项);

预测未来时间步骤

要预测未来多个时间步长的值,使用predictAndUpdateState函数一次预测一个时间步骤,并在每次预测时更新网络状态。对于每个预测,使用之前的预测作为函数的输入。

使用与训练数据相同的参数对测试数据进行标准化。

datatest标准化= (dataTest - mu) / sig;XTest = dataTestStandardized (1: end-1);

要初始化网络状态,首先对训练数据进行预测XTrain。接下来,使用训练响应的最后一个时间步进行第一次预测(完). 循环其余预测并将上一个预测输入到predictAndUpdateState

对于大量数据、长序列或大型网络,GPU上的预测通常比CPU上的预测更快。否则,对CPU的预测通常计算得更快。对于单时间步长预测,使用CPU。要使用CPU进行预测,请设置“ExecutionEnvironment”选择predictAndUpdateState“cpu”

net=predictAndUpdateState(net,XTrain);[net,YPred]=predictAndUpdateState(net,YTrain(end));numTimeStepsTest=numel(XTest);i=2:numTimeStepsTest[net,YPred(:,i)]=predictAndUpdateState(net,YPred(:,i-1),“ExecutionEnvironment”“cpu”);结束

使用前面计算的参数使预测不标准化。

YPred=sig*YPred+mu;

训练进度图报告根据标准化数据计算的均方根误差(RMSE)。根据非标准预测计算RMSE。

欧美=人数((2:结束);rmse =√意味着(YPred-YTest)。^ 2))
rmse =248.5531

用预测值绘制训练时间序列。

图2:保持图(数据列(1:end-1))保持在…上idx=numTimeStepsTrain:(numTimeStepsTrain+NumTimeStepTest);绘图(idx,[数据(numTimeStepsTrain)YPred],“。”)持有xlabel(“月”)伊拉贝尔(“案例”)头衔(“预测”)传奇([“观察”“预测”])

将预测值与测试数据进行比较。

图子地块(2,1,1)图(YTest)保持在…上情节(YPred“。”)持有传奇([“观察”“预测”]) ylabel (“案例”)头衔(“预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”)伊拉贝尔(“错误”)头衔(“RMSE=”+ rmse)

用观测值更新网络状态

如果您可以访问预测之间的实际时间步长的值,那么您可以使用观测值而不是预测值更新网络状态。

首先,初始化网络状态。要对新序列进行预测,请使用重置网络状态重置状态。重置网络状态可防止以前的预测影响对新数据的预测。重置网络状态,然后通过对训练数据进行预测来初始化网络状态。

net=resetState(net);net=predictAndUpdateState(net,XTrain);

预测每一个时间步骤。对于每一个预测,使用前一个时间步长的观测值来预测下一个时间步长。设置“ExecutionEnvironment”选择predictAndUpdateState“cpu”

YPred=[];numTimeStepsTest=numel(XTest);i=1:numTimeStepsTest[net,YPred(:,i)]=predictAndUpdateState(net,XTest(:,i),“ExecutionEnvironment”“cpu”);结束

使用前面计算的参数使预测不标准化。

YPred=sig*YPred+mu;

计算均方根误差(RMSE)。

rmse =√意味着(YPred-YTest)。^ 2))
rmse=158.0959

将预测值与测试数据进行比较。

图子地块(2,1,1)图(YTest)保持在…上情节(YPred“。”)持有传奇([“观察”“预测”]) ylabel (“案例”)头衔(“带更新的预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”)伊拉贝尔(“错误”)头衔(“RMSE=”+ rmse)

这里,当使用观察值而不是预测值更新网络状态时,预测更准确。

另请参阅

|||

相关话题