Этот пост посвящен объяснению моего подхода к решению набора данных прогноза продаж Черной пятницы с использованием алгоритма машинного обучения. Набор данных был использован с платформы AnalyticsVidhya (https://datahack.analyticsvidhya.com/).

Постановка задачи

Розничная компания «ABC Private Limited» хочет понять поведение покупателя при покупке (в частности, сумму покупки) по отношению к различным продуктам разных категорий. Они поделились сводкой покупок различных клиентов для выбранных продуктов большого объема за последний месяц.
Набор данных также содержит демографические данные клиентов (возраст, пол, семейное положение, city_type, stay_in_current_city), сведения о продукте (product_id и категория продукта) и Общая сумма покупки за последний месяц.

Данные

Набор данных состоит из набора данных поезда и набора данных тестирования.

Начнем с изучения набора данных для обучения и тестирования.

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

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

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

Начнем с целевой переменной. Распределение целевой переменной (покупка) дает нам представление о том, что распределение похоже на распределение по Гауссу.

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

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

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

Следовательно, была создана еще одна функция под названием «Product_Popularity_Score». Для этого сначала был создан DataFrame для хранения всех уникальных Product_ID.

В Dataframe 'product_purchase_df' путем масштабирования (с использованием MinMaxScaler) функции «Count_Of_Products» между 0 и 1 как продукты с наибольшим количеством получит максимальную оценку популярности.

Оба фрейма данных, то есть «product_purchase_df» и «unique_products», были объединены для создания единого фрейма данных «product_scores», который имеет Product_ID и Product_Popularity_Score. Это снова было заархивировано в словарь, который имеет «Product_ID» в качестве ключа и «Product_Popularity_Score» в качестве значения.

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

Как мы видим, созданные нами функции, то есть «Category_Count» и «Product_Popularity_Score», имеют корреляцию, равную 0,32 и 0,31 соответственно, что довольно существенно по сравнению с некоторыми другими функциями.

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

Подождите, как это случилось ??

Давайте проверим Product_ID, присутствующие в тестовых данных, и нет ли каких-либо посторонних Product_ID, которые присутствуют только в тестовом наборе данных.

Всего 46 Product_ID отсутствуют в наборе данных поезда, что составляет 61 строку в тестовом наборе данных.

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

Чтобы заполнить эти нулевые значения, мы можем использовать среднее Product_Popularity_Score в соответствии с категориями, к которым принадлежат эти продукты. Допустим, «Product_ID» = P00168242 имеет «Product_Category_1» = 5 и «Product_Category_2» = 16, теперь мы собираем все записи в данных поезда с одинаковыми Product_Categories и получаем среднее значение «Product_Popularity_Score», чтобы заполнить соответствующее отсутствующее значение.

И наконец, если мы посмотрим на функцию «Остаться в_ текущем_Городе_Годы», у нее есть 4 категории. Давайте изменим название категории 4+ на 4 как в обучающем, так и в тестовом наборах данных.

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

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

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

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

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

Теперь давайте отделим данные и метки от набора данных поезда.

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

Обнаружение выбросов

Давайте сделаем коробчатую диаграмму целевой переменной, т. Е. Покупка.

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

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

Подготовка модели и прогнозы

Я использовал несколько техник регрессии, но XGBRegressor показал лучшие результаты. Первоначально это дало мне оценку RMSE 2896.

После применения гиперпараметрической оптимизации с несколькими значениями он дает оценку RMSE около 2739. Но есть и другие способы реализации этого, такие как: извлечение более интересных функций, проба других моделей машинного обучения и проба моделей глубокого обучения.

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