Рекомендация по категории продавца Elo - пример использования машинного обучения

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

Обзор тематического исследования:

Подход тематического исследования разделен на следующие этапы:

  • Бизнес-проблема
  • Постановка задачи машинного обучения
  • Исследовательский анализ данных
  • Функциональная инженерия
  • Корреляция признаков и выбор признаков
  • Модели регрессии
  • Заключение и результаты

Бизнес-проблема

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

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

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

Постановка задачи машинного обучения

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

Обзор данных

Все данные смоделированы и вымышлены и не являются реальными данными клиентов по очевидным причинам. Предоставленные данные содержат данные транзакции до 3 месяцев для каждого идентификатора карты. Он также содержит данные о продавцах, участвующих в этих транзакциях. Существует дополнительный файл, содержащий все данные о покупках / транзакциях еще за 2 месяца, которые не включены в исходные данные транзакции за 3 месяца. Ниже приводится подробное описание каждого из этих файлов:

  1. Data_Dictionary.xlsx → Этот файл содержит описание поля данных для каждого файла CSV.
  2. train.csv и test.csv → Эти файлы содержат идентификаторы карт (card_id) и информацию о картах. Они также содержат целевую переменную (оценку лояльности), которую необходимо спрогнозировать. Ниже приведены описания каждой из колонок:
card_id → Unique card identifier
first_active_month → month of first purchase in 'YYYY-MM' format
feature_1 → Anonymized card categorical feature
feature_2→ Anonymized card categorical feature
feature_3 → Anonymized card categorical feature
target → Loyalty numerical score calculated 2 months after historical and evaluation period

3. history_transactions.csv и new_merchant_transactions.csv → Эти файлы содержат данные о транзакциях. Они содержат информацию о транзакциях по каждой карте. Ниже приведены описания каждой из колонок:

card_id → Card identifier
month_lag → month lag to reference date
purchase_date → Purchase date
authorized_flag → 'Y' if approved, 'N' if denied
category_3 → anonymized category
installments → number of installments of purchase
category_1 → anonymized category
merchant_category_id → Merchant category identifier(anonymized)
subsector_id → Merchant category group identifier(anonymized)
merchant_id → Merchant identifier(anonymized)
purchase_amount → Normalized purchase amount
city_id → City identifier(anonymized)
state_id → State identifier (anonymized)
category_2 → anonymized category

4. merchants.csv → Этот файл содержит дополнительную информацию о продавцах, участвующих в транзакциях. Ниже приведены описания каждой из колонок:

merchant_id → Unique merchant identifier
merchant_group_id → Merchant group(anonymized)
merchant_category_id → Unique identifier for merchant category (anonymized)
subsector_id → Merchant category group (anonymized)
numerical_1 → anonymized measure
numerical_2 → anonymized measure
category_1 → anonymized category
category_2 → anonymized category
category_4 → anonymized category
city_id → City identifier(anonymized)
most_recent_sales_range → Range of revenue (monetary units) in last active month (A > B > C > D > E)
most_recent_sales_range → Range of revenue (monetary units) in last active month (A > B > C > D > E)
most_recent_purchases_range → Range of quantity of transactions in last active month (A > B > C > D > E)
avg_sales_lag3 → Monthly average of revenue in last 3 months divided by revenue in last active month
avg_purchases_lag3 → Monthly average of transactions in last 3 months divided by transactions in last active month
active_months_lag3 → Quantity of active months within last 3 months
avg_sales_lag6 → Monthly average of revenue in last 6 months divided by revenue in last active month
avg_purchases_lag6 → Monthly average of transactions in last 6 months divided by transactions in last active month
active_months_lag6 → Quantity of active months within last 6 months
avg_sales_lag12 → Monthly average of revenue in last 12 months divided by revenue in last active month
avg_purchases_lag12 → Monthly average of transactions in last 12 months divided by transactions in last active month
active_months_lag12 → Quantity of active months within last 12 months

Все файлы данных можно скачать по этой ссылке Kaggle.

Показатель производительности

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

Здесь ŷ - прогнозируемая оценка лояльности, а y - фактическая оценка лояльности для каждого идентификатора карты.

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

Обучайте и тестируйте файлы

  1. Распределение целевой переменной:

Большинство оценок лояльности находятся в диапазоне от -1 до 1. Кроме того, они сосредоточены вокруг нуля. Так что есть вероятность, что они уже стандартизированы.

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

2. Категориальные особенности

Давайте проверим эти категориальные особенности на предмет наших редких данных ..

