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

В этом блоге рассказывается о том, как я решил реальную проблему, представленную Kaggle. Проблема была проста -

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

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

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

Что нам нужно помнить, прежде чем формулировать задачу как проблему машинного обучения?

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

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

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

Поскольку мы знаем, что НИКОГДА (в большинстве случаев) не будем давать абсолютно точные прогнозы, нам нужна мера для определения ошибки. Следовательно, процентная ошибка прогнозируемых и фактических продаж может дать лучшее понимание.

Итак, подведем итоги! В целом у нас есть 3 важных ограничения:

  1. Нет требований к низкой задержке
  2. Важность функции
  3. Ошибка в процентах

Метрика, которую мы собираемся использовать в качестве KPI, - это SMAPE, т. Е. Симметричная средняя абсолютная ошибка в процентах, и RMSE, т. Е. Среднеквадратическая ошибка.

Постановка проблемы машинного обучения

Мы загружаем данные с помощью Python3 и с помощью Google Colab.
Давайте посмотрим, как выглядят наши данные -

Загрузил данные с помощью pandas, используя дату в качестве индекса. Мы видим, что у нас есть 4 функции -

date: дата продажи данных.
магазин: идентификатор магазина.
товар: идентификатор товара.
продажи: количество товаров, проданных в конкретный магазин на определенную дату.

Исследовательский анализ данных

Давайте разберемся с данными. Мы добавили некоторые функции на основе даты и времени, такие как дата, месяц, год, day_of_week.

  • Временные ряды имеют сезонный характер, например, продажи всегда остаются низкими в начале года и высокими в середине года и еще раз ниже в начале года ... невысоких месяцев в середине года.

  • Это позволяет нам разделить временной ряд на 3 отдельных компонента.
    График ясно показывает, что продажи нестабильны, наряду с очевидной сезонностью.

  • После построения графика продаж для каждого магазина мы видим, что максимальное количество продаж наблюдается в магазине 1, за которым следует магазин 8. Наименьшее количество продаж наблюдается в магазине 7.

Подготовка данных

Прежде чем строить отличные модели машинного обучения, мы подготавливаем данные в соответствии с нашими потребностями, чтобы получить наилучшие результаты. Мы добавляем еще несколько функций, основанных на времени, таких как 'Year', 'Month', 'Week', 'Day', 'Dayofweek', 'Dayofyear', 'weekofyear', 'Is_month_end', 'Is_month_start', 'Is_quarter_end' , 'Is_quarter_start', 'Is_year_end', 'Is_year_start'.

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

Моделирование

А теперь перейдем к самому хорошему, я имею в виду лучшему! Я разделил часть моделирования на 2 подмножества -
- Базовые модели
- Модели машинного обучения

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

Для всех следующих моделей мы будем оценивать модель на SMAPE и RMSE.

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

Использование предыдущих значений - Pt = (Pt − 1 + Pt − 2 + Pt − 3… .Pt − n) / n

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

Задайте распад в терминах периода полураспада, α = 1 − exp (log (0,5) / период полураспада)

Мы разделяем данные на обучение и перекрестную проверку как 80% - 20%. Здесь мы делаем разбиение на основе времени, и у нас есть последовательные данные. Мы берем данные за 4 года с 2013 по 2016 год для каждого магазина и товара в качестве обучения, а данные за 2017 год - в качестве данных перекрестной проверки.

Линейная регрессия -
Во-первых, мы обучаем модель линейной регрессии без настройки гиперпараметров и нормализованных функций, и вот результат, который мы получаем:

Тест SMAPE: 0.8473661033300371
Тест RMSE: 1.0650487158450959

Вау! Поразил прямо. Даже простая модель, которая идеально вписывается в линию, дает потрясающие результаты с погрешностью менее 1%. После этого линейная регрессия вызвала у меня гораздо более твердое уважение.
Но помните, «Важность характеристик»? (делая жест «цитаты»!). Ага, облом. Линейная регрессия неявно не придает важности функции. Так что, даже если у нас есть такая отличная модель, к сожалению, мы не сможем ее принять. (Хмуриться!) :(

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

XGBoost Regressor - обучение с настройкой гиперпараметров. Смотрите результаты.

Тест SMAPE: 1.8557876826185409
Тест RMSE: 2.4428290358987748

Ой! «Отличный» XGBoost тоже не делает вас счастливыми. Ошибка выше линейной регрессии. А как насчет важности функции?

Да!! Теперь все работает, как ожидалось (на каком-то уровне). Итак, EMA и MA действительно являются наиболее важными функциями. Мы знаем, что результаты соответствуют ожиданиям, поскольку предыдущие значения действительно играют жизненно важную роль, и теперь мы видим это. Спасибо, XGBoost. (Счастливый!) :)

Регрессор случайного леса - обучение с настройкой гиперпараметров. Смотрите результаты.

Тест SMAPE: 0.8751925305940013
Тест RMSE: 1.2986884849038731

Деревья действительно хорошо делают свое дело! Ошибка очень похожа на то, что мы получили с помощью линейной регрессии. Это могло быть то, что мы искали. Но подождите минутку! «Важность функции», помните?

Ага! Вот и все. Вот и все. Экспоненциально-взвешенное скользящее среднее пытается получить здесь всю заслугу. Даже если мы удалим множество других функций, кроме ewm, производительность не изменится. Думаю, теперь вы понимаете, насколько важны наши базовые модели как функции.

Заключение

Если посмотреть на наши бизнес-ограничения, поскольку у нас нет требований к низкой задержке, даже простая модель, такая как экспоненциально взвешенное скользящее среднее, работает лучше всего с наименьшим процентом ошибки.
Лучше всего работает модель машинного обучения с линейной регрессией. KPI (SMAPE) с Test SMAPE = 0,84.
Регрессор случайного леса идет вторым с немного большим количеством тестов SMAPE = 0.87 с некоторой интерпретируемостью модели, но считает важной только одну особенность.
Поскольку мы хотим, чтобы важность функции была разумной и полезной, мы можем заключить, что XGBoost Regressor является нашей лучшей моделью с Test SMAPE = 1.85, поскольку он дает разумный Test SMAPE по сравнению с другими моделями ML, но с большим количеством интерпретируемых функций важность.

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

размер пакета = 256
эпох = 10
LSTM = 128 единиц
Dropuout = 0,5
Активация = ReLU
Оптимизатор = Адам
потеря = Среднее Ошибка в квадрате
Показатели = ['SMAPE']

Итак, каковы результаты? Я не скажу тебе сразу. Ниже представлена ​​таблица, созданная с использованием библиотеки PrettyTable, в которой сравниваются все созданные нами модели.
Надеюсь, вы удивитесь! Готовый?

Ссылки:
1. Https://www.kaggle.com/arindamgot/eda-prophet-mlp-neural-network-forecasting
2. https://www.kaggle.com/thexyzt/keeping-it-simple- by-xyzt
3. https://www.kaggle.com/c/demand-forecasting-kernels-only/data