提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录


前言

双向长短时记忆(Bi-LSTM)模型是一种常用于时间序列预测的RNN算法。本文专门针对多特征时间序列预测中归一化与反归一化问题进行讨论,旨在为新手提供一个相对详细实用的解决方案。但由于本人知识有限,如果有误,欢迎大家指正!


一、 Bi-LSTM 是什么?

为了能利用先前的信息,普通神经网络通过引入循环形成循环神经网络(RNN)。为了更好地利用先前的信息,循环神经网络利用输入门、遗忘门、输出门进行改进,保留历史数据的同时,对输入数据进行“遗忘了旧的信息,并添加了新的信息”操作,二者的存在构成了长短时记忆网络(LSTM)。而为了同时利用之后数据的信息,可输入的序列反转,重新按照LSTM的方式计算一遍输出,并将二者简单堆叠,就构成了双向长短时记忆网络(Bi-LSTM)

二、为什么要归一化和反归一化?

测试集的归一化的均值和标准偏差应该来源于训练集。

1.归一化的好处:

(1)不同特征量纲不同,可以通过归一化消除量纲的影响

(2)可以加快模型处理数据的速度

2.反归一化的好处:

通过对预测结果的反归一化,使最终结果更加直观

三、归一化和反归一化使用的公式

1.归一化

sigmoid归一 lstm归一化_python

2.反归一化

sigmoid归一 lstm归一化_lstm_02

sigmoid归一 lstm归一化_python_03

四、实操代码

1.导入相关库

代码如下:

import numpy as np
from sklearn.preprocessing import MinMaxScaler
import keras
from tensorflow.keras.callbacks import EarlyStopping
from gc import callbacks

2.构建样本集

这里采用创造随机数据的方式,构造了样本集,并划分训练集和测试集

代码如下:

#构建样本集
n = 1000
input_dim = 5
time_steps = 10
data0 = np.random.rand(n, input_dim+1)*3
data = []
#基于时间步time_steps创建样本
for i in range(0, data0.shape[0]-time_steps):  
    data_i = data0[i:i+time_steps, :] 
    data.append(data_i)
data = np.array(data)

#划分训练集和测试集
ratio = 0.65
k = int(ratio*data.shape[0])
train = data[:k]
test = data[k:]

3.数据归一化

适用于Bi-LSTM(LSTM)的多特征数据由于时间步的存在而增加了一个维度,所以归一化的方式应该做出相应的改变。主要思路是:由训练集所对应的未经时间步扩充的数据作为标准,对其他数据进行归一化。

#进行归一化
scaler = MinMaxScaler(feature_range=(0, 1))
#由于建立时滞会去除time_steps个数据,所以要加上
scaler = scaler.fit(data0[:k+time_steps])#将训练集对应的原始数据作为标准
train_norm = np.zeros((train.shape[0], train.shape[1], train.shape[2]))
test_norm = np.zeros((test.shape[0], test.shape[1], test.shape[2]))
for time in range(time_steps):
    train_norm[:, time, :] = scaler.transform(train[:, time, :])
    test_norm[:, time, :] = scaler.transform(test[:, time, :])

4.训练模型并进行预测

#划分XY
X_train = train_norm[:, :, :-1]
X_test = test_norm[:, :, :-1]
Y_train = train_norm[:, -1, -1]  # 实际上Y部分不需要时序扩充
Y_test = test_norm[:, -1, -1]

#建立bilstm模型
modell = keras.Sequential()
modell.add(keras.layers.Bidirectional(
    keras.layers.LSTM(units=128, batch_input_shape=(n, time_steps, input_dim))))  # relu
modell.add(keras.layers.Dense(1))
modell.compile(loss='mean_squared_error', optimizer='adam')

#训练模型
monitor = EarlyStopping(monitor='loss', patience=30)
history = modell.fit(X_train, Y_train, callbacks=[monitor], epochs=10)

#预测
predict = modell.predict(X_test)

5.预测结果的反归一化

对于预测的结果,往往可以使用反归一化,使最终结果更加直观

该处使用的url网络请求的数据。

#反归一化
max_standard = scaler.data_max_[-1]
min_standard = scaler.data_min_[-1]

real_predict = predict*(max_standard-min_standard)+min_standard
real_y=Y_test*(max_standard-min_standard)+min_standard

总结

以上就是本文的全部内容,本文详细叙述了针对多维输入的Bi-LSTM数据集,如何正确地进行归一化操作,并建立了一个实例供读者参考。其中代码参考了不少网友的代码,如有侵权,请联系本人。