Сколько iPhone XS будет продано за первые 12 месяцев? Какова тенденция спроса на Tesla после того, как Илон Маск курит травку в прямом эфире? Будет ли эта зима теплой? (Я живу в Канаде.) Если вам интересно узнать об этих проблемах, экспоненциальное сглаживание обещает вам возможность заглянуть в будущее, построив модели.

Методы экспоненциального сглаживания присваивают экспоненциально убывающие веса прошлым наблюдениям. Чем позднее будет получено наблюдение, тем больший вес будет присвоен. Например, разумно придавать больший вес наблюдениям за последний месяц, чем наблюдениям за 12 месяцев назад.

В этой статье будет показано, как построить модели Простое экспоненциальное сглаживание, Холта и Холта-Винтерса с использованием Python и Statsmodels. Для каждой модели демонстрация организована следующим образом:

Statsmodels - это модуль Python, который предоставляет классы и функции для реализации множества различных статистических моделей. Нам нужно импортировать его в код Python следующим образом.

from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt

Исходный набор данных в наших примерах содержит количество продаж недвижимости в городе США за период с 1 января 2007 г. по 12 декабря 2017 г.

Используйте линейный график, чтобы увидеть изменение данных по годам.

df.plot.line(x = 'YEAR_MONTH_SALE_DATE', 
             y = 'COUNT_YEAR_MONTH_SALE_SAMPLE')
plt.show()

Мы будем прогнозировать продажи недвижимости в 2017 году на основе исторических данных за 10 лет (2007-2016 гг.).

Простое экспоненциальное сглаживание (SES)

SES - хороший выбор для прогнозирования данных без четких тенденций или сезонных закономерностей. Прогнозы рассчитываются с использованием средневзвешенных значений, что означает, что наибольшие веса связаны с самыми последними наблюдениями, а наименьшие веса связаны с самыми старыми наблюдениями:

где 0≤ α ≤1 - параметр сглаживания.

Скорость уменьшения весов контролируется параметром сглаживания α. Если α велико (то есть близко к 1), больший вес придается более поздним наблюдениям. Есть 2 крайних случая:

  • α = 0: прогнозы всех будущих значений равны среднему (или «среднему») историческим данным, что называется методом среднего.
  • α = 1: просто установите для всех прогнозов значение последнего наблюдения, что в статистике называется Наивным методом.

Здесь мы запускаем три варианта простого экспоненциального сглаживания:

  1. В fit1, мы явно предоставляем модель с параметром сглаживания α = 0,2
  2. В fit2, выбираем α = 0,6
  3. В fit3, мы используем автоматическую оптимизацию, которая позволяет моделям статистики автоматически находить для нас оптимизированное значение. Это рекомендуемый подход.
# Simple Exponential Smoothing
fit1 = SimpleExpSmoothing(saledata).fit(smoothing_level=0.2,optimized=False)
fcast1 = fit1.forecast(12).rename(r'$\alpha=0.2$')
# plot
fcast1.plot(marker='o', color='blue', legend=True)
fit1.fittedvalues.plot(marker='o',  color='blue')



fit2 = SimpleExpSmoothing(saledata).fit(smoothing_level=0.6,optimized=False)
fcast2 = fit2.forecast(12).rename(r'$\alpha=0.6$')
# plot
fcast2.plot(marker='o', color='red', legend=True)
fit2.fittedvalues.plot(marker='o', color='red')


fit3 = SimpleExpSmoothing(saledata).fit()
fcast3 = fit3.forecast(12).rename(r'$\alpha=%s$'%fit3.model.params['smoothing_level'])
# plot
fcast3.plot(marker='o', color='green', legend=True)
fit3.fittedvalues.plot(marker='o', color='green')

plt.show()

Прогнозирование продаж недвижимости с SES на период с 2017-01 по 2017-12.

Метод Холта

Холт расширил простое экспоненциальное сглаживание (решение данных без четкого тренда или сезонности), чтобы можно было прогнозировать данные с тенденциями в 1957 году. Метод Холта включает уравнение прогноза и два уравнения сглаживания (одно для уровня и один для тенденции):

где 0≤ α ≤1 - параметр сглаживания уровня, а 0≤ β * ≤1 - параметр сглаживания тренда.

Для долгосрочных прогнозов прогнозирование с помощью метода Холта будет неограниченно увеличиваться или уменьшаться в будущем. В этом случае мы используем метод затухающего тренда с параметром затухания 0 ‹ϕ‹ 1, чтобы прогноз не «слился».

