柚子快報邀請碼778899分享:CNN-LSTM回歸預(yù)測模型
?使用CNN-LSTM搭建一個簡單的回歸預(yù)測模型,對油耗數(shù)據(jù)進行預(yù)測分析
首先導(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ā)動機燃油消耗率為目標(biāo)值,其余變量為特征值。
數(shù)據(jù)預(yù)處理,數(shù)據(jù)集進行歸一化處理。
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ù)展示如下
歸一化完成后對數(shù)據(jù)集進行切分,采用SKlearn下面的train_test_splist方法對數(shù)據(jù)進行切分,按照3:1的比例劃分訓(xùn)練集和測試集。
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ù)集劃分完畢后,對特征數(shù)據(jù)添加時間步長,由于本數(shù)據(jù)集采用單步預(yù)測,故不用特別定義時間步長函數(shù)來構(gòu)造時間滑窗,直接使用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ù)據(jù)形狀如下。
?以上完成了對數(shù)據(jù)的基本處理,數(shù)據(jù)處理完畢之后,開始模型的搭建。構(gòu)建一個由一維卷積層和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ò)搭建完成之后,對網(wǎng)絡(luò)進行擬合訓(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)練過程,還是效果還是非常好的.
?訓(xùn)練完整之后對模型進行測試集和驗證集預(yù)測。
#在訓(xùn)練集和測試集上的擬合結(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)
輸出模型評價指標(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測試集上的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曲線。
# 繪制圖像
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()
?繪制真實值和預(yù)測值對比圖。
plt.figure(2,figsize=(12,6),dpi=80)
plt.plot(range(len(Y_test_inver)),Y_test,color='k',label='真實值')
plt.plot(range(len(Y_test_CNN_LSTM_inver)),Y_test_predict_CNN_LSTM_inver,color='',label='預(yù)測值')
plt.xlabel('測試樣本數(shù)量',fontsize=20)
plt.ylabel('油耗/(L/h)',fontsize=20)
plt.tick_params(labelsize=20)
plt.legend(fontsize=20)
plt.savefig("真實值和預(yù)測值對比.svg", dpi=80,format="svg")
plt.show()
?需要完整代碼以及咨詢問題的加qq:1019312261,智能算法的改進,智能算法與神經(jīng)網(wǎng)絡(luò)結(jié)合等等。
柚子快報邀請碼778899分享:CNN-LSTM回歸預(yù)測模型
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。