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

Вступление

Это тематическое исследование посвящено прогнозированию единичных продаж товаров для эквадорской сети супермаркетов Corporación Favorita с целью улучшения управления запасами.
Corporación Favorita - крупная эквадорская компания. базирующаяся продуктовая розничная сеть, в которой работают сотни супермаркетов, на полках которых находится более 200 000 различных продуктов.

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

Почему это проблема регрессии?

Регрессионный анализ используется для прогнозирования непрерывной целевой переменной на основе одной или нескольких независимых переменных. Тот факт, что переменная, которую необходимо спрогнозировать, то есть «объем продаж», является непрерывной по своей природе, делает ее проблемой регрессии.

Бизнес-проблема. Бакалейный продавец (Corporación Favorita) может столкнуться с двумя из следующих проблем:

  • Недостаток - ситуация, при которой товар отсутствует в наличии.
    Проблема дефицита (т. е. популярные товары быстро распродаются, оставляя деньги на столе, а покупатели futing) увеличивает риск потери продаж, поскольку покупатели с большей вероятностью будут искать необходимые товары в другом месте,
    что, в свою очередь, может стать огромной потерей возможностей для розничного продавца.
  • Избыточный запас - ситуация, при которой товар присутствует в количестве, превышающем необходимое или требуемое. Проблема избытка запасов может потенциально стоить огромных денег, поскольку продукты просто лежат на полках,
    где они не используются. В зависимости от типа они могут быть испорчены, что приведет к полному ущербу для продавца.


    Таким образом, вышеупомянутые проблемы могут быть решены путем точного прогнозирования продаж отдельных товаров. < br /> Возможность предсказать объем продаж позволит им лучше организовать свои логистические операции. Это потенциально сократит как альтернативные издержки, связанные с дефицитом, так и затраты на хранение, вызванные избыточным запасом.

Показатель производительности - нормированная взвешенная среднеквадратическая логарифмическая ошибка (NWRMSLE)

Набор данных можно загрузить с Kaggle.

Описание данных

  • Данные обучения включают в себя целевые единицы_продаж по дате, store_nbr и item_nbr, а также уникальный идентификатор для маркировки строк.
  • Тестовые данные включают в себя предполагаемые комбинации даты, store_nbr, item_nbr, а также информацию о продвижении.
  • Метаданные магазина включают город, штат, тип и кластер (кластер - это группа похожих магазинов)
  • Метаданные предмета включают семейство, класс и скоропортящиеся продукты.
  • Данные транзакций включают количество транзакций продаж на каждую дату, комбинацию store_nbr. Включено только во временные рамки обучающих данных.
  • Данные о нефти включают дневную цену на нефть. Включает значения как для обучающих, так и для тестовых данных.
  • Данные о событиях включают праздники и события с метаданными

Загрузка данных (с помощью Wget)

Wget - это бесплатный программный пакет для получения файлов с использованием HTTP, HTTPS, FTP и FTPS, наиболее широко используемых протоколов Интернета.

Извлечения файлов

Установка p7zip для распаковки файлов с расширением .7z.

Функции памяти

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

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

Ссылка: уменьшить-использование-памяти

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

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

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

1. EDA по набору данных о поездах

Вывод типов данных из тестовых данных

Загрузка test.csv во фрейм данных, сокращение использования памяти и последующее сохранение его типов данных для загрузки train.csv.

Загрузка train.csv

Возможности:

  • Дата
  • Номер магазина (целые числа, представляющие разные магазины)
  • Номер позиции (целые числа, представляющие разные магазины)
  • По продвижению (логическая функция, определяющая, была ли конкретному проданному товару назначена специальная цена акции в конкретный магазин. Эта функция содержит много значений NA.)

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

Проверка отсутствующих значений:

Проверка наличия в каком-либо столбце фрейма данных поезда значений Nan.

Замена значений Nan на -1 в столбце onpromotion

Штучные продажи в каждом магазине:

  • Здесь 54 уникальных магазина.
  • В магазине №44 максимальные продажи.
  • В магазине №52 минимальные продажи.

Продажи в год:

  • Приведены данные о продажах с 2013 по 2017 год.
  • Продажи растут каждый год, кроме 2017 года.

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

Продажи в месяц за каждый год:

  • Декабрьский месяц имеет максимальные продажи каждый год (что имеет смысл из-за Рождества и курортного сезона).
  • Февраль месяц имеет минимальные продажи каждый год.
  • Это подтверждает, что продажи меняются в зависимости от «Даты» и что в данных присутствует фактор сезонности.

