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

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

使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡進行時間序列預測|附代碼數(shù)據(jù)

2022-10-31 19:00 作者:拓端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)絡,可以成功地訓練非常大的體系結(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次觀測。

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

  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)。

點擊標題查閱往期內(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é)果可重復。

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

  2. numpy.random.seed(7)

我們還可以使用上一部分中的代碼將數(shù)據(jù)集作為Pandas數(shù)據(jù)框加載。然后,我們可以從數(shù)據(jù)幀中提取NumPy數(shù)組,并將整數(shù)值轉(zhuǎn)換為浮點值,這更適合使用神經(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ù)集(我們要轉(zhuǎn)換為數(shù)據(jù)集的NumPy數(shù)組)和?look_back,這是用作輸入變量以預測下一個時間段的先前時間步數(shù),默認為1。

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

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

  1. # 將值數(shù)組轉(zhuǎn)換為數(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ù)組結(jié)構:???[樣本,時間步長,特征]?。

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

  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

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

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

  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ù)的時間步長,而不是將過去的觀察結(jié)果作為單獨的輸入函數(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

我們可以看到,結(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。

運行將提供以下輸出:

  1. ...

  2. Epoch 1/1

  3. 1s - loss: 0.0016

  4. Train Score: 20.74 RMSE

  5. 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)生以下輸出。

  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中進行時間序列預測。

點擊文末“閱讀原文”

獲取全文完整代碼數(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)絡分類


使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡進行時間序列預測|附代碼數(shù)據(jù)的評論 (共 條)

分享到微博請遵守國家法律
河北区| 武定县| 同德县| 个旧市| 顺义区| 永春县| 梅州市| 和静县| 迁安市| 黄浦区| 华坪县| 庄河市| 克山县| 太和县| 临沭县| 商丘市| 济源市| 绥宁县| 恩施市| 淄博市| 磐安县| 建平县| 托克托县| 曲沃县| 辽源市| 阿拉善盟| 肇州县| 南宫市| 乌拉特后旗| 余江县| 大连市| 林西县| 文安县| 班戈县| 南丰县| 包头市| 宣武区| 九龙县| 青龙| 云安县| 满洲里市|