最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

拓端tecdat|使用Python中Keras的LSTM遞歸神經(jīng)網(wǎng)絡進行時間序列預測

2021-07-08 21:07 作者:拓端tecdat  | 我要投稿

原文鏈接 :http://tecdat.cn/?p=19542?

原文出處:拓端數(shù)據(jù)部落公眾號

時間序列預測問題是預測建模問題中的一種困難類型。

與回歸預測建模不同,時間序列還增加了輸入變量之間序列依賴的復雜性。

用于處理序列依賴性的強大神經(jīng)網(wǎng)絡稱為?遞歸神經(jīng)網(wǎng)絡。長短期記憶網(wǎng)絡或LSTM網(wǎng)絡是深度學習中使用的一種遞歸神經(jīng)網(wǎng)絡,可以成功地訓練非常大的體系結構。

在本文中,您將發(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)(內存)。

在本教程中,我們將為時間序列預測問題開發(fā)LSTM。

這些示例將準確地向您展示如何開發(fā)結構不同的LSTM網(wǎng)絡,以解決時間序列預測建模問題。

問題描述

討論的問題是國際航空公司的乘客預測問題。

任務是預測國際航空旅客的數(shù)量。數(shù)據(jù)范圍為1949年1月至1960年12月,即12年,共進行了144次觀測。

下面是文件前幾行的示例。

  1. "Month","Passengers"



  2. "1949-03",132


  3. "1949-04",129


  4. "1949-05",121

我們可以使用Pandas庫加載此數(shù)據(jù)集。下面列出了加載和繪制數(shù)據(jù)集的代碼。



  1. dataset = pandas.read_csv('airpas.csv', usecols=[1], engine='python')


  2. plt.plot(dataset)


  3. plt.show()



您可以看到數(shù)據(jù)集中隨時間的上升趨勢。

您還可以看到數(shù)據(jù)集中的一些周期性,該周期性可能對應于休假期。

通常,最好標準化數(shù)據(jù)并使它們平穩(wěn)。

長短期記憶網(wǎng)絡

長短期記憶網(wǎng)絡(LSTM)是一種遞歸神經(jīng)網(wǎng)絡,使用時間反向傳播進行訓練,可以解決梯度消失的問題。

它可用于創(chuàng)建大型循環(huán)網(wǎng)絡,進而可用于解決機器學習中的序列問題并獲得最新結果。

LSTM網(wǎng)絡不是神經(jīng)元,而是具有通過層連接的存儲塊。

LSTM 的關鍵就是細胞狀態(tài),LSTM 有通過精心設計的稱作為“門”的結構來去除或者增加信息到細胞狀態(tài)的能力。門是一種讓信息選擇式通過的方法,他們包含一個sigmoid神經(jīng)網(wǎng)絡層和一個按位的乘法操作。Sigmoid 層輸出0到1之間的數(shù)值,描述每個部分有多少量可以通過。0代表“不許任何量通過”,1就指“允許任意量通過”!LSTM 擁有三個門,來保護和控制細胞狀態(tài)。

一個單元內有三種類型的門:

  • 忘記門:有條件地決定從該塊中丟棄哪些信息。

  • 輸入:有條件地決定輸入中的哪些值來更新內存狀態(tài)。

  • 輸出門:根據(jù)輸入的內存,決定輸出什么。

每個單元就像一個微型狀態(tài)機,其中單元的門具有在訓練過程中學習到的權重。

LSTM回歸網(wǎng)絡

我們可以將該問題表述為回歸問題。

也就是說,考慮到本月的旅客人數(shù)(以千為單位),下個月的旅客人數(shù)是多少?

我們可以編寫一個簡單的函數(shù)將單列數(shù)據(jù)轉換為兩列數(shù)據(jù)集:第一列包含本月的(t)乘客數(shù),第二列包含下個月的(t + 1)乘客數(shù)。

在開始之前,讓我們首先導入要使用的所有函數(shù)和類。假設安裝了Keras深度學習庫。

在進行任何操作之前,最好先設置隨機數(shù)種子,以確保我們的結果可重復。

  1. # 隨機種子以提高可重復性


  2. numpy.random.seed(7)

我們還可以使用上一部分中的代碼將數(shù)據(jù)集作為Pandas數(shù)據(jù)框加載。然后,我們可以從數(shù)據(jù)幀中提取NumPy數(shù)組,并將整數(shù)值轉換為浮點值,這更適合使用神經(jīng)網(wǎng)絡進行建模。

  1. # 加載數(shù)據(jù)集



  2. dataset = dataset.astype('float32')