Примечание: данные о продажах за 2017 год только до 15 августа.

Только фильтрация данных за 2016 год.

Количество строк в данных Train превышает 125 миллионов. Далее будут изучены только данные за 2016 год. Предполагая, что каждый год имеет похожие распределения.

Продажи в день недели:

Добавление дня недели как функции

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

Нет. Товаров по акции:

  • Небольшая часть товаров находится в продвижении
  • Большинство товаров не продвигаются.

Примечание. На этом графике используются данные только за 2016 год, некоторые из значений - это Nan за предыдущие годы. Т.е. все данные обучения содержат 17,3% элементов, для которых информация неизвестна (например, Nan).

2. Набор данных EDA On Stores:

Загрузка store.csv:

Объединение фрейма данных магазина с фреймом данных о продажах:

Продажи на штат:

Продажи по городу:

  • В Кито максимальные продажи в целом (так как в нем максимальное количество магазинов).
  • В городах наблюдается определенная разница в средних количествах продаж.

Продажи в зависимости от типа магазина:

  • Типы A и D имеют гораздо более высокие продажи по сравнению с другими типами. Но у Типа А прибл. 1/2 нет. магазинов по сравнению с типом D, что означает, что магазины типа A могут быть больше по размеру или могут быть в отличном месте
  • Тип E имеет минимальные продажи (так как у него минимальное количество магазинов).

Продажи на кластер:

  • Кластер 14 имеет максимальные продажи.
  • В кластере 16 минимальные продажи.
  • Функция кластера показывает явное изменение показателей продаж.

3. EDA по набору данных о товарах

Загрузка items.csv:

Объединение фрейма данных о товарах и фрейма данных о продажах:

Продажи на семейство товаров:

  • ПРОДУКТЫ I - самая продаваемая семья (поскольку в ней максимальное количество товаров)
  • Семейство позиций показывает изменение количества продаж.

Продажа скоропортящихся / нескоропортящихся продуктов:

  • Продажи нескоропортящихся продуктов выше, чем продаж скоропортящихся продуктов (поскольку наиболее продаваемым семейством продуктов является Бакалея I, в котором есть нескоропортящиеся продукты)

4. EDA по транзакционным данным:

Загрузка файла transaction.csv:

Нет. транзакций в месяц за каждый год:

Добавление года, месяца и дня недели в качестве функций

  • В декабре больше всего транзакций за все годы
  • С годами квадраты светлеют, что говорит о том, что нет. сделок увеличивается с каждым годом.

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

Нет. транзакций в день недели за каждый год:

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

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

5. EDA On Holidays_events Набор данных:

Загрузка holiday_events.csv:

Объединение фрейма данных о распродажах и праздниках

Продажи в зависимости от региона:

  • Максимальный объем продаж приходится на национальные праздники / мероприятия, следующие за местными праздниками / событиями.

Продажи по названию языкового стандарта:

  • В Эквадоре максимальные продажи.
  • В большинстве регионов аналогичные продажи.

Продажи по типу:

  • Особые дни типа "Праздник" и "Событие" имеют более высокие продажи по сравнению с другими типами.
  • Мост и Рабочий день имеют самые низкие продажи.

6. EDA по набору данных о нефти

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

Загрузка oil.csv:

Цена на нефть истекла:

  • Цена на нефть достигает пика примерно в сентябре 2013 года и составляет около 110 долларов.
  • С июля 2014 года цена на нефть начала резко снижаться до марта 2015 года.
  • С июля 2016 года по июль 2017 года цена на нефть относительно стабильна.

Цена на нефть и проданная единица за дату:

  • Анализируя приведенный выше график, трудно интерпретировать какую-либо закономерность между unit_sales и ценой на нефть. т.е. цена на нефть и unit_sales мало связаны.

Резюме EDA

  • День недели, Месяц также могут быть добавлены в качестве функций для прогнозирования продаж.
  • Характеристики магазина, такие как город, штат, тип и кластер, важны для прогнозирования продаж.
  • Характеристики предмета, включая семейство, класс и скоропортящиеся продукты, также важны и будут использоваться для прогнозирования.
  • Также могут быть учтены особенности региона и типа праздника / мероприятий.
  • Цена на нефть не имеет особого отношения, поэтому от нее можно отказаться.

Предварительная обработка данных

