Использование Prophet для прогнозирования трафика веб-страницы

Прогнозирование просмотров веб-страниц может быть довольно сложным. Причина этого в том, что просмотры страниц имеют тенденцию видеть значительные «всплески» в данных — когда количество просмотров намного выше среднего.

Давайте возьмем пример просмотров страниц для термина «землетрясение» на основе статистики, доступной на Wikimedia Toolforge с января 2016 года по август 2020 года:

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

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

В связи с этим построена модель Prophet для прогнозирования просмотров страниц по данному поисковому запросу.

Конфигурация модели

Prophet – это модель прогнозирования от Facebook, которая прогнозирует временные ряды, используя специальные корректировки с учетом таких факторов, как сезонность, праздничные периоды и точки изменения.

Вот декомпозиция вышеуказанного временного ряда в Python:

Из вышеизложенного мы можем наблюдать сильное снижение тренда с течением времени. Более того, визуальный осмотр графика сезонности указывает на годовые колебания.

Аддитивная модель с годовой сезонностью и порядком Фурье 10 определяется следующим образом:

prophet_basic = Prophet(seasonality_mode='additive')
prophet_basic.add_seasonality('yearly_seasonality', period=12, fourier_order=10)
prophet_basic.fit(train_dataset)

Вот разбивка компонентов, как указано Пророком.

fig1 = prophet_basic.plot_components(forecast)

Теперь, когда компоненты тренда и сезонности определены, следующая задача — определить количество точек изменения в данных.

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

В связи с этим варьировался параметр точки изменения и рассчитывалась оценка RMSE (среднеквадратичная ошибка) на тестовом наборе:

RMSE сведен к минимуму с 6 точками изменения, поэтому модель будет настроена с такими же.

Вот график точек изменения:

import matplotlib.pyplot as plt
figure = pro_change.plot(forecast)
for changepoint in pro_change.changepoints:
    plt.axvline(changepoint,ls='--', lw=1)

Результаты

Приведенная выше модель Prophet была обучена на 80% набора данных (обучающая выборка). Теперь прогнозы генерируются на основе последних 20% набора данных (набор тестов) и вычисляются среднеквадратическая ошибка вместе со средней ошибкой прогноза.

>>> from sklearn.metrics import mean_squared_error
>>> from math import sqrt
>>> mse = mean_squared_error(actual, predicted)
>>> rmse = sqrt(mse)
>>> print('RMSE: %f' % rmse)
RMSE: 1747.629375
>>> forecast_error = (actual-predicted)
>>> mean_forecast_error = np.mean(forecast_error)
>>> mean_forecast_error
-681.8562874251497

Со среднеквадратичной ошибкой 1747 и максимальным значением 9699 в тестовом наборе ошибка кажется разумной по сравнению с максимальным значением (размером ошибка составляет примерно 17% от общего диапазона).

При выборе 90-го процентиля в качестве максимального диапазона (в интересах исключения аномально больших значений) получается максимальное значение 5378.

>>> np.quantile(actual, 0.9)
5378.3

Предполагая, что это значение является максимальным, размер среднеквадратичной ошибки составляет 32% от общего диапазона, что значительно выше.

Вот график прогнозируемых и фактических значений:

Мы видим, что, хотя модель Пророка обычно предсказывает общую тенденцию — она не может предсказать эти большие «всплески» в данных — что способствует более высокой ошибке предсказания.

С этой точки зрения, хотя Prophet все еще может быть полезен для определения долгосрочной тенденции данных, предсказание аномалий может быть выполнено более эффективно с использованием распределения Монте-Карло.

В частности, статистика просмотров веб-страниц подчиняется распределению Парето, т.е. за любые 100 дней — 80% просмотров страниц будут зафиксированы в 20% дней. Если вам интересно, другая статья на эту тему включена в раздел «Ссылки».

Вывод

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

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

Большое спасибо за чтение, и любые вопросы или отзывы очень приветствуются.

Отказ от ответственности. Эта статья написана на условиях «как есть» и без каких-либо гарантий. Он был написан с целью дать обзор концепций науки о данных и никоим образом не должен интерпретироваться как профессиональный совет.

использованная литература