在 Python 中使用 Holt-Winters 進行預測
[我首先在這裡將這個問題發佈到 Stack Overflow ,但沒有得到任何回复,所以我想我會在這裡嘗試。如果不允許轉發,請見諒。]
我一直在嘗試使用Holt-Winters 算法的這種實現在 Python 中進行時間序列預測,但遇到了障礙……基本上,對於某些系列(正)輸入,它有時會預測負數,這應該清楚並非如此。即使預測不是負面的,它們有時也會非常不准確——比應有的高/低幾個數量級。給算法更多的數據周期似乎沒有幫助,實際上往往會使預測變得更糟。
我正在使用的數據具有以下特徵,這可能是問題:
- 非常頻繁地採樣(每 15 分鐘一個數據點,而不是示例使用的每月數據) - 但根據我的閱讀,Holt-Winters 算法應該沒有問題。也許這表明實施存在問題?
- 有多個週期性 - 有每日峰值(即每 96 個數據點)以及週末數據的每週週期明顯低於工作日數據 - 例如工作日可以在 4000 左右達到峰值,但周末達到 1000 左右 - 但即使我只給出它是工作日數據,我遇到了負數問題。
在實現或使用 Holt-Winters 算法時,我是否缺少一些東西?我不是統計學家,所以我使用上面鏈接中指示的 alpha、beta 和 gamma 的“默認”值 - 這可能是問題所在嗎?計算這些值的更好方法是什麼?
或者……這裡有比 Holt-Winters 更好的算法嗎?最終,我只想從這裡的歷史數據中創建合理的預測。我嘗試過單指數和雙指數平滑,但(據我所知)都不支持數據的周期性。
我還研究了通過 rpy2使用 R預測包 - 這會給我帶來更好的結果嗎?我想我仍然需要計算參數等等,所以如果我當前的問題在於算法的實現,這將是一個好主意……?
任何幫助/輸入將不勝感激!
我認為你提到的 R 預測包比僅僅使用 Holt-Winters 更適合這個問題。您感興趣的兩個函數是ets()和auto.arima()。ets() 將擬合指數平滑模型,包括 Holt-Winters 和其他幾種方法。它將為各種模型選擇參數(alpha、beta 和 gama),然後返回具有最低 AIC(或 BIC,如果您願意)的那個。auto.arima() 的工作方式類似。
但是,正如 IrishStat 指出的那樣,這些模型可能不適合您的分析。在這種情況下,請嘗試計算一些協變量,例如周末、節假日及其交互作用的虛擬變量。指定有意義的協變量後,使用 auto.arima() 查找 ARMAX 模型,然後使用forecast()進行預測。您最終可能會得到比在 python 中使用默認參數的簡單 Holt-Winters 模型更好的東西。
您還應該注意 ets() 和 auto.arima 都可以擬合季節性模型,但您需要將數據格式化為季節性時間序列。如果您需要任何幫助,請告訴我。
您可以在此處閱讀有關預測包的更多信息。