博客專欄

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

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

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

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

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

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

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

        圖片

        SARIMA

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

        圖片

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

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

        零假設:時間序列數據是非平穩的。

        替代假設:時間序列數據是平穩的。

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

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

        圖片

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

        圖片

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

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

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

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

        也可以采用網格搜索方法進行超參數優化,根據最小均方誤差(MSE)選擇最優超參數,包括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顯示了模型診斷。相關圖顯示在第一個滯后后幾乎沒有相關性,下面的直方圖顯示在平均值為零附近的正態分布。由此我們可以說模型無法從數據中收集到進一步的信息。

        圖片


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



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 遂宁市| 高雄市| 浦江县| 田东县| 崇义县| 根河市| 昌乐县| 湛江市| 台江县| 盐山县| 鄂托克旗| 焦作市| 汝阳县| 无棣县| 临颍县| 东平县| 丹东市| 青阳县| 鸡西市| 黎城县| 西贡区| 安塞县| 北海市| 龙州县| 克山县| 榆中县| 江川县| 利津县| 喀喇| 浏阳市| 手机| 定南县| 黑水县| 河曲县| 罗田县| 长武县| 吉木乃县| 涟水县| 威远县| 托克逊县| 敖汉旗|