CNN & LSTM & Conv1D+LSTM 同一數據集預測案例分析

1:前言

利用CNN、LSTM 和Conv1D+LSTM 分別對同一數據集進行預測分析,並用訓練集和測試集比較結果;

time_steps 設置爲6,經過數據預處理和數據切分處理後,輸入特徵爲4維,利用每個sample中的前5行數據預測第6個數據中的最後一個特徵數值,屬於多變量預測

代碼放在github上,GitHub地址,分爲.py文件和.ipynb文件,可以根據運行環境選擇運行不同的文件,備註:文件名相同的.py和.ipynb文件代碼相同。

算法分爲:

  • 數據預處理
  • 數據切分
  • 構建模型
  • 測試數據集驗證
  • 對比預測值和真實值損失圖像等

2:數據集

數據集爲tcs_stock_2018-05-26.csv,包含1331條記錄,時間日期從2013-01-01—2018-05-18,包含當日股票的最高值,最低值,開盤價格等數據特徵。

 

最終只保留開盤價,最高價,最低價和當日閉市價格,即:Open,High,Low,Close這四個特徵,並統一進行歸一化處理:


3:數據切分

time_step 設置爲6,將數據集切分爲訓練數據集和測試數據集,並轉換爲array格式

取出其中一個sample的數據查看:

 # 舉例:用前5行數據,預測第6行的最後一個數據
# train
 #[[[0.126695 0.12679  0.126    0.126415]
#   [0.1267   0.12724  0.125555 0.12633 ]
#   [0.1265   0.1284   0.125995 0.12806 ]
#   [0.1285   0.1301   0.12809  0.12992 ]
#   [0.13     0.1304   0.129025 0.129485]
#   [0.1295   0.13043  0.12943  0.130025]]

# x_train
# [[[0.126695 0.12679  0.126    0.126415]
#   [0.1267   0.12724  0.125555 0.12633 ]
#   [0.1265   0.1284   0.125995 0.12806 ]
#   [0.1285   0.1301   0.12809  0.12992 ]
#   [0.13     0.1304   0.129025 0.129485]]

# y_train
#[0.130025]

4:構建模型

構建CNN模型(其他LSTM和Conv1D+LSTM的build_model函數可在github上查看),下面代碼是以CNN爲例:

from __future__ import print_function
import math
from keras.models import Sequential
from keras.layers import Dense,Activation,Dropout,Flatten,Conv1D,MaxPooling1D
from keras.layers.recurrent import LSTM
from keras import losses
from keras import optimizers

def build_model(input):
    model = Sequential()
    model.add(Dense(128,input_shape=(input[0],input[1])))
    model.add(Conv1D(filters=112,kernel_size=1,padding='valid',activation='relu',kernel_initializer='uniform'))
    model.add(MaxPooling1D(pool_size=2,padding='valid'))
    model.add(Conv1D(filters=64,kernel_size=1,padding='valid',activation='relu',kernel_initializer='uniform'))
    model.add(MaxPooling1D(pool_size=1,padding='valid'))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(100,activation='relu',kernel_initializer='uniform'))
    model.add(Dense(1,activation='relu',kernel_initializer='uniform'))
    model.compile(loss='mse',optimizer='adam',metrics=['mae'])
    return model 

model = build_model([5,4,1])

# Summary of the Model
print(model.summary())

 

訓練數據預測:

# 訓練數據
from timeit import default_timer as timer
start = timer()
history = model.fit(x_train,
                    y_train,
                    batch_size=128,
                    epochs=35,
                    validation_split=0.2,
                    verbose=2)
end = timer()
print(end - start)

訓練接和測試集損失函數曲線:

# 返回history
history_dict = history.history
history_dict.keys()


# 畫出訓練集和驗證集的損失曲線

import matplotlib.pyplot as plt

loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']
loss_values50 = loss_values[0:150]
val_loss_values50 = val_loss_values[0:150]
epochs = range(1, len(loss_values50) + 1)
plt.plot(epochs, loss_values50, 'b',color = 'blue', label='Training loss')
plt.plot(epochs, val_loss_values50, 'b',color='red', label='Validation loss')
plt.rc('font', size = 18)
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.xticks(epochs)
fig = plt.gcf()
fig.set_size_inches(15,7)
#fig.savefig('img/tcstest&validationlosscnn.png', dpi=300)
plt.show()

結果如下:

另外的訓練集和測試集誤差函數曲線

真實值和測試集的預測值之間的誤差圖像

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章