当前位置:   article > 正文

CNN-LSTM回归预测模型

cnn-lstm

 使用CNN-LSTM搭建一个简单的回归预测模型,对油耗数据进行预测分析

首先导入必要的包,主要用到numpy,pandas,matplotlib和tensorflow下面的一些网络模型

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. from tensorflow.keras.models import Sequential
  5. from tensorflow.keras.utils import plot_model
  6. from sklearn.model_selection import train_test_split
  7. from tensorflow.keras.layers import Dense, Dropout,Flatten,Activation,LSTM
  8. from sklearn.preprocessing import MinMaxScaler

采用pandas读取数据,数据集部分展示如下,其中以发动机燃油消耗率为目标值,其余变量为特征值。

数据预处理,数据集进行归一化处理。

  1. X = data.iloc[:,1:11]
  2. Y = data.iloc[:,0:1]
  3. X_transfer = MinMaxScaler()
  4. X_transfer = MinMaxScaler()
  5. x_MM = transfer.fit_transform(x)
  6. Y_MM = transfer.fit_transform(Y)

归一化后数据由Datafram格式转换为ndarray格式,归一化后的数据展示如下

归一化完成后对数据集进行切分,采用SKlearn下面的train_test_splist方法对数据进行切分,按照3:1的比例划分训练集和测试集。

x_train, x_test, Y_train, Y_test = train_test_split(X_MM, Y_MM, test_size=0.25, random_state=10,shuffle=False)

数据集划分完毕后,对特征数据添加时间步长,由于本数据集采用单步预测,故不用特别定义时间步长函数来构造时间滑窗,直接使用numpy的reshape方法即可。

  1. X_train = x_train.reshape(x_train.shape[0], 1, x_train.shape[1])
  2. X_test= x_test.reshape(x_test.shape[0], 1, x_test.shape[1])

 添加时间步长之后的特征数据形状如下。

 以上完成了对数据的基本处理,数据处理完毕之后,开始模型的搭建。构建一个由一维卷积层和LSTM组合而成的CNN-LSTM神经网络。网络代码如下。

  1. #搭建CNN-LSTM融合神经网络
  2. model = Sequential()
  3. model.add(Conv1D(filters=32, kernel_size=3, padding='same', strides=1,
  4. activation='relu', input_shape=(X_train.shape[1], X_train.shape[2]))) # input_shape=(X_train.shape[1], X_train.shape[2])
  5. model.add(MaxPooling1D(pool_size=1))
  6. model.add(LSTM(16, return_sequences=True))
  7. model.add(LSTM(8, return_sequences=False))
  8. model.add(Dense(1))
  9. model.compile(loss='mse', optimizer='adam')

 网络搭建完成之后,对网络进行拟合训练。

  1. # 拟合网络
  2. history = model.fit(X_train, Y_train, epochs=100, batch_size=256, shuffle=False,validation_data=(X_test,Y_test)

可以看到训练过程,还是效果还是非常好的.

 训练完整之后对模型进行测试集和验证集预测。

  1. #在训练集和测试集上的拟合结果
  2. Y_train_predict_CNN_LSTM= model.predict(X_train)
  3. Y_test_predict_CNN_LSTM= model.predict(X_test)
  4. #反归一化
  5. Y_train_predict_CNN_LSTM_inver = X_transfer .inverse_transform(Y_train_predict_CNN_LSTM)
  6. Y_test_predict_CNN_LSTM_inver = X_transfer .inverse_transform(Y_test_predict_CNN_LSTM)
  7. Y_train_inver = transfer_y.inverse_transform(Y_train)
  8. Y_test_inver = transfer_y.inverse_transform(Y_test)

输出模型评价指标。

  1. #输出结果
  2. from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score
  3. print('CNN-LSTM训练集上的MAE/MSE/r2')
  4. print(mean_absolute_error(Y_train_predict_CNN_LSTM_inver,Y_train_inver))
  5. print(mean_squared_error(Y_train_predict_CNN_LSTM_inver,Y_train_inver) )
  6. print(r2_score(Y_train_predict_CNN_LSTM_inver,Y_train_inver) )
  7. print('CNN-LTSM测试集上的MAE/MSE/r2')
  8. print(mean_absolute_error(Y_test_predict_CNN_LSTM_inver, Y_test_inver))
  9. print(mean_squared_error(Y_test_predict_CNN_LSTM_inver, Y_test_inver))
  10. print(r2_score(Y_test_predict_CNN_LSTM_inver, Y_test_inver))

 绘制训练Loss曲线。

  1. # 绘制图像
  2. plt.figure(1,figsize=(12,6),dpi=80)
  3. plt.plot(history.history['loss'], label='Train')
  4. plt.plot(history.history['val_loss'], label='Vavid')
  5. plt.title('loss curve')
  6. plt.legend()
  7. plt.show()

 绘制真实值和预测值对比图。

  1. plt.figure(2,figsize=(12,6),dpi=80)
  2. plt.plot(range(len(Y_test_inver)),Y_test,color='k',label='真实值')
  3. plt.plot(range(len(Y_test_CNN_LSTM_inver)),Y_test_predict_CNN_LSTM_inver,color='',label='预测值')
  4. plt.xlabel('测试样本数量',fontsize=20)
  5. plt.ylabel('油耗/(L/h)',fontsize=20)
  6. plt.tick_params(labelsize=20)
  7. plt.legend(fontsize=20)
  8. plt.savefig("真实值和预测值对比.svg", dpi=80,format="svg")
  9. plt.show()

 需要完整代码以及咨询问题的加qq:1019312261,智能算法的改进,智能算法与神经网络结合等等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/237526
推荐阅读
相关标签
  

闽ICP备14008679号