简单却好用:使用Keras 2实现基于LSTM的多维时间序列预测

朋友们好,时隔很久我又开始写时间序列相关的博客啦。

新年新气象,过去的时间序列预测博客采用版本为Keras 2.2 tensorflow-gpu 1.13.1版本实现。

本次博客的主题是:
提供一种适用于新手LSTM时间序列预测模型
十分的有效好用
同时采用Keras 2 + TensorFlow 2 实现,提供预测和验证全流程。

版本:
cuda 10.1
cudnn 8.0.5
keras 2.4.3
tensorflow-gpu 2.3.0

Keras 2.4版本仅支持TensorFlow 作为后端,参见 Keras 2.4发布,真正成为TensorFlow的Keras ,import 相比之前版本也有一些改动。

数据介绍

该数据集是一个污染数据集,我们需要用该多维时间序列去预测pollution这个维度,采用80%作为训练集,20%作为测试集。
在这里插入图片描述

开始

深度学习的第一步

import tensorflow as tf

相对于旧版本keras 这里有一些改动

from  tensorflow.keras import Sequential
from  tensorflow.keras.layers import LSTM,Dense,Activation,Dropout
from  tensorflow.keras.callbacks import History,Callback,EarlyStopping
import  numpy as np

模型实现

模型使用最简单的序贯模型,
使用双层LSTM加一个全连接层实现预测
具体结构如下

然后还添加了一个early stopping 机制


def lstm_model(train_x,train_y,config):

    model = Sequential()
    model.add(LSTM(config.lstm_layers[0],input_shape=(train_x.shape[1],train_x.shape[2]),
                   return_sequences=True))
    model.add(Dropout(config.dropout))

    model.add(LSTM(
        config.lstm_layers[1],
        return_sequences=False))
    model.add(Dropout(config.dropout))

    model.add(Dense(
        train_y.shape[1]))
    model.add(Activation("relu"))

    model.summary()

    cbs = [History(), EarlyStopping(monitor='val_loss',
                                    patience=config.patience,
                                    min_delta=config.min_delta,
                                    verbose=0)]
    model.compile(loss=config.loss_metric,optimizer=config.optimizer)
    model.fit(train_x,
                   train_y,
                   batch_size=config.lstm_batch_size,
                   epochs=config.epochs,
                   validation_split=config.validation_split,
                   callbacks=cbs,
                   verbose=True)
    return model

同时具体模型的输入输出是根据train_x和 train_y的shape来设置的。所以这是一个自适应的模型 。
只要确保train_x的维度为3,train_y的维度为2,就能流畅运行。

具体参数

#使用类实现一个配置文件
class Config:
    def __init__(self):
        self.path = './Model/'
        self.dimname = 'pollution'

        #使用前n_predictions 步去预测下一步
        self.n_predictions = 30

        #指定EarlyStopping  如果训练时单次val_loss值不能至少减少min_delta时,最多允许再训练patience次
        #能够容忍多少个epoch内都没有improvement
        self.patience = 10
        self.min_delta = 0.00001

        #指定LSTM两层的神经元个数
        self.lstm_layers = [80,80]
        self.dropout = 0.2

        self.lstm_batch_size = 64
        self.optimizer = 'adam'
        self.loss_metric = 'mse'
        self.validation_split = 0.2
        self.verbose = 1
        self.epochs = 200

    ## 是一个数组 如[64,64]
    def change_lstm_layers(self,layers):
        self.lstm_layers = layers

模型结构如图
在这里插入图片描述
由于采用了Early Stopping机制 训练28次就结束了
Epoch 28/200
438/438 [==============================] - 10s 23ms/step - loss: 8.4697e-04 - val_loss: 4.9450e-04

结果

让我们来看看结果吧
RMSE为 24.096020043963737
MAE为 13.384563587562422
MAPE为 25.183164455025054
在这里插入图片描述

在这里插入图片描述

可以看到我们这个方法虽然简单,但是预测效果是很好的~

本代码已经上传到了我的github

同时还附录了本教程的旧版本(梯度搜索部分可能有点小bug 如果使用需要仔细校对一下)

如果本文点赞过1000或者github 本项目 star 过100
我就开源 登堂入室LSTM:使用LSTM进行简单的时间序列异常检测
的新版本 更优实现。

参考

tensorflow2_tutorials_chinese

Anomaly Detection in Time Series Data Using LSTMs and Automatic Thresholding

  • 75
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 53
    评论