Нет большой разницы между категориальными признаками 1,2 и 3 для редких и нередких точек данных. Извлечение характеристик из исторических транзакций и торговых транзакций может помочь лучше предсказать эти редкие баллы лояльности <-30.

3. Первый месяц активности

Поскольку это указано в формате «ГГГГ-ММ». Давайте превратим это в простую меру, например разницу в месяце с сегодняшней датой. Это довольно просто реализовать с помощью datetime в пандах.

Теперь мы можем сопоставить это значение с оценкой лояльности (целевой).

  • Здесь мы можем наблюдать тенденцию к тому, что самые последние пользователи имеют более высокие баллы лояльности, а также большую дисперсию оценок лояльности.
  • Однако это также показывает, что количество недавних пользователей больше, чем тех, кто давно пользуется услугами.
  • Еще одно важное наблюдение - это количество пользователей, имеющих показатель лояльности ‹= - 30 (которые могут быть выбросами), которые находятся в самом низу графика для каждого из диапазонов интервалов / значений разницы в активном месяце с сегодняшнего дня. Это показывает, что эта функция может быть недостаточно полезной для отделения наших редких данных от фактических данных.
  • Эта функция определенно поможет в прогнозировании оценок лояльности.

Исторические транзакции

  1. Авторизованный флаг

Как и должно быть, большинство транзакций авторизовано.

2. Рассрочка

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

3. Сумма покупки

Кажется, что они тоже уже стандартизированы.

Новые торговые операции

Было замечено, что этот файл не содержал никаких несанкционированных транзакций.

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

График сумм покупок и платежей в зависимости от рейтинга лояльности

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

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

Данные о продавцах

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

  1. Анонимные категории

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

2. Задержка в месяцах активности

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

3. Средняя задержка покупок

  • Для наших редких данных (баллы лояльности ‹= - 30) лаг для диапазона покупок составляет менее 2000.
  • Это также может быть очень полезной функцией для прогнозирования оценок лояльности.

Резюме EDA:

  1. Целевая переменная (оценка лояльности) имеет 1% баллов, которые кажутся выбросами. Работа с этими точками зависит от количества этих точек в тестовых данных. В таком случае это не выбросы. Их можно назвать редкими точками данных. Однако оценку лояльности по этим точкам трудно предсказать, и они могут существенно повлиять на наши окончательные оценки.
  2. Первый активный месяц в файле поезда может быть очень полезным.
  3. Агрегированные функции транзакций для каждой карты были бы очень полезны при прогнозировании оценки лояльности с использованием регрессионных моделей. Большинство наших функций будет из файлов транзакций.
  4. Некоторые функции также можно использовать из файла продавцов. Например, у нас может быть категориальная переменная, которая указывает, участвовал ли в транзакции продавец, который был активен в течение последних 3/6 или 12 месяцев. Также могут быть полезны средние объемы покупок и продаж.

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

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

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

Как отмечалось ранее, значения взносов, такие как -1 и 999, были заменены на nan (нулевое значение) и соответственно вменены.

historical_transactions['purchase_amount'] = historical_transactions['purchase_amount'].apply(lambda x: min(x, 0.8))
historical_transactions['installments'].replace([-1, 999], np.nan, inplace=True)
historical_transactions['installments'].fillna(historical_transactions['installments'].mode()[0], inplace=True)

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

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

Следовательно, мне пришлось вернуться в Feature Engineering, чтобы извлекать функции из обоих этих файлов по отдельности. Наряду с этим, на второй итерации были также созданы дополнительные функции. Это улучшило оценку RMSE на ~ 0,35.

Особенности обработки даты

Purchase_date и first_active_month были очень полезны для создания дополнительных функций, таких как квартал года и разница в месяцах с сегодняшним днем. Это легко сделать с помощью datetime в Pandas.

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

Обработка категориальных функций

Для категориальных признаков использовались два подхода:

  1. Одно горячее кодирование
  2. Среднее кодирование

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

Характеристики транзакций были агрегированы с помощью «card_id» с использованием среднего, максимального, минимального, var, skew и n_unique / count на основе переменных, которые в конечном итоге были объединены с обучающими и тестовыми файлами.

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

В итоге всего было сгенерировано 226 функций.

Корреляция характеристик и выбор функций:

Поскольку мы сгенерировали около 200 функций, корреляционная матрица выглядит примерно так ...

Ура !! Это не выглядит хорошо.

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

Был установлен порог 0,85, и один из признаков из пар признаков, имеющих коллинеарность выше порога, был удален. Такой подход снизил количество функций с 226 до 134.

Модели регрессии

Базовые модели регрессии

