博客專欄

EEPW首頁 > 博客 > 基于SARIMA、XGBoost和CNN-LSTM的時間序列預(yù)測對比(2)

基于SARIMA、XGBoost和CNN-LSTM的時間序列預(yù)測對比(2)

發(fā)布人:數(shù)據(jù)派THU 時間:2022-12-23 來源:工程師 發(fā)布文章
建模

下面我們開始使用三種不同的時間序列算法:SARIMA、XGBoost和CNN-LSTM,進行建模并比較。

對于所有三個模型,都使用預(yù)測下一個數(shù)據(jù)點進行預(yù)測。Walk-forward驗證是一種用于時間序列建模的技術(shù),因為隨著時間的推移,預(yù)測會變得不那么準(zhǔn)確,因此更實用的方法是在實際數(shù)據(jù)可用時,用實際數(shù)據(jù)重新訓(xùn)練模型。

在建模之前需要更詳細(xì)地研究數(shù)據(jù)。圖8顯示了SP2數(shù)據(jù)集中所有特征的相關(guān)熱圖。熱圖顯示了因變量直流功率,與模塊溫度、輻照和環(huán)境溫度的強相關(guān)性。這些特征可能在預(yù)測中發(fā)揮重要作用。

在下面的熱圖中,交流功率顯示皮爾森相關(guān)系數(shù)為1。為了防止數(shù)據(jù)泄漏問題,我們將直流功率從數(shù)據(jù)中刪除。

圖片

SARIMA

季節(jié)自回歸綜合移動平均(SARIMA)是一種單變量時間序列預(yù)測方法。由于目標(biāo)變量顯示出24小時循環(huán)周期的跡象,SARIMA是一個有效的建模選項,因為它考慮了季節(jié)影響。這可以從下面的季節(jié)分解圖中觀察到。

圖片

SARIMA算法要求數(shù)據(jù)是平穩(wěn)的。有多種方法來檢驗數(shù)據(jù)是否平穩(wěn),例如統(tǒng)計檢驗(增強迪基-福勒檢驗),匯總統(tǒng)計(比較數(shù)據(jù)的不同部分的均值/方差)和可視化分析數(shù)據(jù)。在建模之前進行多次測試是很重要的。

增強迪基-富勒(ADF)檢驗是一種“單位根檢驗”,用于確定時間序列是否平穩(wěn)。從根本上說,這是一個統(tǒng)計顯著性檢驗,其中存在一個零假設(shè)和替代假設(shè),并根據(jù)得出的p值得出結(jié)論。

零假設(shè):時間序列數(shù)據(jù)是非平穩(wěn)的。

替代假設(shè):時間序列數(shù)據(jù)是平穩(wěn)的。

在我們的例子中,如果p值≤0.05,我們可以拒絕原假設(shè),并確認(rèn)數(shù)據(jù)沒有單位根。


 from statsmodels.tsa.stattools import adfuller
result = adfuller(plant2_dcpower.values)
print('ADF Statistic: %f' % result[0]) print('p-value: %f' % result[1]) print('Critical Values:') for key, value in result[4].items():    print('\t%s: %.3f' % (key, value))

圖片

從ADF檢驗來看,p值為0.000553,< 0.05。根據(jù)這一統(tǒng)計數(shù)據(jù),可以認(rèn)為該數(shù)據(jù)是穩(wěn)定的。然而,查看圖2(最上面的圖),有明顯的季節(jié)性跡象(對于被認(rèn)為是平穩(wěn)的時間序列數(shù)據(jù),不應(yīng)該有季節(jié)性和趨勢的跡象),這說明數(shù)據(jù)是非平穩(wěn)的。因此,運行多個測試非常重要。

為了用SARIMA對因變量建模,時間序列需要是平穩(wěn)的。如圖9(第一個和第三個圖)所示,直流電有明顯的季節(jié)性跡象。取第一個差值[t-(t-1)]去除季節(jié)性成分,如圖10所示,因為它看起來類似于正態(tài)分布。數(shù)據(jù)現(xiàn)在是平穩(wěn)的,適用于SARIMA算法。

圖片