Построение гистограммы: для понимания распределения данных.

  • Гистограмма переменной Unit_sales показывает, что она не распределяется нормально.
  • На одном конце целая куча очень маленьких значений, а большие значения даже не видны четко.
  • Приведенный выше график показывает, что переменная «Unit_sales» не соответствует нормальному распределению и сильно отклонена вправо.

Справка - Ссылка

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

Преобразование журнала:

Преобразование целевой переменной - unit_sales (y) Путем добавления 1 и взятия журнала, т.е. log (y + 1) Взятие журнала unit_sales плюс небольшое значение (например, 1), поскольку логарифм нуля не определен.

Построение гистограммы (после преобразования журнала):

Преобразование журнала сделало сильно искаженные распределения менее искаженными.

Обработка категориальных переменных:

Прежде чем продолжить, мы должны преобразовать категориальные переменные, такие как item_family, store _state, store_city, store_family, которые необходимо обработать, в машиночитаемую форму. Итак, одним из способов обработки категориальной переменной является Label Encoding.

Что такое кодировка метки?

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

Кодировка ярлыка - Семейство элементов:

Как мы видим в столбце «Семья», каждому классу семьи присвоен уникальный номер (начиная с 0).

Кодировка ярлыка - штат, город и тип магазина:

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

Преодоление данных

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

Перед созданием функций нам необходимо подготовить данные в трех форматах:

  1. Данные, содержащие пары store_nbr и item_nbr.
  2. Данные основаны на item_nbr.
  3. Данные основаны на парах item_class и store_nbr.

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

Код для подготовки данных можно увидеть здесь.

Функциональная инженерия

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

Что такое функции задержки?

L функции метки - это в основном функции или переменные, которые содержат данные о предыдущих временных шагах. Например, мы прогнозируем продажи продукта. Таким образом, продажи предыдущего дня могут быть важны для прогнозирования. Другими словами, значение в момент времени t зависит от значения в момент времени t-1. Прошлые значения называются лагами, поэтому t-1 - это задержка 1, t-2 - задержка 2 и т. Д.

Что такое функции скользящего окна?

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

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

Получить временной интервал:

Приведенная ниже функция широко используется при создании функций для фильтрации данных на основе дат, т. Е. Выбора только тех столбцов даты, которые соответствуют «периодам» дней после дня (Дата-минус).

Рекламные функции:

Мы разрабатываем различные типы функций на основе рекламных данных, таких как:

  • Сумма рекламных акций с прошлыми данными в разные дневные интервалы.
  • Сумма рекламных акций с будущими данными через разные дневные интервалы.
  • Функция продвижения (т.е. есть ли акция или нет) на 16 дней в прошлом и будущем.

Особенности продаж:

Мы разрабатываем различные типы функций на основе данных о продажах, таких как:

  • Среднее, медианное, минимальное, максимальное, стандартное отклонение продаж с прошлыми данными через разные дневные интервалы.
  • Экспоненциально взвешенная сумма продаж и средняя разница продаж с прошлыми данными через разные дневные интервалы.
  • Особенности лага продаж на 16 дней в прошлом.
  • Среднее значение продаж за каждый день недели за 4 недели и 20 недель в прошлом.

Особенности продаж в зависимости от продвижения:

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

Функции подсчета:

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

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

Все эти пользовательские функции можно создать вместе следующим образом:

Создание набора данных:

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

Набор данных для обучения:

Теперь мы создадим набор данных о поездах на 2 дня с разницей в 7 дней между ними, а датой начала будет 28/6/2017.

Набор данных проверки:

Точно так же мы создадим набор данных для проверки, но только на 1 день, и дата будет 26/7/2017.

Набор тестовых данных:

Точно так же мы создадим набор тестовых данных на 1 день, и дата будет 16.08.2017.

Выбор функции

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

Выбор функций с использованием случайного леса

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

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

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

Выбор 300 лучших функций для всех 16 моделей

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

Первый подход:

Следующий подход к обучению 16 различных моделей прогнозирования продаж на следующие 16 дней будет применяться для каждого алгоритма машинного обучения, который будет опробован. Будет выбран алгоритм машинного обучения, который даст наименьшее значение показателя производительности, то есть нормализованная взвешенная среднеквадратическая логарифмическая ошибка (NWRMSLE).

1. Линейная модель (SGD Regressor)

подогнан за счет минимизации потерь в квадрате с помощью SGD.

Стандартизация:

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

Настройка гиперпараметров (с помощью поиска по сетке)

Результаты:

  • Лучшие параметры: eta0 = 0,001, альфа = 0,01
  • Лучший результат (NWRMSLE) = 0,6065

