使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡進行時間序列預測|附代碼數(shù)據(jù)
全文鏈接 :http://tecdat.cn/?p=19542
時間序列預測問題是預測建模問題中的一種困難類型(點擊文末“閱讀原文”獲取完整代碼數(shù)據(jù))。
與回歸預測建模不同,時間序列還增加了輸入變量之間序列依賴的復雜性。
用于處理序列依賴性的強大神經(jīng)網(wǎng)絡稱為?遞歸神經(jīng)網(wǎng)絡。長短期記憶網(wǎng)絡或LSTM網(wǎng)絡是深度學習中使用的一種遞歸神經(jīng)網(wǎng)絡,可以成功地訓練非常大的體系結(jié)構。
相關視頻:LSTM?神經(jīng)網(wǎng)絡架構和工作原理及其在Python中的預測應用
拓端
,贊27
LSTM神經(jīng)網(wǎng)絡架構和原理及其在Python中的預測應用
在本文中,您將發(fā)現(xiàn)如何使用Keras深度學習庫在Python中開發(fā)LSTM網(wǎng)絡,以解決時間序列預測問題。
完成本教程后,您將知道如何針對自己的時間序列預測問題實現(xiàn)和開發(fā)LSTM網(wǎng)絡。
關于國際航空公司的旅客時間序列預測問題。
如何基于時間序列預測問題框架開發(fā)LSTM網(wǎng)絡。
如何使用LSTM網(wǎng)絡進行開發(fā)并做出預測,這些網(wǎng)絡可以在很長的序列中保持狀態(tài)(內(nèi)存)。
在本教程中,我們將為時間序列預測問題開發(fā)LSTM。
這些示例將準確地向您展示如何開發(fā)結(jié)構不同的LSTM網(wǎng)絡,以解決時間序列預測建模問題。
問題描述
討論的問題是國際航空公司的乘客預測問題。
任務是預測國際航空旅客的數(shù)量。數(shù)據(jù)范圍為1949年1月至1960年12月,即12年,共進行了144次觀測。
下面是文件前幾行的示例。
"Month","Passengers"
"1949-03",132
"1949-04",129
"1949-05",121
我們可以使用Pandas庫加載此數(shù)據(jù)集。下面列出了加載和繪制數(shù)據(jù)集的代碼。
dataset = pandas.read_csv('airpas.csv', usecols=[1], engine='python')
plt.plot(dataset)
plt.show()
您可以看到數(shù)據(jù)集中隨時間的上升趨勢。
您還可以看到數(shù)據(jù)集中的一些周期性,該周期性可能對應于休假期。

通常,最好標準化數(shù)據(jù)并使它們平穩(wěn)。
點擊標題查閱往期內(nèi)容

R語言用FNN-LSTM假近鄰長短期記憶人工神經(jīng)網(wǎng)絡模型進行時間序列深度學習預測4個案例

轉(zhuǎn)存失敗重新上傳取消
左右滑動查看更多

轉(zhuǎn)存失敗重新上傳取消
01

02

03

04

長短期記憶網(wǎng)絡
長短期記憶網(wǎng)絡(LSTM)是一種遞歸神經(jīng)網(wǎng)絡,使用時間反向傳播進行訓練,可以解決梯度消失的問題。
它可用于創(chuàng)建大型循環(huán)網(wǎng)絡,進而可用于解決機器學習中的序列問題并獲得最新結(jié)果。
LSTM網(wǎng)絡不是神經(jīng)元,而是具有通過層連接的存儲塊。
LSTM 的關鍵就是細胞狀態(tài),LSTM 有通過精心設計的稱作為“門”的結(jié)構來去除或者增加信息到細胞狀態(tài)的能力。門是一種讓信息選擇式通過的方法,他們包含一個sigmoid
神經(jīng)網(wǎng)絡層和一個按位的乘法操作。Sigmoid 層輸出0到1之間的數(shù)值,描述每個部分有多少量可以通過。0代表“不許任何量通過”,1就指“允許任意量通過”!LSTM 擁有三個門,來保護和控制細胞狀態(tài)。
一個單元內(nèi)有三種類型的門:
忘記門:有條件地決定從該塊中丟棄哪些信息。
輸入門:有條件地決定輸入中的哪些值來更新內(nèi)存狀態(tài)。
輸出門:根據(jù)輸入的內(nèi)存,決定輸出什么。
每個單元就像一個微型狀態(tài)機,其中單元的門具有在訓練過程中學習到的權重。
LSTM回歸網(wǎng)絡
我們可以將該問題表述為回歸問題。
也就是說,考慮到本月的旅客人數(shù)(以千為單位),下個月的旅客人數(shù)是多少?
我們可以編寫一個簡單的函數(shù)將單列數(shù)據(jù)轉(zhuǎn)換為兩列數(shù)據(jù)集:第一列包含本月的(t)乘客數(shù),第二列包含下個月的(t + 1)乘客數(shù)。
在開始之前,讓我們首先導入要使用的所有函數(shù)和類。假設安裝了Keras深度學習庫。
在進行任何操作之前,最好先設置隨機數(shù)種子,以確保我們的結(jié)果可重復。
# 隨機種子以提高可重復性
numpy.random.seed(7)
我們還可以使用上一部分中的代碼將數(shù)據(jù)集作為Pandas數(shù)據(jù)框加載。然后,我們可以從數(shù)據(jù)幀中提取NumPy數(shù)組,并將整數(shù)值轉(zhuǎn)換為浮點值,這更適合使用神經(jīng)網(wǎng)絡進行建模。
# 加載數(shù)據(jù)集
dataset = dataset.astype('float32')
LSTM對輸入數(shù)據(jù)的大小敏感,特別是在使用S型(默認)或tanh激活函數(shù)時。將數(shù)據(jù)重新標準化到0到1的范圍(也稱為歸一化)。我們可以使用 scikit-learn庫中的MinMaxScaler預處理類輕松地對數(shù)據(jù)集進行規(guī)范化?。
# 標準化數(shù)據(jù)集
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
在對數(shù)據(jù)進行建模并在訓練數(shù)據(jù)集上估計模型之后,我們需要對新的數(shù)據(jù)測試了解模型的技能。對于正常的分類或回歸問題,我們將使用交叉驗證來完成。
對于時間序列數(shù)據(jù),值的順序很重要。我們可以使用的一種簡單方法是將有序數(shù)據(jù)集拆分為訓練數(shù)據(jù)集和測試數(shù)據(jù)集。下面的代碼計算分割點,并使用67%的觀測值將數(shù)據(jù)分離到訓練數(shù)據(jù)集中,這些觀測值可用于訓練模型,其余的33%用于測試模型。
# 分為訓練集和測試集
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
現(xiàn)在,我們可以定義一個函數(shù)來創(chuàng)建新的數(shù)據(jù)集,如上所述。
該函數(shù)有兩個參數(shù):?數(shù)據(jù)集(我們要轉(zhuǎn)換為數(shù)據(jù)集的NumPy數(shù)組)和?look_back,這是用作輸入變量以預測下一個時間段的先前時間步數(shù),默認為1。
此默認值將創(chuàng)建一個數(shù)據(jù)集,其中X是給定時間(t)的乘客人數(shù),Y是下一次時間(t +1)的乘客人數(shù)。
我們將在下一部分中構造一個形狀不同的數(shù)據(jù)集。
# 將值數(shù)組轉(zhuǎn)換為數(shù)據(jù)集矩陣
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
return numpy.array(dataX), numpy.array(dataY)
讓我們看一下此函數(shù)對數(shù)據(jù)集第一行的影響。
X Y
112 118
118 132
132 129
129 121
121 135
如果將前5行與上一節(jié)中列出的原始數(shù)據(jù)集樣本進行比較,則可以在數(shù)字中看到X = t和Y = t + 1模式。
讓我們準備訓練和測試數(shù)據(jù)集以進行建模。
#整理為X = t和Y = t + 1
look_back = 1
create_dataset(train, look_back)
LSTM網(wǎng)絡輸入數(shù)據(jù)(X)具有以下形式的特定數(shù)組結(jié)構:???[樣本,時間步長,特征]?。
目前,我們的數(shù)據(jù)采用以下形式:[樣本,特征],我們將問題定為每個樣本的一步。我們可以使用numpy.reshape()?將準備好的訓練和測試輸入數(shù)據(jù)轉(zhuǎn)換為預期的結(jié)構??,如下所示:
# 將輸入修改為[樣本,時間步長,特征]
numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
現(xiàn)在,我們準備設計并擬合我們的LSTM網(wǎng)絡以解決此問題。
該網(wǎng)絡具有一個具有1個輸入的可見層,一個具有4個LSTM塊或神經(jīng)元的隱藏層以及一個進行單個值預測的輸出層。默認的Sigmoid激活功能用于LSTM模塊。該網(wǎng)絡訓練了100個時期。
# 創(chuàng)建并擬合LSTM網(wǎng)絡
model.add(LSTM(4, input_shape=(1, look_back)))
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
一旦模型適合,我們就可以估計模型在訓練和測試數(shù)據(jù)集上的性能。這將為我們提供新模型的比較點。
請注意,在計算誤差之前,我們先對預測進行了反標準化,以確保以與原始數(shù)據(jù)相同的單位。
# 作出預測
trainPredict = model.predict(trainX)
# 反向預測
trainPredict = scaler.inverse_transform(trainPredict)
# 計算均方誤差
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
最后,我們可以使用模型為訓練和測試數(shù)據(jù)集生成預測,以直觀地了解模型的技能。
由于數(shù)據(jù)集的準備方式,我們必須移動預測,以使它們在x軸上與原始數(shù)據(jù)集對齊。準備好之后,將數(shù)據(jù)繪制成圖表,以藍色顯示原始數(shù)據(jù)集,以綠色顯示訓練數(shù)據(jù)集的預測,以紅色顯示看不見的測試數(shù)據(jù)集的預測。
# 預測
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict
# 繪制測試預測
testPredictPlot = numpy.empty_like(dataset)
# 繪制基準和預測
plt.plot(testPredictPlot)
plt.show()
我們可以看到,該模型在擬合訓練和測試數(shù)據(jù)集方面做得非常出色。