LSTM對輸入數(shù)據(jù)的大小敏感,特別是在使用S型(默認)或tanh激活函數(shù)時。將數(shù)據(jù)重新標準化到0到1的范圍(也稱為歸一化)。我們可以使用?scikit-learn庫中的MinMaxScaler預處理類輕松地對數(shù)據(jù)集進行規(guī)范化?。

  1. # 標準化數(shù)據(jù)集


  2. scaler = MinMaxScaler(feature_range=(0, 1))


  3. 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%用于測試模型。

  1. # 分為訓練集和測試集


  2. train_size = int(len(dataset) * 0.67)


  3. test_size = len(dataset) - train_size


現(xiàn)在,我們可以定義一個函數(shù)來創(chuàng)建新的數(shù)據(jù)集,如上所述。

該函數(shù)有兩個參數(shù):?數(shù)據(jù)集(我們要轉換為數(shù)據(jù)集的NumPy數(shù)組)和?look_back,這是用作輸入變量以預測下一個時間段的先前時間步數(shù),默認為1。

此默認值將創(chuàng)建一個數(shù)據(jù)集,其中X是給定時間(t)的乘客人數(shù),Y是下一次時間(t +1)的乘客人數(shù)。

我們將在下一部分中構造一個形狀不同的數(shù)據(jù)集。

  1. # 將值數(shù)組轉換為數(shù)據(jù)集矩陣




  2. for i in range(len(dataset)-look_back-1):

  3. a = dataset[i:(i+look_back), 0]


  4. return numpy.array(dataX), numpy.array(dataY)

讓我們看一下此函數(shù)對數(shù)據(jù)集第一行的影響。

  1. X Y


  2. 112 118


  3. 118 132


  4. 132 129


  5. 129 121


  6. 121 135

如果將前5行與上一節(jié)中列出的原始數(shù)據(jù)集樣本進行比較,則可以在數(shù)字中看到X = t和Y = t + 1模式。

讓我們準備訓練和測試數(shù)據(jù)集以進行建模。

  1. #整理為X = t和Y = t + 1


  2. look_back = 1

  3. create_dataset(train, look_back)

LSTM網(wǎng)絡輸入數(shù)據(jù)(X)具有以下形式的特定數(shù)組結構:??[樣本,時間步長,特征]。

目前,我們的數(shù)據(jù)采用以下形式:[樣本,特征],我們將問題定為每個樣本的一步。我們可以使用numpy.reshape()將準備好的訓練和測試輸入數(shù)據(jù)轉換為預期的結構??,如下所示:

  1. # 將輸入修改為[樣本,時間步長,特征]


  2. 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個時期。

  1. # 創(chuàng)建并擬合LSTM網(wǎng)絡



  2. model.add(LSTM(4, input_shape=(1, look_back)))


  3. model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)

一旦模型適合,我們就可以估計模型在訓練和測試數(shù)據(jù)集上的性能。這將為我們提供新模型的比較點。

請注意,在計算誤差之前,我們先對預測進行了反標準化,以確保以與原始數(shù)據(jù)相同的單位。

  1. # 作出預測


  2. trainPredict = model.predict(trainX)



  3. # 反向預測


  4. trainPredict = scaler.inverse_transform(trainPredict)



  5. # 計算均方誤差


  6. 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ù)集的預測。

  1. # 預測



  2. trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict


  3. # 繪制測試預測


  4. testPredictPlot = numpy.empty_like(dataset)




  5. # 繪制基準和預測




  6. plt.plot(testPredictPlot)


  7. plt.show()

我們可以看到,該模型在擬合訓練和測試數(shù)據(jù)集方面做得非常出色。

LSTM訓練了旅客預測問題的回歸公式

運行示例將產(chǎn)生以下輸出。

  1. ..





  2. Epoch 100/100


  3. 0s - loss: 0.0020


  4. Train Score: 22.93 RMSE


  5. Test Score: 47.53 RMSE

我們可以看到,該模型在訓練數(shù)據(jù)集上的平均誤差約為23乘客(以千計),在測試數(shù)據(jù)集上的平均誤差為52乘客(以千計)。

使用窗口方法進行回歸的LSTM

我們還可以使用多個最近的時間步長來預測下一個時間步長。

這稱為窗口,窗口的大小是可以針對每個問題進行調整的參數(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ù)集示例如下所示:

  1. X1 X2 X3 Y


  2. 112 118 132 129


  3. 118 132 129 121


  4. 132 129 121 135


  5. 129 121 135 148


  6. 121 135 148 148

我們可以使用較大的窗口大小重新運行上一部分中的示例。

運行示例將提供以下輸出:

  1. ...



  2. Epoch 100/100


  3. 0s - loss: 0.0020


  4. Train Score: 24.19 RMSE


  5. Test Score: 58.03 RMSE

我們可以看到誤差與上一節(jié)相比有所增加。

LSTM隨時間步長回歸

你可以看到LSTM網(wǎng)絡的數(shù)據(jù)準備包括時間步長。

某些序列問題每個樣本的時間步長可能不同。

