Портфельный проект Data Science похож на подготовку к практическому экзамену на водительские права: вы не учитесь водить машину, вы учитесь сдавать экзамен

В этом руководстве я хочу показать вам, как делать прогнозы доходов в виде временных рядов на основе реальных данных о розничной торговле. Для этих задач я буду использовать очень распространенную библиотеку: Prophet, разработанную учеными из Facebook.

Почему Пророк?

Согласно странице Prophet на GitHub:

«Инструмент для создания высококачественных прогнозов для данных временных рядов с множественной сезонностью с линейным или нелинейным ростом»

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

Данные

Данные, используемые в этом руководстве, поступают от розничной компании, они имеют сильные сезонные компоненты из-за характера бизнеса, из которого поступают данные. Фрейм данных анонимизирован и содержит два столбца: datetime транзакции и ее сумму.

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

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

Транзакции были собраны в период с июня 2018 года по октябрь 2019 года и содержат 11284 записей о продажах.

Но давайте немного углубимся в Prophet: согласно документации Facebook Prophet, данные, которые должны быть помещены в Prophet, должны иметь очень жесткий формат: столбец с именем ds для моментов времени и другой с именем y для цели.

Этого легко добиться с помощью следующих фрагментов:

На этом этапе данные могут выглядеть готовыми к использованию для соответствия модели, но после построения графика необходимо сделать очень важное соображение:

Кажется, что данные содержат некоторые значения, которые почему-то выглядят странно, очень экстремальные значения, которые сдвигают среднее значение: что это?

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

В науке о данных следует правильно обрабатывать выбросы, поскольку они могут значительно ввести в заблуждение анализ и / или ухудшить качество модели.

Хорошей и очень часто используемой стратегией для избавления от выбросов является правило межквартильного (IQR), выбросы находят, глядя на наблюдения, которые падают ниже Q1–1,5 IQR или выше Q3 + 1,5 * IQR. Это может быть реализовано в пандах со следующим синтаксисом:

Чтобы лучше понять, что произошло, могут оказаться полезными коробчатые диаграммы:

На этом этапе можно взглянуть на «чистый» набор данных:

При создании моделей машинного (и глубокого) обучения мы хотим иметь некоторые метрики, чтобы понять, как модели работают, поэтому первая подобранная модель - это базовая модель; эта модель состоит из самого простого установщика, предоставленного Prophet, и будет использоваться в качестве основы для измерения улучшений между другими моделями.

Модель приспособлена и используется для прогнозирования окна в 60 дней, и она оценивается по производительности на 12-й и 60-й день, чтобы получить лучшее представление о краткосрочных и долгосрочных прогнозах.

Метрика, выбранная для оценки моделей для этого руководства, - это MAE: средняя абсолютная ошибка - это инструмент, предназначенный для измерения средней величины ошибок в прогнозах, он не принимает во внимание направление ошибки и все различия между фактическими значениями. и прогнозы имеют одинаковый вес.

MAE - очень распространенная метрика для такого рода задач, для более глубокого объяснения я хотел бы упомянуть этот пост.

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

Но давайте проверим MAE:

Первая модель начинается с MAE около 240 на 12-й день, что означает среднюю ошибку ± 240 евро (валюта нашего целевого значения) в день 1, при сравнении с прогнозом на 60 дней ошибка достигает величины ± 450. евро.

На этом этапе можно пойти дальше и построить вторую модель, которая в конечном итоге (и надеюсь) сможет превзойти первую; прокручивая документацию пророка, можно увидеть, что у Prophet есть метод, который позволяет пользователю указывать праздники по странам.

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

Вторая модель демонстрирует некоторые улучшения, однако модель соответствует данным с некоторыми странными всплесками на линии соответствия:

Как видно из графика, эта модель начинается с MAE около 230, достигая 360–370 примерно на 60-й день. Следовательно, в краткосрочной перспективе это, как правило, лучшая модель, в то время как в долгосрочной перспективе она работает немного лучше, чем базовая.

Углубляясь в документацию Prophet, можно увидеть, что можно добавить настраиваемую сезонность к нашей модели, указав продолжительность цикла и его порядок Фурье.

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

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

Но как можно свести к минимуму длительную ошибку?

Увидев, что добавление периода сезонности в два месяца помогает уловить некоторые тенденции, можно предположить, что хорошей стратегией было бы добавление большего количества условий сезонности. Работает, но…

Но будь осторожен! Добавление большого количества сезонных компонентов может привести к сильному переобучению, этого можно частично избежать, уменьшив члены Фурье, что, не вдаваясь в глубину, делает сезонность «менее инвазивной».

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

Выводы

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

Очень часто модели обучаются методом проб и ошибок, другими словами: требуется несколько попыток для достижения заметных результатов. Это не означает, что нужно просто попробовать все наугад, а лучше понять данные.

В этом примере данные взяты из модного ритейла, в модном ритейле производственные циклы короткие, футболки (почти) продаются только летом, а джемперы только зимой, поэтому были добавлены различные пользовательские условия сезонности.

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