LSTM訓練了旅客預測問題的回歸公式
運行示例將產(chǎn)生以下輸出。
..
Epoch 100/100
0s - loss: 0.0020
Train Score: 22.93 RMSE
Test Score: 47.53 RMSE
我們可以看到,該模型在訓練數(shù)據(jù)集上的平均誤差約為23乘客(以千計),在測試數(shù)據(jù)集上的平均誤差為52乘客(以千計)。
使用窗口方法進行回歸的LSTM
我們還可以使用多個最近的時間步長來預測下一個時間步長。
這稱為窗口,窗口的大小是可以針對每個問題進行調(diào)整的參數(shù)。
例如,給定當前時間(t),我們要預測序列(t + 1)中下一個時間的值,我們可以使用當前時間(t)以及前兩個時間(t-1)和t-2)作為輸入變量。
當表述為回歸問題時,輸入變量為t-2,t-1,t,輸出變量為t + 1。
?在上一節(jié)中創(chuàng)建的?create_dataset()?函數(shù)使我們可以通過將look_back?參數(shù)從1增加到3來創(chuàng)建時間序列問題。
具有此公式的數(shù)據(jù)集示例如下所示:
X1 X2 X3 Y
112 118 132 129
118 132 129 121
132 129 121 135
129 121 135 148
121 135 148 148
我們可以使用較大的窗口大小重新運行上一部分中的示例。
運行示例將提供以下輸出:
...
Epoch 100/100
0s - loss: 0.0020
Train Score: 24.19 RMSE
Test Score: 58.03 RMSE
我們可以看到誤差與上一節(jié)相比有所增加。

