[譯]如何使用Python構建指數平滑模型:Simple Exponential Smoothing, Holt, and Holt-Winters

原文鏈接:How to Build Exponential Smoothing Models Using Python: Simple Exponential Smoothing, Holt, and…html

今年前12個月,iPhone XS將售出多少部?在埃隆·馬斯克(Elon musk)在直播節目中吸食大麻以後,特斯拉的需求趨勢是什麼?這個冬天會暖和嗎?(我住在加拿大。)若是你對這些問題感到好奇,指數平滑法能夠經過創建模型來預測將來。python

指數平滑方法爲過去的觀測分配指數遞減的權重。獲得的觀測值越近,權重就越大。例如,與12個月前的觀測結果相比,對上個月的觀測結果給予更大的權重是合理的。函數

1.png

上圖爲指數平滑權值從過去到如今。優化

本文將說明如何使用PythonStatsmodel構建簡單指數平滑HoltHolt- winters模型。對於每一個模型,演示都按照如下方式組織。ui

模型操做方法+Python代碼spa

Statsmodels是一個Python模塊,它爲實現許多不一樣的統計模型提供了類和函數。咱們須要將它導入Python代碼,以下所示。code

import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt

咱們示例中的源數據以下:htm

data = [253993,275396.2,315229.5,356949.6,400158.2,442431.7,495102.9,570164.8,640993.1,704250.4,767455.4,781807.8,776332.3,794161.7,834177.7,931651.5,1028390,1114914]

咱們能夠先看看折線圖blog

plt.plot(data);

2.png

簡單指數平滑(SES)

對於沒有明顯趨勢或季節規律的預測數據,SES是一個很好的選擇。預測是使用加權平均來計算的,這意味着最大的權重與最近的觀測值相關,而最小的權重與最遠的觀測值相關get

3.png

其中0≤α≤1是平滑參數。

權重減少率由平滑參數α控制。 若是α很大(即接近1),則對更近期的觀察給予更多權重。 有兩種極端狀況:

  • α= 0:全部將來值的預測等於歷史數據的平均值(或「平均值」),稱爲平均值法
  • α= 1:簡單地將全部預測設置爲最後一次觀測的值,統計中稱爲樸素方法

這裏咱們運行三種簡單指數平滑變體:

  1. fit1中,咱們明確地爲模型提供了平滑參數\(α= 0.2\)
  2. fit2中,咱們選擇\(α= 0.6\)
  3. fit3中,咱們使用自動優化,容許statsmodels自動爲咱們找到優化值。 這是推薦的方法。
# Simple Exponential Smoothing
fit1 = SimpleExpSmoothing(data).fit(smoothing_level=0.2,optimized=False)
# plot
l1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(5)), marker='o')


fit2 = SimpleExpSmoothing(data).fit(smoothing_level=0.6,optimized=False)
# plot
l2, = plt.plot(list(fit2.fittedvalues) + list(fit2.forecast(5)), marker='o')


fit3 = SimpleExpSmoothing(data).fit()
# plot
l3, = plt.plot(list(fit3.fittedvalues) + list(fit3.forecast(5)), marker='o')

l4, = plt.plot(data, marker='o')
plt.legend(handles = [l1, l2, l3, l4], labels = ['a=0.2', 'a=0.6', 'auto', 'data'], loc = 'best', prop={'size': 7})
plt.show()

咱們預測了將來五個點。

4.png

Holt's 方法(二次指數平滑)

Holt擴展了簡單的指數平滑(數據解決方案沒有明確的趨勢或季節性),以便在1957年預測數據趨勢.Holt的方法包括預測方程和兩個平滑方程(一個用於水平,一個用於趨勢):

5.png

其中\(0≤α≤1\)是水平平滑參數,\(0≤β*≤1\)是趨勢平滑參數。

對於長期預測,使用Holt方法的預測在將來會無限期地增長或減小。 在這種狀況下,咱們使用具備阻尼參數\(0 <φ<1\)阻尼趨勢方法來防止預測「失控」。

6.png

