多元 LSTM RMSE 值变得非常高

数据挖掘 机器学习 深度学习 时间序列 lstm rnn
2022-03-09 01:45:09

我想预测具有多个变量的时间序列。我正在使用 Keras 的 LSTM 类。

这是我的数据集描述:

数据集

我想预测 var1(t-1) 并且我的 X 变量是 var3(t-1) 、 var4(t-1) 、 var5(t-1) 、 var6(t-1) 和 var7(t-1)。

这就是我的模型配置的样子:

{
    "data": {

        "columns": [            
            "var1(t-1)",
            "var3(t-1)",
            "var4(t-1)",          
            "var5(t-1)",
            "var6(t-1)",
            "var7(t-1)" 
        ],
        "sequence_length": 5,
        "train_test_split": 0.80,
        "normalise": false
    },
    "training": {
        "epochs": 100,
        "batch_size":10 
    },
    "model": {
        "loss": "mse",
        "optimizer": "nadam",
        "save_dir": "saved_models_multi",
        "layers": [
            {
                "type": "lstm",
                "neurons": 200,
                "input_timesteps": 5,
                "input_dim": 5,
                "return_seq": true
            },
            {
              "type":"batch_norm"  

            },  
            {
                "type": "dropout",
                "rate": 0.4
            },

            {
                "type": "lstm",
                "neurons": 200,
                "return_seq": true
            },
            {
              "type":"batch_norm"  

            },

            {
                "type": "dropout",
                "rate": 0.4
            },
            {
                "type": "dense",
                "neurons": 50,
                "activation": "sigmoid"
            },

             {
              "type":"batch_norm"  

            },

            {
                "type": "dropout",
                "rate": 0.2
            },

            {
                "type": "lstm",
                "neurons": 200,
                "return_seq": false
            },
            {
              "type":"batch_norm"  

            },

            {
                "type": "dropout",
                "rate": 0.4
            },
            {
                "type": "dense",
                "neurons": 25,
                "activation": "sigmoid"
            },

             {
              "type":"batch_norm"  

            },

            {
                "type": "dropout",
                "rate": 0.2
            },

            {
                "type": "dense",
                "neurons": 1,
                "activation": "linear"
            }
        ]
    }
}

这是每层中的参数数量和输出形状:

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (None, 5, 200)            164800    
_________________________________________________________________
batch_normalization_1 (Batch (None, 5, 200)            800       
_________________________________________________________________
dropout_1 (Dropout)          (None, 5, 200)            0         
_________________________________________________________________
lstm_2 (LSTM)                (None, 5, 200)            320800    
_________________________________________________________________
batch_normalization_2 (Batch (None, 5, 200)            800       
_________________________________________________________________
dropout_2 (Dropout)          (None, 5, 200)            0         
_________________________________________________________________
dense_1 (Dense)              (None, 5, 50)             10050     
_________________________________________________________________
batch_normalization_3 (Batch (None, 5, 50)             200       
_________________________________________________________________
dropout_3 (Dropout)          (None, 5, 50)             0         
_________________________________________________________________
lstm_3 (LSTM)                (None, 200)               200800    
_________________________________________________________________
batch_normalization_4 (Batch (None, 200)               800       
_________________________________________________________________
dropout_4 (Dropout)          (None, 200)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 25)                5025      
_________________________________________________________________
batch_normalization_5 (Batch (None, 25)                100       
_________________________________________________________________
dropout_5 (Dropout)          (None, 25)                0         
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 26        
=================================================================
Total params: 704,201
Trainable params: 702,851
Non-trainable params: 1,350
_________________________________________________________________
Time taken: 0:00:01.914407

但是,我看到测试数据的 RMSE 值变得非常高。这是我的训练和验证损失图。

我在这里做错了什么?我的模型是否存在过度拟合问题?

请帮忙 。

在此处输入图像描述

2个回答

你肯定有过拟合的问题。关于您的模型,我几乎没有观察到:

  1. 大幅减少 LSTM 层的数量。RNN 与 CNN 不同,通常不会受益于将多个层堆叠在一起(它们的“深度”更多地在于信号的顺序性)。通常你永远不需要超过一个,最多两个。我建议你在 TensorFlow 官网上看看这个关于时间序列预测的非常好的教程。

  2. 不要在 LSTM 层之后使用 batchnorm。它们本质上是连续的,我会尽可能完整地保留输出信号。Batchnorm 减去平均值和尺度(通常在张量的最后一个轴上),这样你就会丢失来自输出序列的大量信息。

  3. 不要使用简单的 dropout。LSTM 层具有专门为循环层设计的循环丢失。恕我直言,不要对 RNN 使用 dropout 再一次,顺序信息将被扭曲/丢失。如果要添加正则化,请将 dropout 添加到网络的最后一个 Dense 层。

为了对抗过度拟合,您可以从更简单的开始:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import GRU, Dense

RNN = Sequential([
    GRU(n_lstm_units, input_shape),
    Dense(1)
])

像这样的东西可以比繁重的网络做得更好。(注意:我使用 GRU 是因为它们的参数更少(训练速度更快),而且有时表现同样出色。)

然后你可以尝试逐步建立更高级的架构。例如,在它们之间添加更多的 Dense 层和正则化,更改参数初始化、批量大小、学习率,......你的名字。

另外,请考虑使用 vanilla Dense 网络而不是 RNN。如果输入时间步的数量很小(如果我理解正确的话是 5 个),那么您可能不需要循环架构的复杂性,而密集层可以更好地完成这项工作(因为它们与后续层更完全连接)。

测试集上的高 RMSE 而训练集上的小 RMSE 是过度拟合的标志。您的情节看起来很奇怪,因为在验证集上没有过度拟合的迹象(我想标签测试意味着在您的文本之后进行验证)。这可能是由以下原因引起的:

  • 您的验证数据不代表您的测试数据,例如它们来自不同的分布,训练/验证/测试拆分未正确执行等。
  • 您过度拟合了验证集,也就是说,您已经根据您在验证集上看到的内容多次调整参数,以至于该特定集上的 RMSE 几乎是完美的,但它在其他集上并不能很好地概括

我建议使用通常的技术来防止过度拟合:从更简单的架构(更少的层和节点)开始并从那里构建,使用交叉验证来调整 dropout 概率,也许包括其他形式的正则化,等等。