LSTM隨時間步長回歸
你可以看到LSTM網(wǎng)絡的數(shù)據(jù)準備包括時間步長。
某些序列問題每個樣本的時間步長可能不同。
時間步長為表達我們的時間序列問題提供了另一種方法。像上面的窗口示例一樣,我們可以將時間序列中的先前時間作為輸入,以預測下一時間的輸出。
我們可以將它們用作一個輸入函數(shù)的時間步長,而不是將過去的觀察結(jié)果作為單獨的輸入函數(shù),這確實是問題的更準確框架。
我們可以使用與上一個示例相同的數(shù)據(jù)表示方式來執(zhí)行此操作,我們將列設置為時間步長維度,例如:
# 將輸入修改為[樣本,時間步長,特征]
numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))
運行示例將提供以下輸出:
...
Epoch 95/100
1s - loss: 0.0021
Epoch 96/100
1s - loss: 0.0021
我們可以看到,結(jié)果比之前的示例略好。

訓練批次之間具有記憶的LSTM
LSTM網(wǎng)絡具有內(nèi)存,能夠記憶長序列。
通常,在擬合模型以及每次對model.predict()?或?model.evaluate()的調(diào)用后,每次訓練批次后都會重置網(wǎng)絡中的狀態(tài)?。
我們可以更好地控制何時在Keras中清除LSTM網(wǎng)絡的內(nèi)部狀態(tài)。這意味著它可以在整個訓練序列中建立狀態(tài),甚至在需要進行預測時也可以保持該狀態(tài)。
要求在安裝網(wǎng)絡時,在每次訓練數(shù)據(jù)之后,還需要通過調(diào)用model.reset_states()?來重置網(wǎng)絡狀態(tài)?。這意味著我們必須創(chuàng)建自己的時期外循環(huán),并在每個時期內(nèi)調(diào)用?model.fit()?和?model.reset_states()?。
最后,在構造LSTM層時,??必須將有狀態(tài)參數(shù)設置為?True??,我們對批處理中的樣本數(shù)量,樣本中的時間步長以及一次中的特征數(shù)量進行編碼。通過設置?batch_input_shape?參數(shù)。
隨后,在評估模型和進行預測時,必須使用相同的批次大小。
model.predict(trainX, batch_size=batch_size)
我們可以改編先前的時間步驟示例來使用有狀態(tài)LSTM。
運行將提供以下輸出:
...
Epoch 1/1
1s - loss: 0.0016
Train Score: 20.74 RMSE
Test Score: 52.23 RMSE
我們看到結(jié)果誤差更大。該模型可能需要更多模塊,并且可能需要針對更多時期進行訓練。

批次之間具有內(nèi)存的堆疊式LSTM
最后,我們將看看LSTM的一大優(yōu)勢:事實上,將LSTM堆疊到深度網(wǎng)絡體系結(jié)構中就可以對其進行成功的訓練。
LSTM網(wǎng)絡可以以與其他層類型堆疊相同的方式堆疊在Keras中。所需配置的一個附加函數(shù)是,每個后續(xù)層之前的LSTM層必須返回序列。這可以通過將return_sequences參數(shù)設置?為?True來完成。
我們可以在上一節(jié)中將有狀態(tài)LSTM擴展為兩層
運行示例將產(chǎn)生以下輸出。
...
Epoch 1/1
1s - loss: 0.0016
Train Score: 20.49 RMSE
Test Score: 56.35 RMSE
從對測試數(shù)據(jù)集的預測誤差來看,模型需要更多的訓練時間。

概要
在本文中,您發(fā)現(xiàn)了如何使用Keras深度學習網(wǎng)絡開發(fā)LSTM遞歸神經(jīng)網(wǎng)絡,在Python中進行時間序列預測。

