多特征(多元/多变量)下LSTM是如何利用滑动窗口持续预测未来的?

深度学习小白,若有严重错误还请轻喷。。。 应老板要求从传统的机器学习转入深度学习,学习过程中对LSTM的多特征预测有一丝不解,以下将简述一下我的思考历…
关注者
58
被浏览
58,013

9 个回答

你说的这种情况一般有两种方法来解决:

  1. 为每一个变量都训练一个预测模型,主变量模型可以使用LSTM,其他一些变化幅度较小的变量可以使用一些简单的模型,这样就不会出现预测未来值时只有主变量可以已知的情况,不过这种情况比较复杂。
  2. 多任务学习,同时预测多个变量。比如利用前24小时的ABC预测下一时刻的ABC。这种情况下,我们可以利用一个LSTM网络来对输入进行变换,得到隐状态,然后利用三个线性层分别预测三个变量,也就是ABC预测A,ABC预测B以及ABC预测C,loss为三个loss之和或者平均或者其他一些组合方式。具体可以参考我之前写的一篇文章:

一、实现效果

往期文章提到了对单列时间序列数据进行滑动窗口处理的思路,本文介绍如何对多输入单输出数据进行滑动窗口的思路。实现效果如下:

训练过程
测试集拟合效果

二、数据设置:

198行(代表198天),21列数据,其中前20列为变量,第21列为因变量。

前80%数据训练,后20%数据测试

三、滑动窗口处理:

滑动窗口尺寸为7,即可认为前7天的变量作为输入,第7天的因变量作为输出。

则输入的一组样本矩阵结构由 20×1变成 20×7

而样本数量也从原来的198变为192 ,因为前6组变量数据作为了历史样本

输入数据样本 20*198
转变后 192*20*7

四、评价指标:

RMSE = 1.1891

MAPE = 0.05319

五、部分代码:

%% LSTM 多变量单输入滑动窗口处理
clear all;
clc;
close all;
load data
% 数据处理
% 归一化(全部特征 均归一化)
output_data =data(:,end);
input_data =data(:,1:end-1);
[input_normdata,input_normopt] =mapminmax(input_data',0,1);
[output_normdata,output_normopt] = mapminmax(output_data',0,1);
k =7;          %滑动窗口处理                                                    
% 划分数据集
n = floor(0.8*size(input_normdatacell,1));%训练集,测试集样本数目划分
% LSTM 层设置,参数设置
numhidden_units1=100;
% lstm
layers = [ ...
    sequenceInputLayer(inputSize,'name','input')                             %输入层设置
 lstmLayer(numhidden_units1)                     %学习层设置
     fullyConnectedLayer(outputSize,'name','fullconnect')                     %全连接层设置(outputsize:预测值的特征维度)
    regressionLayer('name','out')];                                          %回归层
% trainoption
opts = trainingOptions('adam', ...        %优化算法
    'MaxEpochs',10, ...                   %遍历样本最大循环数
    'GradientThreshold',1,...             %梯度阈值
    'ExecutionEnvironment','cpu',...      %运算环境
    'InitialLearnRate',0.001, ...         %初始学习率
    'Plots','training-progress'...        % 打印训练进度
% 网络训练
net = trainNetwork(input_xtraincell,output_ytraincell,layers,opts);      %网络训练
                                                               %预测天数                                    
yprenorm = net.predict(input_xtestcell);   %预测