LSTM模型預測時間序列性質的進件量---詳細步驟以及例子
此部落格適合剛剛入門LSTM的朋友學習,牛逼的朋友請略過,哈哈。。。
github路徑:
https://github.com/zhouliping3712/LSTM_Times_Series
一、LSTM簡介:
Long Short Term Memory(LSTM):長短時記憶神經網路,是一種特殊的迴圈神經網路(RNN),優勢在於解決RNN的梯度消失和梯度爆炸的問題,目前廣泛應用於序列資料處理和預測,比如文字上下文感情分析,股票預測等;
迴圈神經網路與多層感知機不同的地方是上個神經元的輸出是下一個神經元的輸入,但是隨著重複模組越來越多,權重W若很小,則使得第一個神經元的資訊就會在權重W相乘之後出現特別小的值,因會使得第一個模組的資訊失真,同理若權重W很大,則會使得第一個模組的輸出覆蓋住所有的資訊,也會使得資訊失真。而LSTM模型與普通的RNN不同之處就是重複模組加入門的概念,門可以對上一個輸出進行選擇是否忘記,從數學上聽說反向傳播導數是一個常數,所以能夠保證每個模組的資訊能夠被記住;
RNN重複模組
LSTM重複模組
二、LSTM環境的配置
本文是基於Keras建立LSTM模型,具體安裝可以參照下面的步驟:
深度學習開源框架Keras:是一種高層神經網路,採用Tensorflow或者Theano或者CNTK作為後端,優點就是建模容易。 安裝依賴:Scipy,Numpy,Pandas,Scikit-Learn,Tensorflow 安裝過程:
安裝Anoconda之後,不同作業系統不同的安裝方法;
1. 基於linux環境安裝TensorFlow和Keras
- conda create -n tensorflow python=3.6.6
- conda install TensorFlow
- pip install keras -U --pre
2. 基於win7:
- 開始執行處找到cmd,以管理者的身份執行
- pip install tensoflow 3.pip install keras
三、例項講解:(初學者最喜歡的部分了,哈哈哈、、、)
# coding: utf-8
# In[4]:
import numpy as np #陣列模組;
from matplotlib import pyplot as plt #繪圖模組;
from pandas import read_csv #匯入CSV檔案成dataframe結構;
import math #匯入數學模組,計算均方根差使用;
from keras.models import Sequential #引入Kears模組的序列模型,此模型是將所有層線性疊加;
from keras.layers import Dense #輸出層使用全連線層;
from keras.layers import LSTM #引入LSTM層;
from sklearn.preprocessing import MinMaxScaler #資料標準化
from sklearn.metrics import mean_squared_error #均方根差,矩陣計算;
seed = 7 #隨機種子
batch_size = 10 #每批過神經網路的大小;
epochs = 100 #神經網路訓練的輪次
filename = 'cases.csv' #資料檔案,兩列,一列是時間,另外一列是每天的進件量資料;
look_back=1 #時間視窗,步長為1,即用今天預測明天;
#此函式的目的是將輸入的每日的進件量資料作為輸入和輸出,Y是X的下一個輸出;
def create_dataset(dataset):
dataX, dataY = [], []
for i in range(len(dataset) - look_back - 1):
x = dataset[i: i + look_back, 0]
dataX.append(x)
y = dataset[i + look_back, 0]
dataY.append(y)
print('X: %s, Y: %s' % (x, y))
return np.array(dataX), np.array(dataY)
#隱藏層4個,input_shape是輸入資料格式,LSTM 層輸入格式: 為矩陣,矩陣內容 [ samples, time steps, features ] samples:觀測值,time steps:對於給定的觀測值,給定變數有單獨的時間步--就是時間視窗 features:在得到觀測值的時刻,觀測到的單獨的 measures--就是列數(屬性個數) ;
def build_model():
model = Sequential()
model.add(LSTM(units=4, input_shape=(1, look_back)))
model.add(Dense(units=1)) #輸出層採用全連線層;
model.compile(loss='mean_squared_error', optimizer='adam') #損失函式是均方差,優化器是採用adam;
return model
# 設定隨機種子,目的是使得可以復現神經網路訓練的結果;
np.random.seed(seed)
# 匯入資料
data = read_csv(filename, usecols=[1], engine='python', skipfooter=footer)
dataset = data.values.astype('float32')
# 標準化資料
scaler = MinMaxScaler()
dataset = scaler.fit_transform(dataset)
train_size = int(len(dataset) * 0.67) #訓練資料
validation_size = len(dataset) - train_size #測試資料
train, validation = dataset[0: train_size, :], dataset[train_size: len(dataset), :]
# 建立dataset,讓資料產生相關性
X_train, y_train = create_dataset(train)
X_validation, y_validation = create_dataset(validation)
# 將輸入轉化成為【sample, time steps, feature]
X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_validation = np.reshape(X_validation, (X_validation.shape[0], 1, X_validation.shape[1]))
# 訓練模型
model = build_model()
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, )
# 模型預測資料
predict_train = model.predict(X_train)
predict_validation = model.predict(X_validation)
# 反標準化資料 --- 目的是保證MSE的準確性
predict_train = scaler.inverse_transform(predict_train)
y_train = scaler.inverse_transform([y_train])
predict_validation = scaler.inverse_transform(predict_validation)
y_validation = scaler.inverse_transform([y_validation])
# 評估模型
train_score = math.sqrt(mean_squared_error(y_train[0], predict_train[:, 0]))
print('Train Score: %.2f RMSE' % train_score)
validation_score = math.sqrt(mean_squared_error(y_validation[0], predict_validation[:, 0]))
print('Validatin Score: %.2f RMSE' % validation_score)
# 構建通過訓練集進行預測的圖表資料
predict_train_plot = np.empty_like(dataset)
predict_train_plot[:, :] = np.nan
predict_train_plot[look_back:len(predict_train) + look_back, :] = predict_train
# 構建通過評估資料集進行預測的圖表資料
predict_validation_plot = np.empty_like(dataset)
predict_validation_plot[:, :] = np.nan
predict_validation_plot[len(predict_train) + look_back * 2 + 1:len(dataset) - 1, :] = predict_validation
# 圖表顯示
dataset = scaler.inverse_transform(dataset)
plt.plot(dataset, color='blue')
plt.plot(predict_train_plot, color='green')
plt.plot(predict_validation_plot, color='red')
plt.show()
四、結果:
Train Score: 335.16 RMSE Validatin Score: 795.68 RMSE
預測與實際值誤差的百分比變化;
五、模型優化方向:
增加訓練的輪次epoch
增加隱藏層層數units
修改啟用函式
修改時間視窗look_back
採用many to one的形式,利用細胞狀態;
六、參考資料(感謝各位大神的貢獻):
https://blog.csdn.net/omnispace/article/details/78415204
https://www.cnblogs.com/arkenstone/p/5794063.html
http://deeplearning.net/tutorial/lstm.html
https://blog.csdn.net/vbskj/article/details/71713204
https://blog.csdn.net/pipixiu/article/details/81001599 : 航空乘客預測
https://www.evolutionarylearn.com/paper/lstm-review-ts/:最全資料
http://blog.itpub.net/31509949/viewspace-2213894/
https://java.ctolib.com/article/wiki/73805
https://www.helplib.com/GitHub/article_134582
http://inspiratron.org/blog/2018/01/10/predicting-stock-prices-using-recurrent-neural-networks/
https://machinelearningmastery.com/time-series-forecasting-long-short-term-memory-network-python/ 香皂預測
https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/
https://blog.csdn.net/iyangdi/article/details/77881755
https://blog.csdn.net/liangyingyi1006/article/details/79240826
https://blog.csdn.net/omnispace/article/details/78415204
https://blog.csdn.net/zxhm001/article/details/75578011
https://www.douban.com/group/topic/116413218/
https://blog.csdn.net/a398942089/article/details/51648042
https://blog.csdn.net/mylove0414/article/details/56969181
https://blog.csdn.net/u010159842/article/details/56016137
https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/78463811空氣汙染
https://blog.csdn.net/u010412858/article/details/76153000
http://www.cnblogs.com/welhzh/p/6857409.html