在Python中使用LSTM和PyTorch進行時間序列預測|附代碼數據

2023-08-16     tecdat拓端

原標題:在Python中使用LSTM和PyTorch進行時間序列預測|附代碼數據

全文連結:http://tecdat.cn/?p=8145

最近我們被客戶要求撰寫關於LSTM的研究報告,包括一些圖形和統計輸出。 顧名思義,時間序列數據是一種隨時間變化的數據類型。例如,24小時內的溫度,一個月內各種產品的價格,一年中特定公司的股票價格

諸如長期短期記憶網絡(LSTM)之類的高級深度學習模型能夠捕獲時間序列數據中的模式,因此可用於對數據的未來趨勢進行預測。在本文中,您將看到如何使用LSTM算法使用時間序列數據進行將來的預測。

數據集和問題定義

讓我們先導入所需的庫,然後再導入數據集:

import matplotlib.pyplot as plt

讓我們將數據集加載到我們的程序中

data.head()

輸出:

該數據集有三列:year,month,和passengers。passengers列包含指定月份旅行旅客的總數。讓我們輸出數據集的維度:

data.shape

輸出:

(144, 3)

您可以看到數據集中有144行和3列,這意味著數據集包含12年的乘客旅行記錄。

任務是根據前132個月來預測最近12個月內旅行的乘客人數。請記住,我們有144個月的記錄,這意味著前132個月的數據將用於訓練我們的LSTM模型,而模型性能將使用最近12個月的值進行評估。

讓我們繪製每月乘客的出行頻率。 接下來的腳本繪製了每月乘客人數的頻率:

plt.grid(True)

plt.autoscale(axis='x',tight=True)

plt.plot(data['passengers'])

輸出:

輸出顯示,多年來,乘飛機旅行的平均乘客人數有所增加。一年內旅行的乘客數量波動,這是有道理的,因為在暑假或寒假期間,旅行的乘客數量與一年中的其他部分相比有所增加。

數據預處理

數據集中的列類型為object,如以下代碼所示:

data.columns

輸出:

Index(['year', 'month', 'passengers'], dtype='object')

第一步是將passengers列的類型更改為float。

all_data = data['passengers'].values.astype(float)

現在,如果 輸出all_datanumpy數組,則應該看到以下浮點類型值:

print(all_data)

前132條記錄將用於訓練模型,後12條記錄將用作測試集。以下腳本將數據分為訓練集和測試集。

test_data_size = 12

train_data = all_data[:-test_data_size]

test_data = all_data[-test_data_size:]

現在讓我們輸出測試和訓練集的長度:

輸出:

132

12

如果現在輸出測試數據,您將看到它包含all_datanumpy數組中的最後12條記錄:輸出:

[417. 391.... 390. 432.]

我們的數據集目前尚未歸一化。最初幾年的乘客總數遠少於後來幾年的乘客總數。標準化數據以進行時間序列預測非常重要。以在一定範圍內的最小值和最大值之間對數據進行歸一化。我們將使用模塊中的MinMaxScaler類sklearn.preprocessing來擴展數據。

以下代碼 將最大值和最小值分別為-1和1進行歸一化。

MinMaxScaler(feature_range=(-1, 1))

輸出:

[[-0.96483516]

[0.33186813]

[0.13406593]

[0.32307692]]

您可以看到數據集值現在在-1和1之間。

在此重要的是要提到數據歸一化僅應用於訓練數據,而不應用於測試數據。如果對測試數據進行歸一化處理,則某些信息可能會從訓練集中 到測試集中。

最後的預處理步驟是將我們的訓練數據轉換為序列和相應的標籤。

您可以使用任何序列長度,這取決於領域知識。但是,在我們的數據集中,使用12的序列長度很方便,因為我們有月度數據,一年中有12個月。如果我們有每日數據,則更好的序列長度應該是365,即一年中的天數。因此,我們將訓練的輸入序列長度設置為12。

接下來,我們將定義一個名為的函數create_inout_sequences。該函數將接受原始輸入數據,並將返回一個元組列表。在每個元組中,第一個元素將包含與12個月內旅行的乘客數量相對應的12個項目的列表,第二個元組元素將包含一個項目,即在12 + 1個月內的乘客數量。

