色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

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

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

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

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

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

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

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

          圖片

          SARIMA

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

          圖片

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

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

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

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

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


           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。根據這一統(tǒng)計數據,可以認為該數據是穩(wěn)定的。然而,查看圖2(最上面的圖),有明顯的季節(jié)性跡象(對于被認為是平穩(wěn)的時間序列數據,不應該有季節(jié)性和趨勢的跡象),這說明數據是非平穩(wěn)的。因此,運行多個測試非常重要。

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

          圖片

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

          圖片

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

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

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

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

          也可以采用網格搜索方法進行超參數優(yōu)化,根據最小均方誤差(MSE)選擇最優(yōu)超參數,包括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模型的預測值與SP2 2天內記錄的直流功率的比較。

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

          圖片


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



          關鍵詞: AI

          相關推薦

          技術專區(qū)

          關閉