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()
結果如下:
另外的訓練集和測試集誤差函數曲線
真實值和測試集的預測值之間的誤差圖像