如果輸出train_inout_seq列表的長度,您將看到它包含120個項目。這是因為儘管訓練集包含132個元素,但是序列長度為12,這意味著第一個序列由前12個項目組成,第13個項目是第一個序列的標籤。同樣,第二個序列從第二個項目開始,到第13個項目結束,而第14個項目是第二個序列的標籤,依此類推。

現在讓我們輸出train_inout_seq列表的前5個項目:

輸出:

[(tensor([-0.9648, -0.9385, -0.8769, -0.8901, -0.9253, -0.8637, -0.8066, -0.8066, -0.8593, -0.9341, -1.0000, -0.9385]), tensor([-0.9516])),

(tensor([-0.9385, -0.8769, -0.8901, -0.9253, -0.8637, -0.8066, -0.8066, -0.8593,

-0.9341, -1.0000, -0.9385, -0.9516]),

tensor([-0.9033])),

(tensor([-0.8769, -0.8901, -0.9253, -0.8637, -0.8066, -0.8066, -0.8593, -0.9341,

-1.0000, -0.9385, -0.9516, -0.9033]), tensor([-0.8374])),

(tensor([-0.8901, -0.9253, -0.8637, -0.8066, -0.8066, -0.8593, -0.9341, -1.0000,

-0.9385, -0.9516, -0.9033, -0.8374]), tensor([-0.8637])),

(tensor([-0.9253, -0.8637, -0.8066, -0.8066, -0.8593, -0.9341, -1.0000, -0.9385,

-0.9516, -0.9033, -0.8374, -0.8637]), tensor([-0.9077]))]

您會看到每個項目都是一個元組,其中第一個元素由序列的12個項目組成,第二個元組元素包含相應的標籤。

創建LSTM模型

我們已經對數據進行了預處理,現在是時候訓練我們的模型了。我們將定義一個類LSTM,該類繼承自nn.ModulePyTorch庫的類。

讓我總結一下以上代碼。LSTM該類的構造函數接受三個參數:

接下來,在構造函數中,我們創建變量hidden_layer_size,lstm,linear,和hidden_cell。LSTM算法接受三個輸入:先前的隱藏狀態,先前的單元狀態和當前輸入。該hidden_cell變量包含先前的隱藏狀態和單元狀態。lstm和linear層變量用於創建LSTM和線性層。

在forward方法內部,將input_seq作為參數傳遞,該參數首先傳遞給lstm圖層。lstm層的輸出是當前時間步的隱藏狀態和單元狀態,以及輸出。lstm圖層的輸出將傳遞到該linear圖層。預計的乘客人數存儲在predictions列表的最後一項中,並返回到調用函數。下一步是創建LSTM()類的對象,定義損失函數和優化器。由於我們在解決分類問題,

class LSTM(nn.Module):

def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):

super().__init__()

self.hidden_layer_size = hidden_layer_size

讓我們輸出模型:

輸出:

LSTM(

(lstm): LSTM(1, 100)

(linear): Linear(in_features=100, out_features=1, bias=True)

訓練模型

我們將訓練模型150個步長。

epochs = 150

for i in range(epochs):

for seq, labels in train_inout_seq:

optimizer.zero_grad()

輸出:

epoch: 1 loss: 0.00517058

epoch: 26 loss: 0.00390285

epoch: 51 loss: 0.00473305

epoch: 76 loss: 0.00187001

epoch: 101 loss: 0.00000075

epoch: 126 loss: 0.00608046

epoch: 149 loss: 0.0004329932

由於默認情況下權重是在PyTorch神經網絡中隨機初始化的,因此您可能會獲得不同的值。

做出預測

現在我們的模型已經訓練完畢,我們可以開始進行預測了。

您可以將上述值與train_data_normalized數據列表的最後12個值進行比較。

該test_inputs項目將包含12個項目。在for循環內,這12個項目將用於對測試集中的第一個項目進行預測,即編號133。然後將預測值附加到test_inputs列表中。在第二次疊代中,最後12個項目將再次用作輸入,並將進行新的預測,然後將其test_inputs再次添加到列表中。for由於測試集中有12個元素,因此該循環將執行12次。在循環末尾,test_inputs列表將包含24個項目。最後12個項目將是測試集的預測值。以下腳本用於進行預測:

model.eval()

for i in range(fut_pred):

seq = torch.FloatTensor(test_inputs[-train_window:])

如果輸出test_inputs列表的長度,您將看到它包含24個項目。可以按以下方式輸出最後12個預測項目:

需要再次提及的是,根據用於訓練LSTM的權重,您可能會獲得不同的值。

由於我們對訓練數據集進行了歸一化,因此預測值也進行了歸一化。我們需要將歸一化的預測值轉換為實際的預測值。

print(actual_predictions)

現在讓我們針對實際值繪製預測值。看下面的代碼:

print(x)

在上面的腳本中,我們創建一個列表,其中包含最近12個月的數值。第一個月的索引值為0,因此最後一個月的索引值為143。

在下面的腳本中,我們將繪製144個月的乘客總數以及最近12個月的預計乘客數量。

plt.autoscale(axis='x', tight=True)

plt.plot(flight_data['passengers'])

plt.plot(x,actual_predictions)

plt.show()

輸出:

我們的LSTM所做的預測用橙色線表示。您可以看到我們的算法不太準確,但是它仍然能夠捕獲最近12個月內旅行的乘客總數的上升趨勢以及波動。您可以嘗試在LSTM層中使用更多的時期和更多的神經元,以查看是否可以獲得更好的性能。

為了更好地查看輸出,我們可以繪製最近12個月的實際和預測乘客數量,如下所示:

plt.plot(flight_data['passengers'][-train_window:])

plt.plot(x,actual_predictions)

plt.show()

輸出:

預測不是很準確,但是該算法能夠捕獲趨勢,即未來幾個月的乘客數量應高於前幾個月,且偶爾會有波動。

結論

LSTM是解決序列問題最廣泛使用的算法之一。在本文中,我們看到了如何通過LSTM使用時間序列數據進行未來的預測。

點擊文末 「閱讀原文」

獲取全文完整代碼數據資料。

本文選自《在Python中使用LSTM和PyTorch進行時間序列預測》。

點擊標題查閱往期內容

PYTHON用KERAS的LSTM神經網絡進行時間序列預測天然氣價格例子

Python對商店數據進行lstm和xgboost銷售量時間序列建模預測分析

Matlab用深度學習長短期記憶(LSTM)神經網絡對文本數據進行分類

RNN循環神經網絡 、LSTM長短期記憶網絡實現時間序列長期利率預測

結合新冠疫情COVID-19股票價格預測:ARIMA,KNN和神經網絡時間序列分析

深度學習:Keras使用神經網絡進行簡單文本分類分析新聞組數據

用PyTorch機器學習神經網絡分類預測銀行客戶流失模型

PYTHON用LSTM長短期記憶神經網絡的參數優化方法預測時間序列洗髮水銷售數據

Python用Keras神經網絡序列模型回歸擬合預測、準確度檢查和結果可視化

Python用LSTM長短期記憶神經網絡對不穩定降雨量時間序列進行預測分析

R語言中的神經網絡預測時間序列:多層感知器(MLP)和極限學習機(ELM)數據分析報告

R語言深度學習:用keras神經網絡回歸模型預測時間序列數據

Matlab用深度學習長短期記憶(LSTM)神經網絡對文本數據進行分類

R語言KERAS深度學習CNN卷積神經網絡分類識別手寫數字圖像數據(MNIST)

MATLAB中用BP神經網絡預測人體脂肪百分比數據

Python中用PyTorch機器學習神經網絡分類預測銀行客戶流失模型

R語言實現CNN(卷積神經網絡)模型進行回歸數據分析

SAS使用鳶尾花(iris)數據集訓練人工神經網絡(ANN)模型

【視頻】R語言實現CNN(卷積神經網絡)模型進行回歸數據分析

Python使用神經網絡進行簡單文本分類

R語言用神經網絡改進Nelson-Siegel模型擬合收益率曲線分析

R語言基於遞歸神經網絡RNN的溫度時間序列預測

R語言神經網絡模型預測車輛數量時間序列

R語言中的BP神經網絡模型分析學生成績

matlab使用長短期記憶(LSTM)神經網絡對序列數據進行分類

R語言實現擬合神經網絡預測和結果可視化

用R語言實現神經網絡預測股票實例

使用PYTHON中KERAS的LSTM遞歸神經網絡進行時間序列預測

python用於NLP的seq2seq模型實例:用Keras實現神經網絡機器翻譯

用於NLP的Python:使用Keras的多標籤文本LSTM神經網絡分類

文章來源: https://twgreatdaily.com/zh-tw/65a8c48762f4fe86299c67deb6067adf.html