2016-04-21 159 views
1

我有一些時間序列數據,其中包含一些季節性趨勢,我想用ARIMA模型來預測這個系列將來的行爲。ARIMA預測(python statsmodels)

爲了預測我感興趣的變量(log_var)將如何表現,我已經採取了每週,每月和每年的差異,然後將它們用作ARIMA模型的輸入。

下面是一個例子。

exog = np.column_stack([df_arima['log_var_diff_wk'], 
         df_arima['log_var_diff_mth'], 
         df_arima['log_var_diff_yr']]) 

model = ARIMA(df_arima['log_var'], exog = exog, order=(1,0,1)) 
results_ARIMA = model.fit() 

我這樣做了幾個不同的數據源,並在所有這些我看到了巨大的成績,在這個意義上,如果我繪製log_var反對results_ARIMA.fittedvalues的訓練數據,那麼它匹配得很好(我調p和q分別爲每個數據源,但是因爲我已經自己消除了差異,所以d始終爲0)。

但是,我想檢查一下預測是什麼樣子的,爲了做到這一點,我將exog重新定義爲「測試」數據集。例如,如果我在2014-01-01到2016-01-01之間訓練原始ARIMA模型,那麼「測試」集合將在2016-01-01之後。

我的方法對於某些數據源(從我們將預測與已知數值和趨勢看起來合理的情況進行預測)進行得很好,但對於其他數據來說卻很糟糕,儘管它們都是相同的'樣'數據,而且它們剛剛從不同的地理位置獲得。在一些地區,它完全無法捕捉每年在相同日期的訓練數據中一次又一次出現的明顯的季節性趨勢。 ARIMA模型總是適合訓練數據,似乎在某些情況下,預測是完全無用的。

我現在想知道我是否真的按照正確的程序來預測ARIMA模型的值。我的方法基本上是:

exog = np.column_stack([df_arima_predict['log_val_diff_wk'], 
         df_arima_predict['log_val_diff_mth'], 
         df_arima_predict['log_val_diff_yr']]) 

arima_predict = results_ARIMA.predict(start=training_cut_date, end = '2017-01-01', dynamic = False, exog = exog) 

這是使用ARIMA進行預測的正確方法嗎?

如果是這樣,有沒有一種方法可以嘗試理解爲什麼預測在某些數據集中看起來非常好而在其他情況下很糟糕,當ARIMA模型在兩種情況下似乎都適合訓練數據?

+0

什麼ARIMA做工作,沒有太多的瞭解,我會更新,它可能是你只是過度適合你的模型。過度擬合是機器學習中的一個非常普遍的問題,當訓練模型完全匹配您的訓練數據時會發生這種情況,但在預測測試集時似乎沒有用處(似乎是發生了什麼)。如果是這個問題(很難說),你可以嘗試使用這些參數來訓練,直到訓練集合適合但不完美,ARIMA可能會對測試數據集進行更好的概括。 –

回答

0

我有一個類似的問題atm,我還沒有完全弄清楚。似乎在Python中包含多個季節詞仍然有點棘手。 R似乎有這種能力,see here。所以,我可以給你的一個建議是用R現在提供的更復雜的功能來嘗試這個功能(儘管如果你還不熟悉R,這可能需要大量的時間投入)。

查看你的模擬季節模式的方法,採用n階差分不會給你季節性常數,而是你指定爲季節相關的時間點之間的差異的某種表示。如果這些差異很小,那麼糾正這些差異可能對您的建模結果沒有太大影響。在這種情況下,模型預測可能會相當好。相反,如果差異很大,包括它們很容易扭曲預測結果。這可以解釋您在建模結果中看到的變化。從概念上講,然後,你想要做的是代表隨着時間的推移常數。

在上面引用的博文中,作者主張使用傅立葉級數來模擬每個時間段內的方差。 NumPy和SciPy包都提供了用於計算快速傅里葉變換的例程。然而,作爲一名非數學家,我發現很難確定快速傅里葉變換產生了合適的數字。

最後我選擇使用韋爾奇信號分解格式SciPy的信號模塊。它所做的就是返回時間序列的頻譜密度分析,從中可以推導出時間序列中各個頻率的信號強度。

如果您在頻譜密度分析中確定與您試圖在時間序列中考慮的季節性頻率相對應的峯值,則可以使用它們的頻率和幅度構建表示季節變化的正弦波。然後,您可以將這些作爲外生變量包含在您的ARIMA中,非常類似於博客文章中的傅立葉術語。

這是關於我自己在這一點上 - 現在我試圖弄清楚我是否可以通過statsmodels ARIMA過程使用這些指定季節性趨勢的正弦波作爲外生變量我的模型(文檔指出它們不應該代表趨勢,但是嘿,一個人可以夢想,對吧?)編輯:This Rob Hyneman的博客文章也非常相關,並解釋了包括傅立葉術語背後的一些基本原理。

對不起,我不能給你一個在Python中被證明是有效的解決方案,但我希望這給你一些新的想法來控制這個討厭的季節性差異。

TL; DR:

  • 看來蟒蛇是不是很適合現在處理多個季節性而言,R可能是一個更好的解決方案(請參閱參考資料);

  • 使用差異分數來考慮季節性趨勢似乎不能捕捉與季節復發有關的常數方差;

  • 在python中執行此操作的一種方法可能是使用代表季節性趨勢的傅立葉級數(也可參考參考),其中可以使用Welch信號分解等其他方法獲得。不過,如何將這些作爲ARIMA中的外生變量使用以達到良好效果仍是一個懸而未決的問題。

祝你好運,

埃弗特

PS:如果我找到一個辦法讓這個在Python