時間步長為表達我們的時間序列問題提供了另一種方法。像上面的窗口示例一樣,我們可以將時間序列中的先前時間作為輸入,以預測下一時間的輸出。

我們可以將它們用作一個輸入函數(shù)的時間步長,而不是將過去的觀察結果作為單獨的輸入函數(shù),這確實是問題的更準確框架。

我們可以使用與上一個示例相同的數(shù)據(jù)表示方式來執(zhí)行此操作,我們將列設置為時間步長維度,例如:

  1. # 將輸入修改為[樣本,時間步長,特征]


  2. numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))


運行示例將提供以下輸出:

  1. ...


  2. Epoch 95/100


  3. 1s - loss: 0.0021


  4. Epoch 96/100


  5. 1s - loss: 0.0021


我們可以看到,結果比之前的示例略好。

訓練批次之間具有記憶的LSTM

LSTM網(wǎng)絡具有內存,能夠記憶長序列。

通常,在擬合模型以及每次對model.predict()?或?model.evaluate()的調用后,每次訓練批次后都會重置網(wǎng)絡中的狀態(tài)?。

我們可以更好地控制何時在Keras中清除LSTM網(wǎng)絡的內部狀態(tài)。這意味著它可以在整個訓練序列中建立狀態(tài),甚至在需要進行預測時也可以保持該狀態(tài)。

要求在安裝網(wǎng)絡時,在每次訓練數(shù)據(jù)之后,還需要通過調用model.reset_states()來重置網(wǎng)絡狀態(tài)?。這意味著我們必須創(chuàng)建自己的時期外循環(huán),并在每個時期內調用?model.fit()?和?model.reset_states()。

最后,在構造LSTM層時,??必須將有狀態(tài)參數(shù)設置為?True??,我們對批處理中的樣本數(shù)量,樣本中的時間步長以及一次中的特征數(shù)量進行編碼。通過設置?batch_input_shape?參數(shù)。

隨后,在評估模型和進行預測時,必須使用相同的批次大小。

  1. model.predict(trainX, batch_size=batch_size)


我們可以改編先前的時間步驟示例來使用有狀態(tài)LSTM。

運行將提供以下輸出:

  1. ...



  2. Epoch 1/1


  3. 1s - loss: 0.0016


  4. Train Score: 20.74 RMSE


  5. Test Score: 52.23 RMSE

我們看到結果誤差更大。該模型可能需要更多模塊,并且可能需要針對更多時期進行訓練。

批次之間具有內存的堆疊式LSTM

最后,我們將看看LSTM的一大優(yōu)勢:事實上,將LSTM堆疊到深度網(wǎng)絡體系結構中就可以對其進行成功的訓練。

LSTM網(wǎng)絡可以以與其他層類型堆疊相同的方式堆疊在Keras中。所需配置的一個附加函數(shù)是,每個后續(xù)層之前的LSTM層必須返回序列。這可以通過將return_sequences參數(shù)設置?為?True來完成。

我們可以在上一節(jié)中將有狀態(tài)LSTM擴展為兩層

運行示例將產(chǎn)生以下輸出。

  1. ...


  2. Epoch 1/1


  3. 1s - loss: 0.0016


  4. Train Score: 20.49 RMSE


  5. Test Score: 56.35 RMSE

從對測試數(shù)據(jù)集的預測誤差來看,模型需要更多的訓練時間。

概要

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

最受歡迎的見解

1.用于NLP的Python:使用Keras的多標簽文本LSTM神經(jīng)網(wǎng)絡分類

2.Python中利用長短期記憶模型LSTM進行時間序列預測分析 – 預測電力消耗數(shù)據(jù)

3.python在Keras中使用LSTM解決序列問題

4.Python中用PyTorch機器學習分類預測銀行客戶流失模型

5.R語言多元Copula GARCH 模型時間序列預測

6.在r語言中使用GAM(廣義相加模型)進行電力負荷時間序列分析

7.R語言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于預測時間序列數(shù)

8.R語言估計時變VAR模型時間序列的實證研究分析案例

9.用廣義加性模型GAM進行時間序列分析


拓端tecdat|使用Python中Keras的LSTM遞歸神經(jīng)網(wǎng)絡進行時間序列預測的評論 (共 條)

分享到微博請遵守國家法律
望奎县| 汕头市| 察隅县| 富裕县| 台江县| 宾川县| 奎屯市| 南涧| 新闻| 瑞安市| 安庆市| 宝清县| 清远市| 隆尧县| 新田县| 革吉县| 任丘市| 东辽县| 新源县| 罗定市| 洪湖市| 青田县| 抚顺市| 安宁市| 庆阳市| 肇东市| 沧源| 波密县| 习水县| 尉犁县| 科技| 砚山县| 红河县| 沈丘县| 五莲县| 玉山县| 盐边县| 比如县| 汨罗市| 海安县| 通山县|