Хакатон «Черная пятница» был организован Analytics Vidhya еще в середине 2016 года. На прошлой неделе я попробовал это сделать, и здесь я опишу, как я исследовал, моделировал и учился на основе данных.

Проблема

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

Данные

Набор данных, который можно скачать здесь, уже был четко разделен на обучающий и тестовый наборы. Наборы обучающих и тестовых данных содержали 550 068 и 233 599 наблюдений соответственно. 11 признаков украшали оба набора данных, а по 2 признака не имели значения.

Визуализация данных

  1. Пол. Подавляющее большинство данных содержало клиентов-мужчин.

2. Возрастная группа. Что касается возрастных групп, то доминировала группа 26–35 лет, за которой с меньшим отрывом следуют группы 36–45 и 18–25 лет.

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

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

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

Очистка данных

  1. Product_ID. Как правило, в таких наборах данных идентификаторы, хотя и бессмысленные сами по себе, оказывают большое влияние на модель и окончательные оценки. Поэтому вместо того, чтобы выбросить «product_id» из-за того, что он содержит символ «p», я решил заменить p нулевой строкой и преобразовать функцию в числовую сущность. Другой способ, который работал так же хорошо, — это LabelEncoding.
  2. Gender и City_Category. Эти категориальные признаки были закодированы сразу с помощью pd.get_dummies() и добавлены обратно в наборы данных.
  3. Product_Category_2 и Product_Category_3 — это две функции со значительным количеством пропущенных значений. Я попытался выбросить их из-за огромного количества отсутствующих значений, но заполнение их чем-то абсурдным, например «9999», сработало на моей окончательной модели так же хорошо.
  4. Stay_in_current_city_years — вместо того, чтобы сразу кодировать эту категориальную характеристику, я чувствовал, что для того, чтобы модель заметила разницу в шаблонах покупок (независимо от того, существуют ли они в этом конкретном наборе данных или нет) отдельных лиц. кто остался в городе дольше, может быть более подходящим нанести его на карту нижеприведенным способом.
  5. Возраст. Как и в случае с функцией Stay_in_current_city_years, однократное кодирование возраста не позволило бы модели правильно оценить модели покупок разных возрастных групп. См. ниже для сопоставления

Модель

Как это обычно бывает с хакатонами, ничто из того, что я пробовал, не смогло превзойти старый добрый XGBoost. С небольшой настройкой и без разработки функций я смог набрать около 2500 баллов (RMSE) в таблице лидеров.

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

Что не сработало и что дальше?

  1. Разработка функций. Что касается разработки функций, я попробовал несколько вещей. Один заключался в том, чтобы сгруппировать набор данных по «User_ID», а затем подсчитать количество отдельных пользователей. Я сделал то же самое с «Product_ID», надеясь, что количество различных продуктов может помочь улучшить модель, но оба они отбрасывали результаты, которые были непригодны для использования и сильно отставали от темпа.
  2. Импутация с помощью моделирования. Как упоминалось ранее, в нескольких столбцах отсутствовали значения. Вменение этих значений в классификационную модель оказалось пустой тратой времени, практически без улучшения оценки.
  3. Таблица лидеров. Есть еще несколько способов добраться до вершины таблицы лидеров. Мы надеемся, что творческий подход к разработке различных функций, а также объединение нескольких моделей для повышения производительности помогут модели приблизиться к вершине горы.

Мой код можно найти здесь.

Что бы вы здесь сделали по-другому? И, что более важно, какие функции вы бы разработали?