Портфельный проект 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, можно увидеть, что можно добавить настраиваемую сезонность к нашей модели, указав продолжительность цикла и его порядок Фурье.
Экспериментируя с различной настраиваемой сезонностью, я заметил, что данные имеют растущую тенденцию примерно каждые два месяца, поэтому я решил добавить сезонную составляющую в два месяца:
Модель продолжает лучше соответствовать данным, улавливая все больше и больше сезонных компонентов, это приводит к небольшому улучшению в краткосрочной перспективе, в то время как в долгосрочной перспективе кажется, что эта стратегия работает не так хорошо, и лучшая модель в долгосрочной перспективе , это все еще второй.
Но как можно свести к минимуму длительную ошибку?
Увидев, что добавление периода сезонности в два месяца помогает уловить некоторые тенденции, можно предположить, что хорошей стратегией было бы добавление большего количества условий сезонности. Работает, но…
Но будь осторожен! Добавление большого количества сезонных компонентов может привести к сильному переобучению, этого можно частично избежать, уменьшив члены Фурье, что, не вдаваясь в глубину, делает сезонность «менее инвазивной».
Подгонка последней модели к трем настраиваемым сезонным колебаниям, соответственно, каждые один, два и три месяца приводит к значительному уменьшению ошибки в долгосрочном периоде, а также к немного лучшей линии соответствия:
Выводы
Из этого небольшого руководства можно сделать вывод, что одна модель лучше работает в определенном временном диапазоне, в то время как в другом она может работать очень плохо.
Очень часто модели обучаются методом проб и ошибок, другими словами: требуется несколько попыток для достижения заметных результатов. Это не означает, что нужно просто попробовать все наугад, а лучше понять данные.
В этом примере данные взяты из модного ритейла, в модном ритейле производственные циклы короткие, футболки (почти) продаются только летом, а джемперы только зимой, поэтому были добавлены различные пользовательские условия сезонности.
Подбор моделей временных рядов может быть довольно сложной задачей, а этап развертывания может быть еще сложнее, например, подумайте о развертывании модели для клиента: каждый раз, когда клиент хочет получить некоторые прогнозы, модель необходимо снова подогнать, если модель затем размещается у некоторых облачных провайдеров, где вы платите по мере использования, расходы могут расти быстрыми темпами.