Python代寫利用LSTM模型進行時間序列預測分析 - 預測愛爾蘭的電力消耗


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

此示例中,神經網絡用於使用2011年4月至2013年2月期間的數據預測都柏林市議會公民辦公室的能源消耗。

 每日數據是通過總計每天提供的15分鍾間隔的消耗量來創建的。

LSTM簡介

LSTM(或長期短期存儲器網絡)允許分析具有長期依賴性的順序或有序數據。當涉及到這項任務時,傳統的神經網絡不足,在這方面,LSTM將用於預測這種情況下的電力消耗模式。

與ARIMA等模型相比,LSTM的一個特殊優勢是數據不一定需要是固定的(常數均值,方差和自相關),以便LSTM對其進行分析 - 即使這樣做可能會導致性能提升。

自相關圖,Dickey-Fuller測試和對數變換

為了確定我們的模型中是否存在平穩性

  1. 生成自相關和部分自相關圖
  2. 進行Dickey-Fuller測試
  3. 對時間序列進行對數變換,並再次運行上述兩個過程,以確定平穩性的變化(如果有的話)

首先,這是時間序列圖:

每天消耗lstm千瓦

據觀察,波動性(或消費從一天到下一天的變化)非常高。在這方面,對數變換可以用於嘗試稍微平滑該數據。在此之前,生成ACF和PACF圖,並進行Dickey-Fuller測試。

自相關圖

 

部分自相關圖

 

自相關和部分自相關圖都表現出顯着的波動性,這意味着時間序列中的幾個區間存在相關性。

運行Dickey-Fuller測試時,會產生以下結果:

 當p值高於0.05時,不能拒絕非平穩性的零假設。
  
 STD1
954.7248
4043.4302
0.23611754 

變異系數(或平均值除以標准差)為0.236,表明該系列具有顯着的波動性。

現在,數據被轉換為對數格式。

 雖然時間序列仍然不穩定,但當以對數格式表示時,偏差的大小略有下降:

每天消耗的千瓦數對數格式

此外,變異系數已顯着下降至0.0319,這意味着與平均值相關的趨勢的可變性顯着低於先前。

STD2 = np.std(數據集)
mean2 = np.mean(數據集)
cv2 = std2 / mean2 #Cafficient of Variation 
std2
 0.26462445 
mean2
 8.272395 
cv2
 0.031988855 

同樣,在對數數據上生成ACF和PACF圖,並再次進行Dickey-Fuller測試。

自相關圖

與log的自相關

偏自相關圖

部分自相關函數日志

Dickey-Fuller測試

... print('\ t%s:%。3f'%(鍵,值))
1%:-3.440
5%: -  2.866
10%: -  2.569 

Dickey-Fuller檢驗的p值降至0.0576。雖然這在技術上沒有輸入拒絕零假設所需的5%顯着性閾值,但對數時間序列已顯示基於CV度量的較低波動率,因此該時間序列用於LSTM的預測目的。

LSTM的時間序列分析

現在,LSTM模型本身用於預測目的。

數據處理

首先,導入相關庫並執行數據處理

LSTM生成和預測

模型訓練超過100個時期,並生成預測。

#生成LSTM網絡
model = Sequential()
model.add(LSTM(4,input_shape =(1,previous)))
 model.fit(X_train,Y_train,epochs = 100,batch_size = 1,verbose = 2)

#生成預測
trainpred = model.predict(X_train)

#將預測轉換回正常值
trainpred = scaler.inverse_transform(trainpred)

#calculate RMSE
trainScore = math.sqrt(mean_squared_error(Y_train [0],trainpred [:,0]))
 
#訓練預測
trainpredPlot = np.empty_like(dataset)
 
#測試預測

#繪制所有預測
inversetransform,= plt.plot(scaler.inverse_transform(dataset))

准確性

該模型顯示訓練數據集的均方根誤差為0.24,測試數據集的均方根誤差為0.23。平均千瓦消耗量(以對數格式表示)為8.27,這意味着0.23的誤差小於平均消耗量的3%。

以下是預測消費與實際消費量的關系圖:

預測與實際消費1天

有趣的是,當在原始數據上生成預測(未轉換為對數格式)時,會產生以下訓練和測試錯誤:

 在每天平均消耗4043千瓦的情況下,測試分數的均方誤差占總日均消耗量的近20%,並且與對數數據產生的相比非常高。

也就是說,重要的是要記住,使用1天的先前數據進行預測,即Y表示時間t的消耗,而X表示時間t-1的消耗,由代碼中的前一個變量設置先前。讓我們來看看這增加到個究竟1050天。

10天

10天

50天

50天

 

我們可以看到測試誤差在10天和50天期間顯着降低,並且考慮到LSTM模型在預測時考慮了更多的歷史數據,消耗的波動性得到了更好的捕獲。

鑒於數據是對數格式,現在可以通過獲得數據的指數來獲得預測的真實值。

例如,testpred變量用(1,-1)重新整形:

testpred.reshape(1,-1)
 array([[7.7722197,8.277015,8.458941,8.455311,8.447589,8.445035,
 ......
8.425287,8.404881,8.457063,8.423954,7.98714,7.9003944,
8.240862,8.41654,8.423854,8.437414,8.397851,7.9047146]],
dtype = float32)

結論

對於這個例子,LSTM被證明在預測電力消耗波動方面非常准確。此外,以對數格式表示時間序列允許平滑數據的波動性並提高LSTM的預測准確度。

如果您有任何疑問,請在下面發表評論。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM