Анализ корзины рынка Instacart: Часть 1 (Введение и EDA)

Это непрерывная серия из 3 частей, основанная на проблеме Kaggle.

Оглавление

  1. Введение
  2. Почему это проблема машинного обучения?
  3. Как подойти к этой проблеме?
  4. Существующие решения
  5. F1- Максимизация очков
  6. Исследовательский анализ данных
  7. использованная литература

Введение

Деловая проблема

Заказ продуктов питания через Интернет - это новый способ пополнения запасов продуктов и других предметов первой необходимости. Будь то раннее утро или полночь, заказ продуктов в Интернете - это беззаботное занятие без особых хлопот. Но что происходит, когда вы забываете несколько товаров при добавлении товаров в корзину или хотите получить более качественные предложения по своим товарам? Подождете пару часов, а потом закажете? Чтобы справиться с такими ситуациями, пользователям предоставляются предложения, основанные на их прошлых заказах или пользовательских предпочтениях.

Instacart, приложение для заказа продуктов и доставки с более чем 500 миллионами товаров и 40000 магазинами, обслуживает по всей территории США и Канады. Instacart предоставляет пользовательский интерфейс, в котором вы получите рекомендации по продукту на основе ваших предыдущих заказов.

Instacart предоставил нам данные о транзакциях по заказам клиентов с течением времени, чтобы предсказать, какие ранее приобретенные продукты будут в следующем заказе пользователя. Эти данные находятся в открытом доступе и предоставляются Kaggle.

Реальные / бизнес-цели и ограничения

Цель состоит в том, чтобы предсказать, какие продукты будут в следующем порядке пользователя. Набор данных анонимизирован и содержит выборку из более чем 3 миллионов заказов на продукты от более чем 200 000 пользователей Instacart. Для каждого пользователя Instacart предоставил от 4 до 100 их заказов, а также последовательность, в которой товары были помещены в корзину.

Данные

Данные можно условно разделить на 3 части.

  • Предыдущие данные: история заказов каждого пользователя. Эти данные содержат около 3–100 прошлых заказов на пользователя.
  • Данные поезда: данные текущего заказа каждого пользователя. Эти данные содержат только 1 заказ на пользователя
  • Тестовые данные: данные о будущих заказах каждого пользователя. Эти данные не будут содержать никакой информации о продукте (мы должны это предсказать)

orders.csv - состоит из деталей заказа, размещенных любым пользователем - shape: (3421083, 7)

  • Order_id: уникальный для каждого заказа
  • User_id: уникальный для каждого пользователя
  • Eval_set: (предыдущий / поезд / тест)
  • Order_number: ый заказ, сделанный пользователем
  • Order_dow: День недели
  • Order_hour_of_day: Время суток в часах
  • Days_since_prior_order: разница в днях между 2 заказами

order_products__prior.csv - содержит всю информацию о продукте для любого предыдущего заказа, форма: (32434489, 4)

  • order_id: уникальный идентификатор для каждого заказа
  • product_id: идентификатор продукта элемента
  • add_to_cart_order: обозначает последовательность, в которой товары были добавлены в корзину.
  • повторный заказ: товар был повторно заказан? (1/0)

order_products__train.csv - содержит все сведения о продукте для заказа на поезд, форма: (1384617, 4)

  • order_id: уникальный идентификатор для каждого заказа
  • product_id: идентификатор продукта элемента
  • add_to_cart_order: обозначает последовательность, в которой товары были добавлены в корзину.
  • повторный заказ: товар был повторно заказан? (1/0)

products.csv - информация о продукте, форма: (49688, 4)

  • product_id: идентификатор продукта элемента
  • product_name: название продукта
  • aisle_id: идентификатор прохода продукта
  • Department_id: идентификатор отдела продукта

Aisles.csv - детали проходов, форма: (134,2)

  • aisle_id: идентификатор прохода элемента
  • aisle_name: название прохода

Department.csv - сведения об отделе, форма: (21,2)

  • Department_id: идентификатор продукта элемента
  • Department_name: название отдела

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

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

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

Как подойти к этой проблеме?

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

Тип проблемы машинного обучения

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

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

Функция затрат

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

Показатель эффективности

Средний балл F1 - Среднее значение всех баллов F1 для каждого заказа.

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

Существующие решения

Решение Kaggle от Paulantoine (фиксированный порог)

Здесь в Paulantoine встроено 4 типа функций:

  • Пользовательские функции
  • Характеристики продукта
  • Особенности времени
  • Пользовательские функции продукта

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

В целом,

Если P (X) ›0,5 → класс 1 (в данном случае переупорядочить), иначе класс 0. Итак, мы можем выбрать те продукты, которые принадлежат к классу 1 (т.е. P (X)› 0,5), и рекомендовать их пользователю. Но этот порог 0,5 можно изменить, чтобы улучшить производительность модели.

Paulantoine выбрал один глобальный порог, запустив GridSearchCV, то есть 0,22.

Проблема с этим подходом:

Одно и то же пороговое значение не может использоваться разными пользователями для каждого заказа.

Например, вероятность предложить 5 продуктов пользователю A высока с порогом = 0,2, поскольку он заказывал много товаров в прошлом, но это неверно для пользователя B, который заказывал очень мало товаров в прошлом. Следовательно, для пользователей должны быть разные пороговые значения в зависимости от их истории заказов.

Возможное решение: переменный порог для каждого заказа каждым пользователем.

справочный дискуссионный форум: https://www.kaggle.com/c/instacart-market-basket-analysis/discussion/35048

Решение Kaggle, занявшее 2-е место, Кадзуки Онодера (переменный порог)

Оценка: 0,4082 на частной LB

Ссылка на Github: Репо

Онодера build 4 категории функций:

  • Пользовательские функции
  • Характеристики продукта
  • Особенности времени
  • Пользовательские функции продукта

Ссылка на изображение: https://medium.com/kaggle-blog/instacart-market-basket-analysis-feda2700cded

Для решения этой проблемы с помощью XGBoost было построено 23 модели с более чем 70 функциями. 17 моделей использовались для прогнозирования «Нет» (вероятность того, что повторно заказанный продукт будет в следующем заказе пользователя), а 6 моделей были использованы для прогнозирования вероятности повторного заказа (вероятность того, что продукт будет повторно заказан пользователем в следующий заказ). Средневзвешенное значение всех этих вероятностей было использовано для выработки рекомендации, которая должна иметь высокий балл F1.

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

Максимизация очков F1

Решить, какой будет порог вероятности для каждого пользователя (вместо, если P (X) ›0,5 → класс 1)

Предполагая, что мы можем выбрать продукт A или продукт B для заказа 1.

Пусть вероятность повторного заказа продукта P (A) = 0,9 и P (B) = 0,3,

Тогда P (выбирая только A из A и B) = 0,9 (1–0,3),

P (выбор только B из A и B) = (1–0.9) 0,3,

P (выбираем как A, так и B) = 0,9 * 0,3.

Теперь ожидание F1 (A), E (F1 (A)) =

ожидание (оценка F1 из A | базовая истина - A) * P (базовая истина - A) + ожидание (оценка F1 из A | базовая истина - B) * P (базовая истина - B) + ожидание (оценка F1 из A | основание истина - AB) * P (основная истина - AB)

E(F1(A)) = 1.0 * 0.9(1–0.3) + 0.0 * 0.3 * (1–0.9) + (2/3) * 0.9 * 0.3 = 0.81

Аналогично, E (F1 (A B)) = (2/3) * 0,9 (1–0,3) + (2/3) * 0,3 * (1–0,9) + 1,0 * 0,9 * 0,3 = 0,71

Мы видим, что оценка F1 при выборе только продукта A больше, чем оценка F1 при выборе продукта A и B вместе.

поэтому, если порог вероятности ›= 0,9, будет выбран только продукт A, так как F1 (A)› F1 (A B)

Но получить E (F1) для каждой комбинации в каждом заказе (в тестовом наборе 75000 заказов) - утомительная работа.. Мы будем использовать ниже исследовательскую работу, в которой вычисляется оценка F1 для всех возможных комбинаций за время O (n2) с использованием динамического программирования.

Исследовательская статья: Оптимизация F-мер: рассказ о двух подходах

Чтобы получить набор элементов I Є {I1, I2, I3…, In}, который максимизирует оценку F1 для любого порядка, мы можем использовать алгоритм MLE, который был сокращен до уравнения динамического программирования, описанного в этой статье.

Автор решает эту задачу оптимизации с помощью динамического программирования за время O (n2), пространство O (n).

В этом примере мы будем использовать реализацию, предоставленную Faron, называемую ядро.

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

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

Отсутствующие значения

В наборе данных нет пропущенных значений, кроме файла orders.csv.

Как мы видим, в столбце days_since_prior_order не хватает только 6% значений.

Также есть 6% уникальных пользователей (206209) по сравнению с общими данными в orders.csv

Видно, что для 1-го заказа каждого пользователя (order_number = 1) days_since_prior_order равно Nan, что имеет смысл. Здесь мы можем поставить 0.

Объединить данные

Мы объединим все order_products__prior.csv, order_products__train.csv, products.csv, orders.csv (только поезд и предыдущий набор), aisle.csv и sizes.csv для выполнения EDA на .

Одномерный анализ

В: Каково распределение целевой переменной?

  • Распределение одинаково как в Prior, так и в Train Set.
  • Примерно в 60% случаев товар был повторно заказан

В: Сколько у вас пользователей?

  • Каждый пользователь в тестовом наборе имеет предыдущие заказы в order_products_prior.csv, аналогично для каждого пользователя в Train есть история заказов в order_products_prior.csv.
  • Итак, мы можем сделать вывод, что данные поезда-теста разделены по пользователям.

В: Сколько заказов разместил каждый пользователь?

  • На каждого пользователя у нас есть около 4–100 деталей заказа (включая обучение и тестирование).
  • Гистограмма слева показывает, что очень мало пользователей разместили заказы более чем на 60, а максимальный заказ для любого пользователя составляет 100.

В: Сколько заказов без повторного заказа?

  • 12% заказов не имеют переупорядоченных товаров, в то время как остальные ~ 88% заказов содержат переупорядоченные товары

В: Какие товары заказываются / повторно заказываются чаще всего?

  • Всего было заказано 49685 товаров.
  • Видно, что большинство заказываемых продуктов - это органические продукты / свежие фрукты (особенно бананы).
  • У бананов самая высокая ставка заказа - 0,14.
  • Топ-5 часто заказываемых продуктов по своей природе являются органическими (это может быть важной особенностью)

В: Как часто товары заказываются и повторно заказываются из каждого прохода?

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

В: Как часто товары заказываются и повторно заказываются в каждом отделе?

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

В: Каков размер корзины для разных заказов?

  • У нас есть правильное неравномерное распределение максимального размера корзины для каждого заказа.
  • Всего 237225 заказов с размером корзины = 5 и mode = 5.
  • Очень мало заказов с размером тележки ›40 и вплоть до 145.

В: Сколько товаров было заказано и повторно заказано в определенный день недели?

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

В: Сколько товаров было заказано и повторно заказано в определенный час дня?

  • Большинство заказов размещается с раннего утра до полуночи, и очень мало заказов размещается с полуночи до раннего утра.

В: Через сколько дней пользователь заказал / повторно заказал продукт?

  • Большинство людей пополняют запасы через неделю или месяц. Кажется, некоторые люди предпочитают покупать товары на неделю / месяц сразу.
  • Люди, которые покупают в нулевой день, вероятно, являются новыми клиентами, но мы видим небольшую частоту повторного заказа, что означает, что пользователи, как правило, размещают несколько заказов и в нулевой день.
  • Вероятно, здесь 30 дней представляют верхний предел, и не обязательно какой-то конкретный месяц.
  • С 1 по 6 день наблюдается постоянный всплеск заказов, что показывает, что некоторые люди являются частыми покупателями с коротким периодом пополнения запасов.

В: Какие продукты часто предлагают покупатели еженедельно и покупатели ежемесячно?

  • Еженедельные / ежемесячные покупатели, как правило, покупают похожие товары.
  • У этих продуктов, как правило, самый высокий процент повторного заказа независимо от дня покупки.

Двумерный анализ

В: Как день недели и час дня влияют на заказ / повторный заказ продукта?

  • первый график описывает скорость повторного заказа каждый день по отношению к заказам, размещенным в этот час
  • второй график описывает скорость повторного заказа каждый день по отношению к заказам, размещенным в этот день.
  • из первого графика мы можем видеть, что из всех заказов, которые были размещены в любой час, большинство повторных заказов было размещено в первый день (вероятно, понедельник) с 5:00 до 9:00.
  • Такую же картину можно увидеть в любой день с 5 до 9 утра.
  • из второго графика мы можем видеть, что из всех заказов, которые были размещены в любой день, большинство повторных заказов было размещено с 8:00 до 16:00 в любой данный день.

Другая информация

В: Какие продукты никогда не заказывались / не переупорядочивались?

Эти 3 продукта (протеиновая гранола с яблоками, неочищенные половинки абрикоса в густом сиропе, односекционный виски из бурбона Kentucky Straight), которые никогда не заказывались. Может быть заказывались их альтернативы.

  • Из всех 49685 товаров 4082 товара никогда не переупаковывались.
  • Продукты, которые никогда не переупаковывались, включают очень специфические предметы, такие как «0,5» водонепроницаемая лента, «Водка 007 с бокалами для мартини», премиум лагер «Swingtop» », мы можем предположить, что либо потребителю они не понравились, либо он сменил свой предпочтения. Глядя на предметы домашнего обихода, такие как «Сумки для заморозки на молнии, размер кварты», «бросается! Laundry Detergent Pac’s, Original », мы не можем однозначно сказать, что предпочтения изменились, так как это тип продуктов, который долго хранится, и потребитель может рассмотреть возможность повторного заказа их в будущем.

В: Максимальный размер корзины через N дней с момента предыдущего заказа?

  • Как и ожидалось, максимальный размер корзины будет у пользователей с 30-дневным перерывом между последовательными заказами. т.е. они склонны заказывать больше товаров
  • То же наблюдение можно увидеть с перерывом в 29 дней, 11 дней и 5 дней.
  • Пользователи, размещающие заказ в день 0, имеют максимальный размер корзины около 100, включая как первые заказы, так и несколько заказов.
  • Кроме того, средний размер корзины для заказов в любой день составляет около 8.

В: Насколько позиция товара в корзине влияет на частоту повторных заказов?

  • Мы видим нормальное снижение вероятности повторного заказа при увеличении позиции товара до 71.
  • Но вероятность быстро меняется после увеличения позиции с 71.
  • Наименьшая вероятность повторного заказа составляет около 0,2 при позиции 109.
  • Позиция от 128 до 137 показывает постоянную 50% вероятность повторного заказа.
  • Можно предположить, что для товара с позицией больше 100 вероятность повторного заказа очень мала (ниже 0,3).
  • Поскольку вероятность повторного заказа продукта будет зависеть от его положения в тележке и самого продукта, неопределенное поведение можно предположить как результат перетасовки позиции продукта с высокой вероятностью повторного заказа.

В: Есть ли пользователи, чей заказ содержит только повторно заказанные продукты?

  • User_id 99753 имеет 99 заказов, которые содержат только переупорядоченные элементы
  • Далее следуют пользователи 26489 и 100935

Теперь, когда мы завершили наш EDA, мы можем перейти к следующему этапу.

Следующий,

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