Опять же, здесь мы запускаем три варианта метода Halt:

  1. В fit1, мы явно предоставляем модель с параметром сглаживания α = 0,8, β * = 0,2.
  2. В fit2, мы используем экспоненциальную модель, а не аддитивную модель Холта (которая используется по умолчанию).
  3. В fit3, мы используем демпфированную версию аддитивной модели Холта, но позволяем оптимизировать параметр демпфирования ϕ, фиксируя значения для α = 0,8, β * = 0,2.
fit1 = Holt(saledata).fit(smoothing_level=0.8, smoothing_slope=0.2, optimized=False)
fcast1 = fit1.forecast(12).rename("Holt's linear trend")

fit2 = Holt(saledata, exponential=True).fit(smoothing_level=0.8, smoothing_slope=0.2, optimized=False)
fcast2 = fit2.forecast(12).rename("Exponential trend")

fit3 = Holt(saledata, damped=True).fit(smoothing_level=0.8, smoothing_slope=0.2)
fcast3 = fit3.forecast(12).rename("Additive damped trend")


fit1.fittedvalues.plot(marker="o", color='blue')
fcast1.plot(color='blue', marker="o", legend=True)
fit2.fittedvalues.plot(marker="o", color='red')
fcast2.plot(color='red', marker="o", legend=True)
fit3.fittedvalues.plot(marker="o", color='green')
fcast3.plot(color='green', marker="o", legend=True)

plt.show()

Метод Холта-Винтерса

(Питер Уинтерс был учеником Холта. Метод Холта-Винтерса был сначала предложен Питером, а затем они работали над ним вместе. Какая прекрасная и великая связь. Так же, как Платон встретил Сократа.)

Метод Холта-Винтерса подходит для данных с трендами и сезонностями, которые включают параметр сглаживания сезонности γ. Есть два варианта этого метода:

  • Аддитивный метод: сезонные колебания примерно постоянны на протяжении всего ряда.
  • Мультипликативный метод: сезонные колебания меняются пропорционально уровню ряда.

Здесь мы используем полный метод Холта-Винтерса, включая компонент тренда и сезонный компонент. Statsmodels допускает все комбинации, в том числе показанные в примерах ниже:

  1. В fit1, мы используем аддитивный тренд, аддитивный сезонный период season_length=4 и преобразование Бокса-Кокса.
  2. В fit2, мы используем аддитивный тренд, мультипликативный сезонный период season_length=4 и преобразование Бокса-Кокса.
  3. В fit3, мы используем аддитивный затухающий тренд, аддитивный сезонный период season_length=4 и преобразование Бокса-Кокса.
  4. В fit4, мы используем аддитивный затухающий тренд, мультипликативный сезонный период season_length=4 и преобразование Бокса-Кокса.
fit1 = ExponentialSmoothing(saledata, seasonal_periods=4, trend='add', seasonal='add').fit(use_boxcox=True)
fit2 = ExponentialSmoothing(saledata, seasonal_periods=4, trend='add', seasonal='mul').fit(use_boxcox=True)
fit3 = ExponentialSmoothing(saledata, seasonal_periods=4, trend='add', seasonal='add', damped=True).fit(use_boxcox=True)
fit4 = ExponentialSmoothing(saledata, seasonal_periods=4, trend='add', seasonal='mul', damped=True).fit(use_boxcox=True)
fit1.fittedvalues.plot(style='--', color='red')
fit2.fittedvalues.plot(style='--', color='green')

fit1.forecast(12).plot(style='--', marker='o', color='red', legend=True)
fit2.forecast(12).plot(style='--', marker='o', color='green', legend=True)

plt.show()
print("Forecasting sales of properties using Holt-Winters method with both additive and multiplicative seasonality.")

Подводя итог, мы рассмотрели механику и код Python для 3 моделей экспоненциального сглаживания. Как показано в таблице ниже, я предлагаю методику выбора подходящей модели для вашего набора данных.

Сводка параметров сглаживания для различных форм компонентов методов экспоненциального сглаживания.

Экспоненциальное сглаживание в настоящее время является одним из наиболее широко используемых и успешных методов прогнозирования в отрасли. Как спрогнозировать розничные продажи, прибытие туристов, спрос на электроэнергию или рост доходов? Экспоненциальное сглаживание - одна из суперспособностей, необходимых для раскрытия будущего перед вами.

Запишитесь на курс Udemy 🦞:

Рекомендательная система с машинным обучением и статистикой