SARIMA的超參數(shù)包括p(自回歸階數(shù))、d(差階數(shù))、q(移動平均階數(shù))、p(季節(jié)自回歸階數(shù))、d(季節(jié)差階數(shù))、q(季節(jié)移動平均階數(shù))、m(季節(jié)周期的時間步長)、trend(確定性趨勢)。

圖片

圖11顯示了自相關(guān)(ACF)、部分自相關(guān)(PACF)和季節(jié)性ACF/PACF圖。ACF圖顯示了時間序列與其延遲版本之間的相關(guān)性。PACF顯示了時間序列與其滯后版本之間的直接相關(guān)性。藍色陰影區(qū)域表示置信區(qū)間。SACF和SPACF可以通過從原始數(shù)據(jù)中取季節(jié)差(m)來計算,在本例中為24,因為在ACF圖中有一個明顯的24小時的季節(jié)效應(yīng)。

根據(jù)我們的直覺,超參數(shù)的起點可以從ACF和PACF圖中推導(dǎo)出來。如ACF和PACF均呈逐漸下降的趨勢,即自回歸階數(shù)(p)和移動平均階數(shù)(q)均大于0。p和p可以通過分別觀察PCF和SPCF圖,并計算滯后值不顯著之前具有統(tǒng)計學(xué)顯著性的滯后數(shù)來確定。同樣,q和q可以在ACF和SACF圖中找到。

差階(d)可以通過使數(shù)據(jù)平穩(wěn)的差的數(shù)量來確定。季節(jié)差異階數(shù)(D)是根據(jù)從時間序列中去除季節(jié)性成分所需的差異數(shù)來估計的。

這些超參數(shù)選擇可以看這篇文章:https://arauto.readthedocs.io/en/latest/how_to_choose_terms.html

也可以采用網(wǎng)格搜索方法進行超參數(shù)優(yōu)化,根據(jù)最小均方誤差(MSE)選擇最優(yōu)超參數(shù),包括p = 2, d = 0, q = 4, p = 2, d = 1, q = 6, m = 24, trend = ' n '(無趨勢)。


 from time import time from sklearn.metrics import mean_squared_error from statsmodels.tsa.statespace.sarimax import SARIMAX
configg = [(2, 1, 4), (2, 1, 6, 24), 'n']
def train_test_split(data, test_len=48):    """    Split data into training and testing.    """    train, test = data[:-test_len], data[-test_len:]    return train, test
def sarima_model(data, cfg, test_len, i):    """    SARIMA model which outputs prediction and model.    """    order, s_order, t = cfg[0], cfg[1], cfg[2]    model = SARIMAX(data, order=order, seasonal_order=s_order, trend=t,                    enforce_stationarity=False, enfore_invertibility=False)    model_fit = model.fit(disp=False)    yhat = model_fit.predict(len(data))
   if i + 1 == test_len:        return yhat, model_fit    else:        return yhat
def walk_forward_val(data, cfg):    """    A walk forward validation technique used for time series data. Takes current value of x_test and predicts    value. x_test is then fed back into history for the next prediction.    """    train, test = train_test_split(data)    pred = []    history = [i for i in train]    test_len = len(test)
   for i in range(test_len):        if i + 1 == test_len:            yhat, s_model = sarima_model(history, cfg, test_len, i)            pred.append(yhat)            mse = mean_squared_error(test, pred)            return pred, mse, s_model        else:            yhat = sarima_model(history, cfg, test_len, i)            pred.append(yhat)            history.append(test[i])    pass
if __name__ == '__main__':    start_time = time()    sarima_pred_plant2, sarima_mse, s_model = walk_forward_val(plant2_dcpower, configg)    time_len = time() - start_time
   print(f'SARIMA runtime: {round(time_len/60,2)} mins')

圖片

圖12顯示了SARIMA模型的預(yù)測值與SP2 2天內(nèi)記錄的直流功率的比較。

為了分析模型的性能,圖13顯示了模型診斷。相關(guān)圖顯示在第一個滯后后幾乎沒有相關(guān)性,下面的直方圖顯示在平均值為零附近的正態(tài)分布。由此我們可以說模型無法從數(shù)據(jù)中收集到進一步的信息。

圖片


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