原文鏈接:http://?p=26519 一個(gè)簡(jiǎn)單的編碼器-解碼器LSTM神經(jīng)網(wǎng)絡(luò)應(yīng)用于時(shí)間序列預(yù)測(cè)問(wèn)題:預(yù)測(cè)天然氣價(jià)格,預(yù)測(cè)范圍為 10 天?!斑M(jìn)入”時(shí)間步長(zhǎng)也設(shè)置為 10 天。) 只需要 10 天來(lái)推斷接下來(lái)的 10 天??梢允褂?10 天的歷史數(shù)據(jù)集以在線(xiàn)學(xué)習(xí)的方式重新訓(xùn)練網(wǎng)絡(luò)。 數(shù)據(jù)集是天然氣價(jià)格(查看文末了解數(shù)據(jù)獲取方式) ,具有以下特征: 相關(guān)視頻:LSTM神經(jīng)網(wǎng)絡(luò)架構(gòu)和工作原理及其在Python中的預(yù)測(cè)應(yīng)用讀取數(shù)據(jù)并將日期作為索引處理# 固定日期時(shí)間并設(shè)置為索引 dftet.index = pd.DatetimeIndex
# 用NaN來(lái)填補(bǔ)缺失的日期(以后再補(bǔ)) dargt = f\_arget.reindex(ales, fill\_value=np.nan)
# 檢查 print(d_tret.dtypes) df_aget.head(10) 
處理缺失的日期# 數(shù)據(jù)歸納(使用 "向前填充"--根據(jù)之前的值進(jìn)行填充)。 dfaet.fillna(method='ffill', inplace=True) 

特征工程因?yàn)槲覀冋谑褂蒙疃葘W(xué)習(xí),所以特征工程將是最小的。 通過(guò)設(shè)置固定的上限(例如 30 倍中位數(shù))修復(fù)異常高的值 # 在df_agg中修復(fù)任何非常高的值 - 歸一化為中值 for col in co\_to\_fi_ies: dgt\[col\] = fixnaes(dftget\[col\]) 
添加滯后# 增加每周的滯后性 df\_tret = addag(d\_aget, tare\_arble='Price', step\_ak=7) # 增加30天的滯后性 df\_get = ad\_ag(df\_ret, tagt\_able='Price', sep_bck=30) 
# 合并后刪除任何有NA值的列 d_gt.dropna(inplace=True) print(dfget.shape)
tie\_nx = df\_art.index 
歸一化# 標(biāo)準(zhǔn)化訓(xùn)練數(shù)據(jù)\[0, 1\] sclr = prcsing.Maxcaer((0,1)) 
準(zhǔn)備訓(xùn)練數(shù)據(jù)集在這里,我們將數(shù)據(jù)集從 [samples, features] 轉(zhuǎn)換為 [samples, steps, features] - 與算法 LSTM 一起使用的維度。下面的序列拆分使用“walk-forward”方法來(lái)創(chuàng)建訓(xùn)練數(shù)據(jù)集。 # 多變量多步驟編碼器-解碼器 lstm 示例 # 選擇一個(gè)時(shí)間步驟的數(shù)量
# 維度變成\[樣本數(shù)、步驟、特征\] X, y = splices(datasformed, n\_ep\_in, n\_ep\_out)
# 分成訓(xùn)練/測(cè)試 et_ut = int(0.05*X.shpe\[0\]) X\_tain, X\_est, ytrain, y\_tst = X\[:-tetaont\], X\[-tes\_ont:\], y\[:-tstmunt\], y\[-es_unt:\] 
訓(xùn)練模型這利用了長(zhǎng)期短期記憶算法。 # 實(shí)例化和訓(xùn)練模型 print model = cre\_odel(n\_tps\_in, n\_tep\_out, n\_feures, lerig_rate=0.0001) 

探索預(yù)測(cè)%%time #加載特定的模型
model = lod\_id\_del( n_stepin, n\_sep\_out, X_tan.shape\[2\]) 
# 展示對(duì)一個(gè)樣本的預(yù)測(cè) testle_ix = 0 yat = mdel.predict(X\_tet\[est\_amle\_ix\].reshape((1,n\_sep_in, nfatues)),erbose=Tue) 
# 計(jì)算這一個(gè)測(cè)試樣本的均方根誤差 rmse = math.sqrt 
plot\_result(yhat\[0\], scaler, saved\_columns) 


點(diǎn)擊標(biāo)題查閱往期內(nèi)容 平均 RMSE # 收集所有的測(cè)試RMSE值 rmesores = \[\] for i in range: yhat = oel.predict(Xtet\[i\].reshape((1, \_stes\_in, _faues)), verbose=False) # 計(jì)算這一個(gè)測(cè)試樣本的均方根誤差 rmse = math.sqrt(mensqaerror(yhat\[0\], y_test\[i\])) 
訓(xùn)練整個(gè)數(shù)據(jù)集#在所有數(shù)據(jù)上實(shí)例化和訓(xùn)練模型 modl\_l = cret\_mel(nsep\_in, steps\_ou, n_etures,learnnrate=0.0001) mde\_all, ru\_ime, weighfie = trin(md_all, X, y, batcsie=16, neohs=15) 

樣本內(nèi)預(yù)測(cè)注意:模型已經(jīng)“看到”或訓(xùn)練了這些樣本,但我們希望確保它與預(yù)測(cè)一致。如果它做得不好,模型可能會(huì)欠擬合或過(guò)擬合。要嘗試的事情: # 獲得10個(gè)步 da\_cent = dfret.iloc\[-(ntes\_in*2):-nsps_in\]
# 標(biāo)準(zhǔn)化 dta_ectormed = sclr.rasfrm(daareent)
# 維度變成\[樣本數(shù)、步驟、特征\] n_res = dtcentorm.shape\[1\] X\_st = data\_recn\_trsrd.reshape((1, n\_tps\_n, n\_feares))
# 預(yù)測(cè) foecst = mlll.predict(X_past)
# 擴(kuò)大規(guī)模并轉(zhuǎn)換為DF forcast = forast.resape(n_eaturs)) foect = saer.inese_transform(forecast) fuure\_dtes df\_targe.ide\[-n\_steps\_out:\]
# 繪圖 histrcl = d_aet.ioc\[-100:, :1\] # 獲得歷史數(shù)據(jù)的X步回溯 for i in ane(oisae\[1\]): fig = plt.igre(fgze=(10,5)) # 繪制df_agg歷史數(shù)據(jù) plt.plot(.iloc\[:,i\] # 繪制預(yù)測(cè)圖 plt.plot(frc.iloc\[:,i\])
# 標(biāo)簽和圖例 plt.xlabel 
預(yù)測(cè)樣本外# 獲取最后10步 dtareent = dfargt.iloc\[-nstpsin:\]。
# 標(biāo)準(zhǔn)化 dta\_ecntranfomed = scaler.trasorm(data\_recent)
# 預(yù)測(cè) forct = meall.rict(_past)
# 擴(kuò)大規(guī)模并轉(zhuǎn)換為DF foreast = foecs.eshape(\_seps\_ut, n_eatures)) foreast = sclerinvers_tranorm(focast) futur\_daes = pd.daternge(df\_argetinex\[-1\], priods=step_out, freq='D')
# 繪圖 htrical = df_taet.iloc\[-100:, :1\] # 獲得歷史數(shù)據(jù)的X步回溯 # 繪制預(yù)測(cè)圖 plt.plot(fectoc\[:,i\]) 
|