归一化和反归一化在Bi-LSTM多特征时序预测应用附实操代码
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
双向长短时记忆(Bi-LSTM)模型是一种常用于时间序列预测的RNN算法。本文专门针对多特征时间序列预测中归一化与反归一化问题进行讨论,旨在为新手提供一个相对详细实用的解决方案。但由于本人知识有限,如果有误,欢迎大家指正!
一、 Bi-LSTM 是什么?
为了能利用先前的信息,普通神经网络通过引入循环形成循环神经网络(RNN)。为了更好地利用先前的信息,循环神经网络利用输入门、遗忘门、输出门进行改进,保留历史数据的同时,对输入数据进行“遗忘了旧的信息,并添加了新的信息”操作,二者的存在构成了长短时记忆网络(LSTM)。而为了同时利用之后数据的信息,可输入的序列反转,重新按照LSTM的方式计算一遍输出,并将二者简单堆叠,就构成了双向长短时记忆网络(Bi-LSTM)。
二、为什么要归一化和反归一化?
测试集的归一化的均值和标准偏差应该来源于训练集。
1.归一化的好处:
(1)不同特征量纲不同,可以通过归一化消除量纲的影响
(2)可以加快模型处理数据的速度
2.反归一化的好处:
通过对预测结果的反归一化,使最终结果更加直观
三、归一化和反归一化使用的公式
1.归一化
2.反归一化
四、实操代码
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
总结
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiaggfb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22