一樣,這裏咱們運行Halt方法的三種變體:

  1. fit1中,咱們明確地爲模型提供了平滑參數\(α= 0.8\)\(β* = 0.2\)
  2. fit2中,咱們使用指數模型而不是Holt的加法模型(默認值)。
  3. fit3中,咱們使用阻尼版本的Holt附加模型,但容許優化阻尼參數\(φ\),同時固定\(α= 0.8\)\(β* = 0.2\)的值。
data_sr = pd.Series(data)
# Holt’s Method
fit1 = Holt(data_sr).fit(smoothing_level=0.8, smoothing_slope=0.2, optimized=False)
l1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(5)), marker='^')

fit2 = Holt(data_sr, exponential=True).fit(smoothing_level=0.8, smoothing_slope=0.2, optimized=False)
l2, = plt.plot(list(fit2.fittedvalues) + list(fit2.forecast(5)), marker='.')

fit3 = Holt(data_sr, damped=True).fit(smoothing_level=0.8, smoothing_slope=0.2)
l3, = plt.plot(list(fit3.fittedvalues) + list(fit3.forecast(5)), marker='.')

l4, = plt.plot(data_sr, marker='.')
plt.legend(handles = [l1, l2, l3, l4], labels = ["Holt's linear trend", "Exponential trend", "Additive damped trend", 'data'], loc = 'best', prop={'size': 7})
plt.show()

7.png

Holt-Winters 方法(三次指數平滑)

(彼得·溫特斯(Peter Winters)是霍爾特(Holt)的學生。霍爾特-溫特斯法最初是由彼得提出的,後來他們一塊兒研究。多麼美好而偉大的結合啊。就像柏拉圖遇到蘇格拉底同樣。)

Holt-Winters的方法適用於具備趨勢和季節性的數據,其包括季節性平滑參數\(γ\)。 此方法有兩種變體:

  • 加法方法:整個序列的季節變化基本保持不變。
  • 乘法方法:季節變化與系列水平成比例變化。

在這裏,咱們運行完整的Holt-Winters方法,包括趨勢組件和季節性組件。 Statsmodels容許全部組合,包括以下面的示例所示:

  1. fit1中,咱們使用加法趨勢,週期season_length = 4的加性季節和Box-Cox變換。
  2. fit2中,咱們使用加法趨勢,週期season_length = 4的乘法季節和Box-Cox變換。
  3. fit3中,咱們使用加性阻尼趨勢,週期season_length = 4的加性季節和Box-Cox變換。
  4. fit4中,咱們使用加性阻尼趨勢,週期season_length = 4的乘法季節和Box-Cox變換。
data_sr = pd.Series(data)
fit1 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='add').fit(use_boxcox=True)
fit2 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='mul').fit(use_boxcox=True)
fit3 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='add', damped=True).fit(use_boxcox=True)
fit4 = ExponentialSmoothing(data_sr, seasonal_periods=4, trend='add', seasonal='mul', damped=True).fit(use_boxcox=True)

l1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(5)), marker='^')
l2, = plt.plot(list(fit2.fittedvalues) + list(fit2.forecast(5)), marker='*')
l3, = plt.plot(list(fit3.fittedvalues) + list(fit3.forecast(5)), marker='.')
l4, = plt.plot(list(fit4.fittedvalues) + list(fit4.forecast(5)), marker='.')

l5, = plt.plot(data, marker='.')
plt.legend(handles = [l1, l2, l3, l4, l5], labels = ["aa", "am", "aa damped", "am damped","data"], loc = 'best', prop={'size': 7})

plt.show()

8.png

總而言之,咱們經過3個指數平滑模型的機制和python代碼。 以下表所示,我提供了一種爲數據集選擇合適模型的方法。

9.png

總結了指數平滑方法中不一樣份量形式的平滑參數。

10.png

指數平滑是當今行業中應用最普遍、最成功的預測方法之一。如何預測零售額、遊客數量、電力需求或收入增加?指數平滑是你須要展示將來的超能力之一。

相關文章
相關標籤/搜索