點擊文末“閱讀原文”
獲取全文完整代碼數(shù)據(jù)資料。
本文選自《使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡進行時間序列預測》。
點擊標題查閱往期內(nèi)容
matlab使用長短期記憶(LSTM)神經(jīng)網(wǎng)絡對序列數(shù)據(jù)進行分類
Python TensorFlow循環(huán)神經(jīng)網(wǎng)絡RNN-LSTM神經(jīng)網(wǎng)絡預測股票市場價格時間序列和MSE評估準確性
數(shù)據(jù)分享|PYTHON用KERAS的LSTM神經(jīng)網(wǎng)絡進行時間序列預測天然氣價格例子
Python對商店數(shù)據(jù)進行l(wèi)stm和xgboost銷售量時間序列建模預測分析
Matlab用深度學習長短期記憶(LSTM)神經(jīng)網(wǎng)絡對文本數(shù)據(jù)進行分類
RNN循環(huán)神經(jīng)網(wǎng)絡 、LSTM長短期記憶網(wǎng)絡實現(xiàn)時間序列長期利率預測
結(jié)合新冠疫情COVID-19股票價格預測:ARIMA,KNN和神經(jīng)網(wǎng)絡時間序列分析
深度學習:Keras使用神經(jīng)網(wǎng)絡進行簡單文本分類分析新聞組數(shù)據(jù)
用PyTorch機器學習神經(jīng)網(wǎng)絡分類預測銀行客戶流失模型
PYTHON用LSTM長短期記憶神經(jīng)網(wǎng)絡的參數(shù)優(yōu)化方法預測時間序列洗發(fā)水銷售數(shù)據(jù)
Python用Keras神經(jīng)網(wǎng)絡序列模型回歸擬合預測、準確度檢查和結(jié)果可視化
Python用LSTM長短期記憶神經(jīng)網(wǎng)絡對不穩(wěn)定降雨量時間序列進行預測分析
R語言中的神經(jīng)網(wǎng)絡預測時間序列:多層感知器(MLP)和極限學習機(ELM)數(shù)據(jù)分析報告
R語言深度學習:用keras神經(jīng)網(wǎng)絡回歸模型預測時間序列數(shù)據(jù)
Matlab用深度學習長短期記憶(LSTM)神經(jīng)網(wǎng)絡對文本數(shù)據(jù)進行分類
R語言KERAS深度學習CNN卷積神經(jīng)網(wǎng)絡分類識別手寫數(shù)字圖像數(shù)據(jù)(MNIST)
MATLAB中用BP神經(jīng)網(wǎng)絡預測人體脂肪百分比數(shù)據(jù)
Python中用PyTorch機器學習神經(jīng)網(wǎng)絡分類預測銀行客戶流失模型
R語言實現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡)模型進行回歸數(shù)據(jù)分析
SAS使用鳶尾花(iris)數(shù)據(jù)集訓練人工神經(jīng)網(wǎng)絡(ANN)模型
【視頻】R語言實現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡)模型進行回歸數(shù)據(jù)分析
Python使用神經(jīng)網(wǎng)絡進行簡單文本分類
R語言用神經(jīng)網(wǎng)絡改進Nelson-Siegel模型擬合收益率曲線分析
R語言基于遞歸神經(jīng)網(wǎng)絡RNN的溫度時間序列預測
R語言神經(jīng)網(wǎng)絡模型預測車輛數(shù)量時間序列
R語言中的BP神經(jīng)網(wǎng)絡模型分析學生成績
matlab使用長短期記憶(LSTM)神經(jīng)網(wǎng)絡對序列數(shù)據(jù)進行分類
R語言實現(xiàn)擬合神經(jīng)網(wǎng)絡預測和結(jié)果可視化
用R語言實現(xiàn)神經(jīng)網(wǎng)絡預測股票實例
使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡進行時間序列預測
python用于NLP的seq2seq模型實例:用Keras實現(xiàn)神經(jīng)網(wǎng)絡機器翻譯
用于NLP的Python:使用Keras的多標簽文本LSTM神經(jīng)網(wǎng)絡分類