2. Регрессор SGD с приближением ядра RBF.

Уловка с ядром RBF плохо масштабируется для большого количества обучающих выборок или большого количества функций.

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

Настройка гиперпараметров (с помощью поиска по сетке):

Результаты:

  • Лучшие параметры: eta0 = 0,1, альфа = 0,0001, гамма = 0,001
  • Лучший результат (NWRMSLE) = 0,6162

3. Случайный лес

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

Настройка гиперпараметров (с использованием gp minim):

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

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

Результаты:

Лучшие параметры:

  • max_depth = 18
  • num_parallel_tree = 1000
  • подвыборка = 0,9
  • colsample_bynode = 0,1

Лучший результат (NWRMSLE) = 0,6058

4. XGBoost

XGBoost означает экстремальное усиление градиента.

Что такое усиление градиента?

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

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

Настройка гиперпараметров (с использованием gp minim):

Результаты:

Лучшие параметры:

  • colsample_bytree = 0,436243
  • гамма = 0,313009
  • eta = 0,005820
  • max_depth = 10
  • min_child_weight = 3
  • подвыборка = 0,743976

Лучший результат (NWRMSLE) → 0,5941

5. LightGBM

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

  • Более быстрая скорость обучения и более высокая эффективность.
  • Более низкое использование памяти.
  • Лучшая точность.
  • Способен обрабатывать крупномасштабные данные.

Настройка гиперпараметров (с использованием gp minim):

Результаты:

Лучшие параметры:

  • скорость_обучения = 0,020756
  • num_leaves = 71
  • min_data_in_leaf = 180
  • feature_fraction = 0,614000
  • bagging_fraction = 0,792127
  • bagging_freq = 1

Лучший результат (NWRMSLE) → 0,5934

Окончательные результаты

Как видно из приведенной выше таблицы:

Производительность LightGBM является наилучшей, поскольку она дает наименьшую ошибку. Следовательно, мы выберем LightGBM в качестве нашей окончательной модели.

Добавление дополнительных данных:

Теперь для модели LightGBM мы будем экспериментировать следующим образом:

  • Добавление дополнительных предыдущих данных, т.е. (6 дней) с датой начала 31/5/2017 для обучения модели с лучшими параметрами
  • Увеличение числа раундов повышения для дальнейшего улучшения характеристик модели.

Результаты:

  • Производительность модели была увеличена за счет использования большего количества предыдущих данных и большего количества раундов повышения.
  • Оценка (NWRMSLE) = 0,5890

Финальная ЛГБМ-модель:

Теперь для окончательной LGBM-модели мы будем обучать модель на общих данных (т. Е. Комбинированных данных поезда + данных проверки).

Примечание: не используются фиксированные раунды ускорения = 4000, так как нет данных проверки для ранней остановки. Использование различных раундов ускорения для всех 16 моделей, которые показали наилучшие результаты во время предыдущей тренировки.

Прогнозирование тестовых данных:

Перед окончательной отправкой необходимо выполнить два шага:

  • Нам нужно обработать наши предсказанные значения, взяв экспоненту и вычтя 1, потому что ранее мы выполнили преобразование журнала данных.
  • У нас есть массив прогнозируемых значений, который необходимо преобразовать в формат, который принимает kaggle, то есть фрейм данных с двумя столбцами id и unit_sales.

Результаты Kaggle:

  • Частный рейтинг (NWRMSLE) = 0,51241 (Rank-2)
  • Публичная оценка (NWRMSLE) = 0,50822

Примечание: это была поздняя отправка, поэтому она не указана в таблице лидеров.

Для пошагового полного кода

См. Эти Блокноты Jupyter

Будущая работа :

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

Ну вот и все!

Спасибо за чтение.

Надеюсь, вы узнали что-то новое.

Вы также можете найти меня и связаться со мной в LinkedIn и GitHub.

Не забудьте дать 👏!

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

  1. Https://www.researchgate.net/publication/338681895_Applied_Machine_Learning_for_Supermarket_Sales_Prediction
  2. Http://web.stanford.edu/class/archive/cs/cs221/cs221.1192/2018/restricted/posters/jzhao4/poster.pdf
  3. Https://www.analyticsvidhya.com/blog/2019/12/6-powerful-feature-engineering-techniques-time-series/
  4. Https://www.researchgate.net/publication/311900279_Predictive_Analysis_of_Big_Data_in_Retail_Industry
  5. Https://www.kaggle.com/c/favorita-grocery-sales-forecasting