Начальные модели были настроены с помощью RandomizedSearchCV и GridSearchCV и обучены на данных поезда, полученных после разделения тестового поезда.

Линейная регрессия:

Регрессор SGD:

Регрессор случайного леса:

Регрессор ЛГБМ:

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

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

Сложенная модель регрессии Байесовского хребта с LGBM Goss

Прогнозы были сделаны с использованием ЛГБМ-моделей Госса, обученных на StratifiedKfold и RepeatedKFold на данных поезда. Здесь не было необходимости в разбивке на тестовые поезда, поскольку мы делали прогнозы на основе данных поезда. Следовательно, можно было использовать все данные поезда для обучения модели.

Эти два прогноза были сложены и представлены в качестве входных данных для модели регрессии Байесовского хребта (метамодель).

Подход к модели с низкой и высокой вероятностью

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

  1. Модель двоичной классификации. Эта модель классификации определяет редкие точки данных. Это была модель классификатора ЛГБМ. Порог (гиперпараметр) использовался для классификации карты / пользователя как точки с редкими данными (выброса) на основе вероятностей классов, полученных из модели.
  2. Регрессия (полная). Это была простая модель регрессии, обученная на всем наборе данных. Это была модель регрессии байесовского гребня с накоплением, которая была обучена на полных данных.
  3. Регрессия (модель с низкой вероятностью): модель регрессии обучена низкой концентрации (гиперпараметр) редких точек данных (выбросов). Это также была модель регрессора LGBM, обученная всем функциям.
  4. Регрессия (модель с высокой вероятностью). Модель регрессии, обученная с высокой концентрацией (гиперпараметром) выбросов. У нас очень мало редких данных, поэтому модель может легко переобучиться. Следовательно, это была простая модель регрессии (регрессия Байесовского хребта). Прогнозы модели полной регрессии, двоичной классификации использовались вместе с 10 наиболее важными функциями регрессии, основанными на значениях функций, полученных из модели полной регрессии для обучения.
  5. Полная (смешанная) модель. Прогнозы, полученные на основе модели с высокой вероятностью, модели с низкой вероятностью и модели полной регрессии, были объединены для получения окончательного прогноза оценки лояльности. Последней метамоделью здесь также была модель регрессии Байесовского хребта.

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

Характеристики всех вышеперечисленных подходов приведены в таблицах ниже:

Базовые модели регрессии:

Результаты составных и ЛГБМ-моделей Goss:

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

Представление Kaggle

Вот мой лучший пост с оценкой Kaggle.

Резюме

  1. В этой проблеме первостепенное значение имеет разработка функций. Чем лучше функции, созданные на основе данных о транзакциях и продавцах, тем лучше оценки RMSE.
  2. Обработка выбросов / редких данных - это суть этого тематического исследования. Эти моменты сильно влияют на окончательный результат RMSE.
  3. После опробования различных регрессионных моделей и стековых архитектур, LGBM-модели Госса были объединены на основе регрессии Байесовского хребта, поскольку метамодель дала наилучшие результаты.

Будущие работы / Улучшения

  1. Создание большего количества функций с использованием целевой кодировки может помочь улучшить оценку.
  2. Подход модели с высокой и низкой вероятностью можно дополнительно оптимизировать, добавив больше функций и экспериментируя с моделями с высокой и низкой вероятностью. Это было успешно реализовано Евгением Патехой в его 5-м решении, как объяснено здесь.
  3. Большинство категориальных и числовых характеристик анонимны. Следовательно, у нас нет четкого представления о том, что это за функции. Это затрудняет создание новых функций на основе опыта в предметной области. Однако это ограничение / ограничение существует, чтобы избежать раскрытия данных пользователя / компании.

Заключение

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

Надеюсь, вам понравилось это читать так же, как мне понравилось работать над тематическим исследованием. Спасибо за чтение!!

Полный код кейса можно найти здесь.

LinkedIn: www.linkedin.com/in/rjt5412

Github: https://github.com/Rjt5412

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

  1. Https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-elo
  2. Https://www.kaggle.com/artgor/elo-eda-and-models
  3. Более пристальный взгляд на переменные даты, Робин Денз
  4. Https://www.kaggle.com/fabiendaniel/elo-world/notebook
  5. Https://www.kaggle.com/fabiendaniel/hyperparameter-tuning
  6. Https://www.kaggle.com/mfjwr1/simple-lightgbm-without-blending
  7. Https://www.kaggle.com/roydatascience/elo-stack-with-goss-boosting
  8. Https://www.kaggle.com/c/elo-merchant-category-recommendation/discussion/82314