簡體   English   中英

在 Python 中使用 Holt-Winters 進行預測

[英]Using Holt-Winters for forecasting in Python

我一直在嘗試使用Holt-Winters 算法的這種實現在 Python 中進行時間序列預測,但遇到了障礙......基本上,對於某些(正)輸入系列,它有時會預測負數,這應該清楚並非如此。 即使預測不是負面的,它們有時也會非常不准確——比應有的高/低幾個數量級。 給算法更多的數據周期似乎沒有幫助,實際上往往會使預測變得更糟。

我正在使用的數據具有以下特征,這可能是問題:

  • 非常頻繁地采樣(每 15 分鍾一個數據點,而不是示例使用的每月數據) - 但根據我的閱讀,Holt-Winters 算法應該沒有問題。 也許這表明實施存在問題?

  • 有多個周期性 - 有每日峰值(即每 96 個數據點)以及周末數據的每周周期明顯低於工作日數據 - 例如工作日可以在 4000 左右達到峰值,但周末達到 1000 左右 - 但即使我只給出它是工作日數據,我遇到了負數問題。

在實現或使用 Holt-Winters 算法時,我是否缺少一些東西? 我不是統計學家,所以我使用上面鏈接中指示的 alpha、beta 和 gamma 的“默認”值 - 這可能是問題所在,有沒有更好的方法來計算這些值?

或者......這里有比 Holt-Winters 更好的算法嗎? 最終,我只想從這里的歷史數據中創建合理的預測。 我嘗試過單指數和雙指數平滑,但(據我所知)都不支持數據的周期性。

任何幫助/輸入將不勝感激!

我嘗試生成隨機數據,直到得到有趣的結果。 在這里,我輸入了所有正數並得到了負面預測:

y = [0.92, 0.78, 0.92, 0.61, 0.47, 0.4, 0.59, 0.13, 0.27, 0.31, 0.24, 0.01]
holtwinters(y, 0.2, 0.1, 0.05, 4)

...
forecast: -0.104857182966
forecast: -0.197407475203
forecast: -0.463988558577
forecast: -0.258023593197

但請注意,預測符合數據的負斜率。

這可能是您所說的數量級:

y = [0.1, 0.68, 0.15, 0.08, 0.94, 0.58, 0.35, 0.38, 0.7, 0.74, 0.93, 0.87]
holtwinters(y, 0.2, 0.1, 0.05, 4)

...
forecast: 1.93777559066
forecast: 3.11109138055
forecast: 0.910967977635
forecast: 0.684668348397

但我不確定你如何認為它非常不准確或判斷它“應該”更低。


每當你推斷數據時,你都會得到一些令人驚訝的結果。 您是否更擔心實現可能不正確,或者 output 沒有適合您的特定用途的良好屬性?

首先,如果您不確定算法的具體實現,我建議您為此創建一些測試用例。 采取另一種實現,也許是 matlab,無論如何,任何你知道它有效的東西。 生成一些輸入,將其提供給參考和您的實現,它應該是相同的。 我已經通過這種方式翻譯並驗證了 matlab 中的一些算法。 scipy.io.loadmat非常適合。

關於您對算法的使用:您談論的是幾天和幾周的周期性,並且您以分鍾的時間尺度提供數據。 我不知道這個特定的算法是否處理得很好,但無論如何我建議嘗試一些低通濾波,然后每小時將其輸入算法,甚至更慢。 一個時期的近 700 個時間步長可能太多而無法識別。 您輸入的數據還應包含至少兩個完整的時間序列周期。 如果您的算法支持周期性,您還必須以適當的方式為其提供數據,這樣它才能真正看到周期性。 您得到這些極值的事實可能是一個暗示,該算法只有一個方向上的穩定趨勢的日期。

也許您還想將您的預測分開,使一個針對每周預測進行優化,另一個針對日內預測進行優化,最后再將它們組合起來。

我認為這種方法的問題在於他們如何計算初始值。 他們似乎在使用線性 model 時:

這是一種非常糟糕的方法,不應該使用,因為趨勢會受到季節性模式的影響。 想象一個季節性模式,例如,一年中的最后一個時期總是一年中的最大值。 那么趨勢就會向上偏。 不幸的是,Bowerman、O'Connell 和 Koehler (2005) 並不是唯一推薦不良方法的人。 我在其他書中看到過類似的、更糟糕的程序。 [1]

一種更好的方法是分解趨勢和季節性的時間序列 [1]

[1] http://robjhyndman.com/hyndsight/hw-initialization/

在選擇適當的預測方法之前分析時間序列屬性很重要。

1 - 在應用 Holt-Winters 之前,檢查您的時間序列是否平穩可能很重要,如果不是,則區分它以實現此屬性,這有助於提高准確性。

2 - 數據會隨着時間的推移而周期性地變化,看起來趨勢的東西實際上可能是一個大的季節性周期的一部分。 如果這是您的情況(確實如此),也許您應該應用 Holt-Winters 兩次,每個季節期間一次,因為它無法處理多個周期性,然后分析更適合您的場景的內容。

3 - 試驗不同的平滑參數(alpha、beta 和 gamma)可能很重要。 它們越大,最后的少數觀察和最后計算的組件變得越重要。 嘗試找到一個自適應 Holt-Winters 實現,它會自動調整這些參數,看看會發生什么。

我建議您使用 R 語言,它包含一個自適應且易於使用的 Holt-Winters 實現,通過預測 package 提供,因此您可以輕松地試驗不同的配置。

您觀察到數據中存在周期性的事實意味着您還應該嘗試使用可以表達此類特征的 model。

Holt-Winters 是一個簡單的平滑 model 無法表達這一點。

經典方法是查看 ARMA model(自回歸移動平均線)及其自然擴展 SARIMA(季節性調整...)model。

底線:這確實是一個統計問題。 關於該主題的最佳著作之一是 Maddala 的《計量經濟學》。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM