Keras 实现 LSTM
所用項(xiàng)目和數(shù)據(jù)集來自:真實(shí)業(yè)界數(shù)據(jù)的時(shí)間序列預(yù)測挑戰(zhàn)。
1 項(xiàng)目簡單介紹
1.1 背景介紹
本項(xiàng)目的目標(biāo)是建立內(nèi)部與外部特征結(jié)合的多時(shí)序協(xié)同預(yù)測系統(tǒng)。數(shù)據(jù)集采用來自業(yè)界多組相關(guān)時(shí)間序列(約40組)與外部特征時(shí)間序列(約5組)。課題通過進(jìn)行數(shù)據(jù)探索,特征工程,傳統(tǒng)時(shí)序模型探索,機(jī)器學(xué)習(xí)模型探索,深度學(xué)習(xí)模型探索(RNN,LSTM等),算法結(jié)合,結(jié)果分析等步驟來學(xué)習(xí)時(shí)序預(yù)測問題的分析方法與實(shí)戰(zhàn)流程。
1.2 數(shù)據(jù)集說明
** 訓(xùn)練數(shù)據(jù)有8列:**
- 日期 - 年: int
- 日期 - 月: int
- 日期 - 日: int, 時(shí)間跨度為2015年2月1日 - 2016年8月31日
- 當(dāng)日最高氣溫 - 攝氏度(下同): float
- 當(dāng)日最低氣溫: float
- 當(dāng)日平均氣溫: float
- 當(dāng)日平均濕度: float
- 輸出 - float
預(yù)測數(shù)據(jù)沒有輸出部分,其他與預(yù)測一樣。時(shí)間跨度為2016年9月1日 - 2016年11月30日
訓(xùn)練與預(yù)測都各自包含46組數(shù)據(jù),每組數(shù)據(jù)代表不同數(shù)據(jù)源,組之間的溫度與濕度信息一樣而輸出不同.
2 導(dǎo)入庫并讀取查看數(shù)據(jù)
#查看其中一個地區(qū)的訓(xùn)練數(shù)據(jù) import pandas as pd import numpy as np from keras.models import Sequential from keras.layers import Dense, LSTM, Dropout import matplotlib.pyplot as plt % matplotlib inline import glob, os import seaborn as sns import sys from sklearn.preprocessing import MinMaxScaler columns = ['YEAR','MONTH','DAY','TEMP_HIG','TEMP_COL','AVG_TEMP','AVG_WET','DATA_COL'] data = pd.read_csv('../input/industry/industry_timeseries/timeseries_train_data/1.csv', names=columns) data.head() # 查看數(shù)據(jù)采集區(qū)1的數(shù)據(jù) plt.figure(figsize=(24,8)) for i in range(8):plt.subplot(8, 1, i+1)plt.plot(data.values[:, i])plt.title(columns[i], y=0.5, loc='right') plt.show()3 數(shù)據(jù)預(yù)處理
3.1 時(shí)間序列數(shù)據(jù)轉(zhuǎn)化為監(jiān)督問題數(shù)據(jù)
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):n_vars = 1 if type(data) is list else data.shape[1]df = pd.DataFrame(data)cols, names = list(), list()# input sequence (t-n, ... t-1)for i in range(n_in, 0, -1):cols.append(df.shift(i))names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]# forecast sequence (t, t+1, ... t+n)for i in range(0, n_out):cols.append(df.shift(-i))if i == 0:names += [('var%d(t)' % (j+1)) for j in range(n_vars)]else:names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]# put it all togetheragg = pd.concat(cols, axis=1)agg.columns = names# drop rows with NaN valuesif dropnan:agg.dropna(inplace=True)return agg關(guān)于上段代碼的理解可以參考:How to Convert a Time Series to a Supervised Learning Problem in Python
?
# 將數(shù)據(jù)歸一化到0-1之間,無量綱化 scaler = MinMaxScaler(feature_range=(0,1)) scaled_data = scaler.fit_transform(example[['DATA_COL','TEMP_HIG','TEMP_COL','AVG_TEMP','AVG_WET']].values) # 將時(shí)序數(shù)據(jù)轉(zhuǎn)換為監(jiān)督問題數(shù)據(jù) reframed = series_to_supervised(scaled_data, 1, 1) #刪除無用的label數(shù)據(jù) reframed.drop(reframed.columns[[6,7,8,9]], axis=1, inplace=True) print(redf.info()) redf.head()3.2 數(shù)據(jù)集劃分及規(guī)整
# 數(shù)據(jù)集劃分,選取前400天的數(shù)據(jù)作為訓(xùn)練集,中間150天作為驗(yàn)證集,其余的作為測試集 train_days = 400 valid_days = 150 values = redf.values train = values[:train_days, :] valid = values[train_days:train_days+valid_days, :] test = values[train_days+valid_days:, :] train_X, train_y = train[:, :-1], train[:, -1] valid_X, valid_y = valid[:, :-1], valid[:, -1] test_X, test_y = test[:, :-1], test[:, -1] # 將數(shù)據(jù)集重構(gòu)為符合LSTM要求的數(shù)據(jù)格式,即 [樣本,時(shí)間步,特征] train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1])) valid_X = valid_X.reshape((valid_X.shape[0], 1, valid_X.shape[1])) test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1])) print(train_X.shape, train_y.shape, valid_X.shape, valid_y.shape, test_X.shape, test_y.shape) (400, 1, 5) (400,) (150, 1, 5) (150,) (27, 1, 5) (27,)4 建立模型并訓(xùn)練
model1 = Sequential() model1.add(LSTM(50, activation='relu',input_shape=(train_X.shape[1], train_X.shape[2]), return_sequences=True)) model1.add(Dense(1, activation='linear')) model1.compile(loss='mean_squared_error', optimizer='adam') # fit network LSTM = model.fit(train_X, train_y, epochs=100, batch_size=32, validation_data=(valid_X, valid_y), verbose=2, shuffle=False) # plot history plt.plot(LSTM.LSTM['loss'], label='train') plt.plot(LSTM.LSTM['val_loss'], label='valid') plt.legend() plt.show()5 模型預(yù)測并可視化
plt.figure(figsize=(24,8)) train_predict = model.predict(train_X) valid_predict = model.predict(valid_X) test_predict = model.predict(test_X) plt.plot(values[:, -1], c='b') plt.plot([x for x in train_predict], c='g') plt.plot([None for _ in train_predict] + [x for x in valid_predict], c='y') plt.plot([None for _ in train_predict] + [None for _ in valid_predict] + [x for x in test_predict], c='r') plt.show()藍(lán)色曲線為真實(shí)輸出
綠色曲線為訓(xùn)練數(shù)據(jù)的預(yù)測輸出
黃色曲線為驗(yàn)證數(shù)據(jù)集的預(yù)測輸出
紅色曲線為測試數(shù)據(jù)的預(yù)測輸出(能看出來模型預(yù)測效果還是比較好的)
總結(jié)
以上是生活随笔為你收集整理的Keras 实现 LSTM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报错引发的版本对应——tensorflo
- 下一篇: 深度学习中常用的误差方法