时间序列预测是机器学习中一个非常重要的问题,它可以在很多领域中被应用,例如股市预测、天气预测、交通流量预测等。传统上,时间序列预测通常使用一些经典的模型,比如ARIMA、VAR等。但是这些模型通常不能很好地处理多维(多变量)时间序列数据。 近年来,深度学习时间序列预测中也取得了很好的效果。其中,CNN+BiLSTM+Attention是一种非常有效的模型。本文将介绍如何使用Keras实现这个模型。 1. 数据准备 我们使用一个公开数据集,其中包含了多个城市的气温、湿度、风速等信息。在这个数据集中,我们选择了北京市的气象数据。数据集下载链接:https://www.kaggle.com/cryptexcode/mpgdata。 首先,我们需要将数据集转化为多维时间序列数据。我们将每个城市的气象数据分别作为一个维度,时间作为另一个维度。为了方便处理,我们只选择了气温和湿度两个维度,共计2个维度。 我们使用Pandas库进行数据读取和处理。代码如下: ```python import pandas as pd import numpy as np # 读取数据 data = pd.read_csv('Beijing.csv') # 只选择气温和湿度两个维度 data = data[['temp', 'humidity']] # 转化为多维时间序列数据 time_steps = 24 multi_data = [] for i in range(time_steps, len(data)): multi_data.append(data[i-time_steps:i].values) multi_data = np.array(multi_data) # 划分训练集和测试集 train_size = int(len(multi_data) * 0.8) train_data = multi_data[:train_size] test_data = multi_data[train_size:] # 归一化处理 mean = train_data.mean(axis=0) std = train_data.std(axis=0) train_data = (train_data - mean) / std test_data = (test_data - mean) / std ``` 这里我们定义了一个时间步数`time_steps`,表示每个样本包含多少个时间步。对于每个时间步,我们选择了气温和湿度两个维度。最后,我们对数据进行了归一化处理,这是为了方便模型的训练。 2. 模型搭建 下面我们来搭建模型。我们先使用CNN对每个维度的数据进行特征提取,然后使用BiLSTM对时序信息进行建模,最后使用Attention机制融合不同时刻的信息。代码如下: ```python from keras.models import Model from keras.layers import Input, Dense, Dropout, Conv1D, MaxPooling1D, LSTM, Bidirectional, Attention # 定义输入 input = Input(shape=(time_steps, 2)) # CNN进行特征提取 conv1 = Conv1D(filters=64, kernel_size=3, activation='relu')(input) maxpool1 = MaxPooling1D(pool_size=2)(conv1) conv2 = Conv1D(filters=64, kernel_size=3, activation='relu')(maxpool1) maxpool2 = MaxPooling1D(pool_size=2)(conv2) dropout1 = Dropout(0.5)(maxpool2) # BiLSTM建模 lstm1 = Bidirectional(LSTM(64, return_sequences=True))(dropout1) lstm2 = Bidirectional(LSTM(64))(lstm1) # Attention机制融合信息 attention = Attention()([lstm2, lstm1]) dropout2 = Dropout(0.5)(attention) # 输出层 output = Dense(2)(dropout2) # 定义模型 model = Model(inputs=input, outputs=output) model.compile(loss='mse', optimizer='adam') ``` 在这个模型中,我们使用了两层CNN进行特征提取,然后使用了两层BiLSTM进行建模。最后,我们使用了Attention机制融合不同时刻的信息,得到最终的输出结果。模型使用了均方误差作为损失函数,使用了Adam优化器进行训练。 3. 模型训练 模型搭建完成后,我们可以开始进行模型训练。代码如下: ```python # 训练模型 history = model.fit(train_data, train_data, epochs=50, batch_size=64, validation_split=0.2) ``` 这里我们使用了训练集作为输入和输出,进行无监督学习。模型训练完成后,我们可以使用测试集进行评估。代码如下: ```python # 测试模型 test_loss = model.evaluate(test_data, test_data) print('Test loss:', test_loss) ``` 4. 结果分析 最后,我们可以使用matplotlib库将预测结果可视化。代码如下: ```python import matplotlib.pyplot as plt # 预测结果 pred_data = model.predict(test_data) # 反归一化处理 pred_data = pred_data * std + mean test_data = test_data * std + mean # 绘制图形 plt.figure(figsize=(10, 6)) plt.plot(pred_data[:, 0], label='Predicted Temp') plt.plot(test_data[:, 0], label='True Temp') plt.legend() plt.show() ``` 这里我们只绘制了气温的预测结果。可以看到,我们的模型能够很好地拟合测试集的数据,并且预测结果与真实值非常接近。 总结 在本文中,我们介绍了如何使用Keras实现CNN+BiLSTM+Attention的多维(多变量)时间序列预测模型。这个模型能够很好地处理多维时间序列数据,并且在气象数据集上取得了非常好的效果。
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值