• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

归一化和反归一化在Bi-LSTM多特征时序预测应用附实操代码

武飞扬头像
weixin_50025625
帮助1

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

目录


前言

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


一、 Bi-LSTM 是什么?

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

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

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

1.归一化的好处:

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

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

2.反归一化的好处:

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

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

1.归一化

学新通

2.反归一化

学新通

学新通

四、实操代码

1.导入相关库

代码如下:

  1.  
    import numpy as np
  2.  
    from sklearn.preprocessing import MinMaxScaler
  3.  
    import keras
  4.  
    from tensorflow.keras.callbacks import EarlyStopping
  5.  
    from gc import callbacks

2.构建样本集

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

代码如下:

  1.  
    #构建样本集
  2.  
    n = 1000
  3.  
    input_dim = 5
  4.  
    time_steps = 10
  5.  
    data0 = np.random.rand(n, input_dim 1)*3
  6.  
    data = []
  7.  
    #基于时间步time_steps创建样本
  8.  
    for i in range(0, data0.shape[0]-time_steps):  
  9.  
        data_i = data0[i:i time_steps, :]
  10.  
        data.append(data_i)
  11.  
    data = np.array(data)
  12.  
     
  13.  
    #划分训练集和测试集
  14.  
    ratio = 0.65
  15.  
    k = int(ratio*data.shape[0])
  16.  
    train = data[:k]
  17.  
    test = data[k:]
学新通

3.数据归一化

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

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

4.训练模型并进行预测

  1.  
    #划分XY
  2.  
    X_train = train_norm[:, :, :-1]
  3.  
    X_test = test_norm[:, :, :-1]
  4.  
    Y_train = train_norm[:, -1, -1] # 实际上Y部分不需要时序扩充
  5.  
    Y_test = test_norm[:, -1, -1]
  6.  
     
  7.  
    #建立bilstm模型
  8.  
    modell = keras.Sequential()
  9.  
    modell.add(keras.layers.Bidirectional(
  10.  
    keras.layers.LSTM(units=128, batch_input_shape=(n, time_steps, input_dim)))) # relu
  11.  
    modell.add(keras.layers.Dense(1))
  12.  
    modell.compile(loss='mean_squared_error', optimizer='adam')
  13.  
     
  14.  
    #训练模型
  15.  
    monitor = EarlyStopping(monitor='loss', patience=30)
  16.  
    history = modell.fit(X_train, Y_train, callbacks=[monitor], epochs=10)
  17.  
     
  18.  
    #预测
  19.  
    predict = modell.predict(X_test)
学新通

5.预测结果的反归一化

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

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

  1.  
    #反归一化
  2.  
    max_standard = scaler.data_max_[-1]
  3.  
    min_standard = scaler.data_min_[-1]
  4.  
     
  5.  
    real_predict = predict*(max_standard-min_standard) min_standard
  6.  
    real_y=Y_test*(max_standard-min_standard) min_standard

总结

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiaggfb
系列文章
更多 icon
同类精品
更多 icon
继续加载