4 min read

Модель Хольта-Винтера (Holt-Winters' Model)

Модель Хольта-Винтера (Holt-Winters' Model)
Фото: Atle Mo / Unsplash

Модель Хольта-Винтера (алгоритм тройного экспоненциального сглаживания) – метод прогнозирования Временных рядов (Time Series), учитывающий тренд, Cезонность (Seasonality) и Шум (Noise).

Прогноз модели HWM. Источник: staesthetic.wordpress.com

Анализ временных рядов – это наиболее широко используемая область Науки о данных (Data Science) и Машинного обучения (ML); он использует исторические данные, чтобы определить тенденцию. На прогнозируемые значения могут влиять определенные внешние факторы, которые известны как Предиктор (Predictor Variable), например, на продажи продукта влияет скидка, или температура зависит от влажности и скорости ветра и т.д.

Специалисту по анализу данных доступен ряд алгоритмов прогнозирования временных рядов, но выбор зависит от бизнес-задач и Датасета (Dataset). Для анализа могут использоваться простые методы прогнозирования временных рядов, таких как Скользящее среднее (Moving Average), Экспоненциальное сглаживание (Exponential Smoothing), Модель Бокса — Дженкинса (ARIMA) и т.д. Более продвинутое прогнозирование подразумевает Глубокое обучение (Deep Learning) и Рекуррентные нейросети (RNN), Долгую краткосрочную память (LSTM), Экстремальный бустинг градиента (XGBoost), Градиентный бустинг (GB) и т.д.

Экспоненциальное сглаживание Холта-Винтера, названное в честь двух его авторов – Чарльза Холта (Charles Holt) и Питера Винтера (Peter Winter), является одним из старейших методов анализа временных рядов, который учитывает тенденции и сезонность при прогнозировании. Этот метод имеет три основных аспекта: среднее значение с учетом тренда и сезонности. Эти три аспекта представляют собой три типа экспоненциального сглаживания, поэтому метод также известен как тройное экспоненциальное сглаживание. Разберем подробно каждый из аспектов.

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

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

Тройное экспоненциальное сглаживание: statsmodels

Давайте посмотрим, как работает метод, с помощью примера. У нас есть хронология посещаемости веб-сайта за несколько дней, давайте попробуем предсказать количество посетителей на следующие 3 дня. Для начала импортируем необходимые библиотеки:

import matplotlib
from matplotlib import pyplot as plt
from pylab import rcParams

import pandas as pd
import seaborn as sns

import statsmodels
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.seasonal import seasonal_decompose 
from statsmodels.tsa.holtwinters import SimpleExpSmoothing   
from statsmodels.tsa.holtwinters import ExponentialSmoothing

# Зададим стандартный размер холста графика
rcParams['figure.figsize'] = 20, 5

Импортируем данные об уникальных посетителях сайта:

visitors = pd.read_csv('https://www.dropbox.com/s/5uidyjqy8dijae4/daily-website-visitors.csv?dl=1', sep = ';', index_col = 'Date', parse_dates = True)
visitors = visitors.rename(columns = {'Unique Visits': 'Уникальных посетителей'})
visitors.head()

Заполним пробелы в столбце посещаемости, если таковые имеются, и построим Ящик с усами (Boxplot), чтобы увидеть Выбросы (Outlier) – значительно отстоящие от основного массива Наблюдения (Observation):

visitors['Уникальных посетителей'].fillna(value = visitors ['Уникальных посетителей'].mean(), inplace = True)
sns.boxplot(x = visitors['Уникальных посетителей'])

Рассчитаем Стандартизованную оценку (Z-Score) для каждого наблюдения, то есть меру удаленности от Среднего значения (Mean):

visitors['Стандартизованная оценка'] = (visitors['Уникальных посетителей'] - visitors['Уникальных посетителей'].mean()) / visitors['Уникальных посетителей'].std(ddof = 0)
visitors.head()

Сгруппируем данные по месяцам с помощью метода resample() и отобразим результат на графике:

visitors = visitors.resample('MS').sum()
visitors[['Уникальных посетителей']].plot(title = 'Ежемесячная посещаемость')

Разложим временной ряд на компоненты:

decompose_result = seasonal_decompose(visitors['Уникальных посетителей'], model = 'multiplicative')
decompose_result.plot()
plt.show()

Разделим датасет на Тренировочные данные (Train Data) и Тестовые данные (Test Data):

train_visitors = visitors[:55]
test_visitors = visitors[55:]

Построим график, отображающий прогноз посещаемости:

fitted_model = ExponentialSmoothing(train_visitors['Уникальных посетителей'], trend = 'mul', seasonal = 'mul', seasonal_periods = 2).fit()
test_predictions = fitted_model.forecast(25)
train_visitors['Уникальных посетителей'].plot(legend = True, label = 'Тренировочные данные')
test_visitors['Уникальных посетителей'].plot(legend = True, label = 'Тестовые данные')
test_predictions.plot(legend = True, label = 'Прогноз')

Ограничения метода

Несмотря на то, что метод Холта-Винтера дает отличный результат, он все же имеет определенные недостатки. Одним из основных ограничений этого алгоритма является мультипликативная характеристика сезонности: модель работает, когда у нас есть временные рамки с очень небольшими суммами. Временной ряд с точками, имеющими значения 10 и 1, провоцирует фактическую разницу в 9 пунктов, то есть первое число больше второго на 1000%. Более того, сезонность, которая тоже является относительным понятием, может резко исказить прогнозы, что и произошло с нашим прогнозом посещаемости.

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Автор оригинальной статьи: Snehal_bm