柚子快報(bào)邀請(qǐng)碼778899分享:CNN-LSTM回歸預(yù)測(cè)模型
?使用CNN-LSTM搭建一個(gè)簡(jiǎn)單的回歸預(yù)測(cè)模型,對(duì)油耗數(shù)據(jù)進(jìn)行預(yù)測(cè)分析
首先導(dǎo)入必要的包,主要用到numpy,pandas,matplotlib和tensorflow下面的一些網(wǎng)絡(luò)模型。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import plot_model
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Dense, Dropout,Flatten,Activation,LSTM
from sklearn.preprocessing import MinMaxScaler
采用pandas讀取數(shù)據(jù),數(shù)據(jù)集部分展示如下,其中以發(fā)動(dòng)機(jī)燃油消耗率為目標(biāo)值,其余變量為特征值。
數(shù)據(jù)預(yù)處理,數(shù)據(jù)集進(jìn)行歸一化處理。
X = data.iloc[:,1:11]
Y = data.iloc[:,0:1]
X_transfer = MinMaxScaler()
X_transfer = MinMaxScaler()
x_MM = transfer.fit_transform(x)
Y_MM = transfer.fit_transform(Y)
歸一化后數(shù)據(jù)由Datafram格式轉(zhuǎn)換為ndarray格式,歸一化后的數(shù)據(jù)展示如下
歸一化完成后對(duì)數(shù)據(jù)集進(jìn)行切分,采用SKlearn下面的train_test_splist方法對(duì)數(shù)據(jù)進(jìn)行切分,按照3:1的比例劃分訓(xùn)練集和測(cè)試集。
x_train, x_test, Y_train, Y_test = train_test_split(X_MM, Y_MM, test_size=0.25, random_state=10,shuffle=False)
數(shù)據(jù)集劃分完畢后,對(duì)特征數(shù)據(jù)添加時(shí)間步長(zhǎng),由于本數(shù)據(jù)集采用單步預(yù)測(cè),故不用特別定義時(shí)間步長(zhǎng)函數(shù)來(lái)構(gòu)造時(shí)間滑窗,直接使用numpy的reshape方法即可。
X_train = x_train.reshape(x_train.shape[0], 1, x_train.shape[1])
X_test= x_test.reshape(x_test.shape[0], 1, x_test.shape[1])
?添加時(shí)間步長(zhǎng)之后的特征數(shù)據(jù)形狀如下。
?以上完成了對(duì)數(shù)據(jù)的基本處理,數(shù)據(jù)處理完畢之后,開(kāi)始模型的搭建。構(gòu)建一個(gè)由一維卷積層和LSTM組合而成的CNN-LSTM神經(jīng)網(wǎng)絡(luò)。網(wǎng)絡(luò)代碼如下。
#搭建CNN-LSTM融合神經(jīng)網(wǎng)絡(luò)
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, padding='same', strides=1,
activation='relu', input_shape=(X_train.shape[1], X_train.shape[2]))) # input_shape=(X_train.shape[1], X_train.shape[2])
model.add(MaxPooling1D(pool_size=1))
model.add(LSTM(16, return_sequences=True))
model.add(LSTM(8, return_sequences=False))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
?網(wǎng)絡(luò)搭建完成之后,對(duì)網(wǎng)絡(luò)進(jìn)行擬合訓(xùn)練。
# 擬合網(wǎng)絡(luò)
history = model.fit(X_train, Y_train, epochs=100, batch_size=256, shuffle=False,validation_data=(X_test,Y_test)
可以看到訓(xùn)練過(guò)程,還是效果還是非常好的.
?訓(xùn)練完整之后對(duì)模型進(jìn)行測(cè)試集和驗(yàn)證集預(yù)測(cè)。
#在訓(xùn)練集和測(cè)試集上的擬合結(jié)果
Y_train_predict_CNN_LSTM= model.predict(X_train)
Y_test_predict_CNN_LSTM= model.predict(X_test)
#反歸一化
Y_train_predict_CNN_LSTM_inver = X_transfer .inverse_transform(Y_train_predict_CNN_LSTM)
Y_test_predict_CNN_LSTM_inver = X_transfer .inverse_transform(Y_test_predict_CNN_LSTM)
Y_train_inver = transfer_y.inverse_transform(Y_train)
Y_test_inver = transfer_y.inverse_transform(Y_test)
輸出模型評(píng)價(jià)指標(biāo)。
#輸出結(jié)果
from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score
print('CNN-LSTM訓(xùn)練集上的MAE/MSE/r2')
print(mean_absolute_error(Y_train_predict_CNN_LSTM_inver,Y_train_inver))
print(mean_squared_error(Y_train_predict_CNN_LSTM_inver,Y_train_inver) )
print(r2_score(Y_train_predict_CNN_LSTM_inver,Y_train_inver) )
print('CNN-LTSM測(cè)試集上的MAE/MSE/r2')
print(mean_absolute_error(Y_test_predict_CNN_LSTM_inver, Y_test_inver))
print(mean_squared_error(Y_test_predict_CNN_LSTM_inver, Y_test_inver))
print(r2_score(Y_test_predict_CNN_LSTM_inver, Y_test_inver))
?繪制訓(xùn)練Loss曲線(xiàn)。
# 繪制圖像
plt.figure(1,figsize=(12,6),dpi=80)
plt.plot(history.history['loss'], label='Train')
plt.plot(history.history['val_loss'], label='Vavid')
plt.title('loss curve')
plt.legend()
plt.show()
?繪制真實(shí)值和預(yù)測(cè)值對(duì)比圖。
plt.figure(2,figsize=(12,6),dpi=80)
plt.plot(range(len(Y_test_inver)),Y_test,color='k',label='真實(shí)值')
plt.plot(range(len(Y_test_CNN_LSTM_inver)),Y_test_predict_CNN_LSTM_inver,color='',label='預(yù)測(cè)值')
plt.xlabel('測(cè)試樣本數(shù)量',fontsize=20)
plt.ylabel('油耗/(L/h)',fontsize=20)
plt.tick_params(labelsize=20)
plt.legend(fontsize=20)
plt.savefig("真實(shí)值和預(yù)測(cè)值對(duì)比.svg", dpi=80,format="svg")
plt.show()
?需要完整代碼以及咨詢(xún)問(wèn)題的加qq:1019312261,智能算法的改進(jìn),智能算法與神經(jīng)網(wǎng)絡(luò)結(jié)合等等。
柚子快報(bào)邀請(qǐng)碼778899分享:CNN-LSTM回歸預(yù)測(cè)模型
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。