Автор: Гурав Ратор

Введение

Elo — один из крупнейших внутренних брендов дебетовых и кредитных карт в Бразилии. В феврале 2019 года на Kaggle был организован конкурс Рекомендации по категориям для продавцов Elo. Elo хотела предоставлять скидки и предложения держателям карт, для чего она сотрудничала с продавцами. Но Elo не хотел, чтобы эти скидки и предложения были случайными, а были специально персонализированы для каждого держателя карты в зависимости от его предпочтений, текущего местоположения и других потребностей. Elo уже создала модели машинного обучения, которые могут понимать предпочтения и другие аспекты жизненного цикла держателя карты от еды до покупок, но у них было одно серьезное ограничение. Модели были разработаны не специально для отдельных держателей карт, а для группы.

Понимание проблемы

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

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

Формулировка задачи машинного обучения

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

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

Эло установил среднеквадратичную ошибку (RMSE) в качестве показателя производительности модели. RMSE определяется уравнением:

, где n – количество идентификаторов карт, yi – фактический показатель лояльности идентификатора карты >i и ŷi – прогнозируемый показатель лояльности для card_id i.

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

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

Для этого конкурса ELO предоставила следующие наборы данных:

  1. Словарь данных
  2. Тренироваться
  3. Тест
  4. Исторические транзакции
  5. Новые транзакции продавца
  6. Торговец

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

Словарь данных содержит краткие описания столбцов в поезде, исторических транзакциях, новых транзакциях продавцов и CSV-файлах продавцов.

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

Поезд и тестовый набор являются наиболее фундаментальными наборами данных. Они содержат основную информацию о самих кредитных картах. Наборы данных Train и Test имеют одинаковые столбцы, за исключением столбца «target», то есть показателя лояльности, который предоставляется только в наборе train. Наборы обучающих и тестовых данных содержат «card_id», который является уникальным идентификатором карты для каждого держателя карты, «first_active_month», который представляет собой месяц и год, когда карта была активирована или была совершена первая транзакция, "feature_1", "feature_2" и "feature_3", которые являются анонимными категориальными функциями.

Набор поездов содержит 201 917 точек данных, то есть детали уникальных идентификаторов карт, тогда как тестовый набор содержит 123 623 детали уникальных идентификаторов карт.

В наборе поездов нет нулевых значений, но в одном наблюдении в тестовом наборе отсутствует значение «first_active_month».

Цель

Столбец «target» в наборе поездов имеет максимальное значение 17,9687 и минимальное значение -33,2187. Распределение в столбце target показывает нормальное распределение со средним значением около 0 и наличием выбросов около -30. Количество этих выбросов составляет 2207, что составляет около 1% от общего числа наблюдений поездов.

Функция 1, функция 2 и функция 3

Столбец «feature_1» содержит 5 уникальных категорий, тогда как «feature_2» — 3, а «feature_3» — 2 уникальные категории. Распределение функций как в обучающем, так и в тестовом наборе одинаково, что означает, что не было разделения поезда и тестового набора по времени, и функции не привязаны ко времени.

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

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

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

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

Исторические и новые наборы данных транзакций

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

И исторические транзакции, и новые транзакции продавца имеют схожие столбцы: «card_id» — это идентификаторы карт держателей карт, «purchase_date» — дата и время совершения транзакции, «month_lag – это разница в месяце между датой покупки последней исторической транзакции держателя карты и датой покупки этой конкретной транзакции, 'authorized_flag' показывает, была ли транзакция одобрена или отклонена, 'purchase_amountt' – нормализованная сумма транзакции, 'partments' – количество платежей, которыми была выплачена сумма покупки, 'category_1', 'category_2» и «category_3» — это анонимные категории, «merchant_id» — идентификатор каждого продавца, «merchant_category_id» — идентификатор категории продавца, 'subsector_id' – идентификатор группы категорий продавца, 'city_id' – идентификатор города продавца и 'state_id ' — идентификатор состояния мерчанта.

Исторические транзакции содержат сведения о 29 112 361 исторической транзакции держателей карт, тогда как новые торговые транзакции содержат сведения о 1 963 031 новой транзакции держателей карт.

Как в прошлом, так и в новых транзакциях в столбцах category_2, category_3 и merchant_id указаны нулевые значения. В столбцах «category_2» исторических и новых транзакций содержится около 5–10 процентов пустых значений, в то время как в столбцах «category_3» и «merchant_id» относительно меньший процент нулевых значений. Эти нулевые значения должны быть вменены вместо того, чтобы отбрасывать наблюдения, чтобы предотвратить потерю информации.

Пометить как авторизованный

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

Распределения target относительно author_flag одинаковы для авторизованных и отклоненных прошлых и новых транзакций.

В рассрочку

Большинство исторических транзакций и новых транзакций имеют значения взноса 0 и 1. Существуют также некоторые необычные значения взноса -1 и 999.

Количество исторических транзакций и новых транзакций со значением взноса -1 составляет 178 159 и 55 922 соответственно, и большинство из этих транзакций авторизованы, что означает, что эти транзакции могут обозначать какие-то авансовые платежи или что-то еще. Количество исторических транзакций и новых транзакций с размером взноса 999 очень мало, то есть 188 и 2 соответственно, но большинство транзакций отклонено, поэтому эти транзакции могут быть мошенничеством.

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

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

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

Сумма покупки как для исторических, так и для новых транзакций имеет отрицательное значение примерно для 95% транзакций. В то время как 99% суммы покупки имеют значение менее 1,5, похоже, что в сумме покупки как прошлых, так и новых транзакций есть некоторые экстремальные выбросы. Функция, созданная с помощью этих экстремальных значений, отрицательно повлияет на производительность модели. Эти необычные суммы покупок составляют всего 0,1% от общего числа наблюдений, поэтому их можно отбросить.

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

Дата покупки

Год покупки большинства исторических транзакций — 2017, а год покупки большинства новых транзакций — 2018. Это может быть связано с тем, что исторические транзакции имели место до контрольной даты card_id, а новые транзакции имели место после контрольной даты. идентификаторов карт.

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

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

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

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

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

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

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

Как исторические, так и новые транзакции имеют одинаковое распределение для часа покупки. Транзакционная активность возрастает примерно в 7–8 часов утра и начинает снижаться примерно в 16–17 часов с внезапным ростом в 12 часов ночи. Увеличение количества транзакций в 12 часов ночи может быть связано с подпиской или услугой автоматического продления.

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

Задержка на месяц

Исторические транзакции имеют месячную задержку от -13 до 0, а новые транзакции имеют месячную задержку от 1 до 2. Здесь месячная задержка — это разница в месяце между датой покупки и контрольной датой card_id, которая выполнила транзакцию. Поскольку исторические транзакции были совершены до отчетной даты, они имеют отрицательную стоимость, а новые транзакции были совершены после контрольной даты, поэтому они имеют положительную стоимость. Высокое значение месячной задержки указывает на самую последнюю транзакционную активность держателя карты, следовательно, лучше отражает предпочтения и предпочтения держателя карты.

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

Категория 1, Категория 2 и Категория 3

Категория 1 имеет 2 уникальные категории: «Y» и «N», категория 2 имеет 5 уникальных категорий: «1», «2», «3», «4» и «5», а категория 3 имеет 3 уникальные категории: «А», «В» и «С». Распределение категории 1, категории 2 и категории 3 как для исторической, так и для новой транзакции аналогично. Категория «N» и категория «1» доминируют над категорией 1 и 2 соответственно.

Существуют некоторые различия в распределении целей по категории 1, категории 2 и категории 3 для исторических и новых операций.

Распределение целей по категории 1, категории 2 и категории 3 на основе авторизованного флага показывает различия для исторических транзакций.

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

Идентификатор продавца, идентификатор категории продавца и идентификатор подсектора

Исторические транзакции содержат 326 311 уникальных идентификаторов продавцов, 327 уникальных идентификаторов категорий продавцов и 41 уникальный идентификатор подсектора. Точно так же новые транзакции содержат 226 129 уникальных идентификаторов продавцов, 314 уникальных идентификаторов категорий продавцов и 41 уникальный идентификатор подсектора. И исторические, и новые транзакции имеют одинаковое разнообразие идентификаторов продавцов, идентификаторов категорий продавцов и идентификаторов подсекторов. Идентификаторы продавцов, идентификаторы категорий продавцов и идентификаторы подсекторов помогут модели узнать о симпатиях и предпочтениях держателей карт.

Идентификатор города и штата

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

Набор данных продавца

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

Наблюдения

  1. Функции, представленные в обучающем и тестовом наборах, не очень помогут с моделью.
  2. Целевая переменная имеет несколько экстремальных выбросов, с которыми необходимо справиться, чтобы предотвратить снижение производительности модели.
  3. Мы должны спроектировать функции из исторических и новых транзакций для нашей модели.
  4. Исторические и новые транзакции имеют пропущенные значения в столбцах категории 2, категории 3 и идентификатора продавца, которые необходимо заменить.
  5. Как исторические, так и новые транзакции имеют одинаковое распределение для большинства столбцов, за исключением столбцов даты покупки, месячной задержки и разрешенных флагов.
  6. Столбцы «Сумма покупки», «Рассрочка» и «Разрешенные флаги» наиболее полезны для инженерных функций модели.
  7. Набор данных продавцов бесполезен для модели, поскольку он содержит сведения о продавцах, а не о держателях карт.

Обработка данных

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

Тренировочный и тестовый набор

В наборе поездов нет нулевых значений, но в одном наблюдении в тестовом наборе отсутствует значение «first_active_month».

Мы находим все тестовые наблюдения с такими же значениями 'feature_1', 'feature_2' и 'feature_3', что и отсутствующий 'first_active_month' и присвойте ему режим 'first_active_month' похожих наблюдений.

Исторические и новые наборы данных транзакций

Во-первых, мы Label кодируем столбцы «authorized_flag», «category_1» и «category_3» исторических транзакций и новых транзакций. Как в прошлом, так и в новых транзакциях в столбцах category_2, category_3 и merchant_id указаны нулевые значения.

Для нулевых значений в 'merchant_ids' мы находим 'merchant_ids' у продавцов, имеющих похожие 'merchant_category_id', 'subsector_id' и 'city_id' как нулевые наблюдения и присваивать нулевые наблюдения с режимом аналогичных 'merchant_id'. Мы не рассматриваем ‘state_id’, так как любые два похожих ‘city_id’ будут иметь одинаковый ‘state_id’.

После вменения «merchant_id» из набора данных продавцов у нас все еще есть нулевые значения в «merchant_ids», поэтому для оставшихся нулевых значений мы просто вменяем «NAN».

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

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

Наконец, мы едины в горячем кодировании категориальных столбцов в исторических транзакциях и новых транзакциях.

Разработка функций

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

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

Обучение и тестирование набора

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

Мы также добавляем столбец идентификации выбросов в набор поездов. Столбцы outlier будут равны 1 для идентификаторов карт с целевым значением выбросов и 0 для оставшихся идентификаторов карт. Этот столбец «выброс» будет использоваться для стратифицированного разделения набора поездов во время обучения модели.

Набор исторических и новых транзакций

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

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

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

  1. Функция authorized_flag будет указывать общее количество авторизованных транзакций и процент авторизованных транзакций, выполненных по каждому идентификатору карты.
  2. Функции 'category_1', 'category_2' и 'category_3' будут указывать общее количество и процент транзакций для этого конкретного значения категории, выполненных каждым идентификатором карты. .
  3. 'merchant_id', 'merchant_category_id', 'subsector_id', 'city_id' и 'state_id' функции будут указывать количество уникальных продавцов, категории продавцов, подсекторов, городов и штатов, в которых была совершена транзакция с идентификатором каждой карты.
  4. Функция month_lag будет указывать минимальную и максимальную задержку транзакции с контрольной даты и давность транзакции для каждого идентификатора карты.
  5. Функция purchase_date будет указывать самую старую и самую новую дату транзакций, выполненных по каждому идентификатору карты.
  6. 'год', 'месяц', 'день недели', 'дата', 'час' функции будут указывать количество уникальных, среднее, максимальное и минимальное количество лет, месяцев, дней недели, дат и часов, в течение которых каждый идентификатор карты выполнял транзакции.
  7. Функция «выходные» будет отображать общее количество и процент транзакций, совершенных по каждому идентификатору карты в выходные дни.
  8. Функция purchase_amount будет указывать общую, среднюю, максимальную, минимальную сумму и отклонение суммы, потраченной каждым идентификатором карты.
  9. Функция «платежи» будет указывать количество уникальных, общее, среднее, максимальное и минимальное количество платежей для транзакций, выполненных по каждому идентификатору карты.

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

  1. Разница между историческим количеством транзакций и исторической датой авторизованного флажка будет указывать количество отклоненных исторических транзакций для держателей карт.
  2. Разница между максимальной датой покупки и минимальной датой покупки будет указывать продолжительность в днях, когда транзакции были совершены каждым держателем карты.
  3. Соотношение общей суммы покупки и продолжительности транзакций укажет на сумму покупки, потраченную в день каждым держателем карты.
  4. Разница между максимальной суммой покупки и минимальной суммой покупки будет указывать диапазон суммы, потраченной каждым держателем карты.
  5. Соотношение количества транзакций и продолжительности транзакций будет указывать на транзакции, совершенные в день каждым держателем карты.
  6. Соотношение количества транзакций и уникального количества идентификаторов продавцов будет указывать на транзакции, совершенные каждым продавцом каждым держателем карты.
  7. Соотношение количества транзакций и уникального количества идентификаторов городов будет указывать на транзакции, совершенные каждым держателем карты в каждом городе.
  8. Соотношение количества транзакций и уникального количества идентификаторов состояний будет указывать на транзакции, совершенные каждым держателем карты в каждом штате.
  9. Соотношение количества транзакций и уникальных идентификаторов категорий продавцов будет указывать на транзакции, совершенные каждым держателем карты в каждой категории продавцов.

Во время EDA мы обнаружили, что сумма покупки имела различное распределение для разных значений «category_1», «category_2» и «category_3». Мы выполняем агрегирование идентификатора карты с различными значениями столбцов «category_1», «category_2» и «category_3» и находим функции для «сумма_покупки'.

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

Мы последовательно объединяем идентификаторы карт и столбцы «Рассрочки», чтобы найти функции для «authorized_flag» и «purchase_amount». Эти функции будут указывать на функции авторизованного флага и суммы покупки в рассрочку.

RFM — это инструмент исследования рынка для сегментации клиентов на основе ценности клиентов для фирмы. R означает Давность, F — Частота и M – Денежная стоимость. Недавность — это количество дней с момента последней покупки, Частота — это общее количество покупок, а Денежная ценность — это общая сумма денег, потраченных покупателем. Анализ RFM оценивает клиентов, оценивая их по трем категориям: как недавно они совершили покупку, как часто они покупают и размер их покупок.

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

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

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

Построение моделей

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

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

Базовая модель

Базовая модель — это модель, которая прогнозирует среднее значение целевых значений поезда в качестве цели для всех контрольных точек. Оценка RSME базовой модели предоставит нам ориентир, на котором мы должны повысить производительность нашей модели. Каждая из наших моделей должна иметь показатель RMSE меньше, чем показатель RSME базовой модели. Мы получили оценку RSME 3,8504для базовой модели.

KNNРегрессор Модель

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

Из поиска по сетке мы получили оптимальное значение количества соседей 200. Теперь мы используем оптимальное значение количества соседей для обучения модели регрессора KNN. Модель KNNRegressor с показателем RMSE 3,8248 демонстрирует небольшое улучшение по сравнению с базовой моделью. Хотя это улучшение, но мы можем добиться гораздо лучших результатов с более сложными моделями. Теперь мы построим несколько сложных моделей для нашей задачи.

Модель XGBoost

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

После запуска Optuna в течение 20 испытаний мы используем лучшие гиперпараметры, полученные для построения окончательной модели XGBoost. Модель XGBoost с оценкой RSME 3,65797 имеет гораздо лучшую производительность, чем KNNRegressor, и демонстрирует значительное улучшение оценки RSME по сравнению с базовой моделью. Прогнозы по модели XGBoost получили частную оценку 3,61264 и общедоступную оценку 3,70139 на Kaggle.

Модель LightGBM

Мы также создаем модель LightGBM для решения проблемы, чтобы проанализировать, работает ли она лучше, чем модель XGBoost. Как и в случае с XGBoost, мы используем Optuna для поиска лучших гиперпараметров перед построением окончательной модели LightGBM. Лучшие гиперпараметры, полученные от Optuna, используются для построения окончательной модели LightGBM. Модель LightGBM с оценкой RSME 3,65506 является лучшей из всех моделей с XGBoost, не сильно отстающих. Прогнозы модели LightGBM получили частную оценку 3,61514 и общедоступную оценку 3,70245 на Kaggle.

Чтобы еще больше улучшить оценку RSME, мы будем использовать сложенные модели LightGBM и XGBoost с разными весами.

Сложенная модель

Мы используем разные веса для моделей XGBoost и LightGBM, чтобы определить вес для нашей окончательной модели Stacked. Многоуровневая модель с весом 30% для XGBoost и весом 70% для LightGBM обеспечивает небольшое улучшение оценки RSME. из нашего предыдущего лучшего из LightGBM. Мы используем эти значения веса для нашей окончательной модели Stacked, которая дает нам оценку RSME 3,65465. Прогнозы из модели Stacked получили частную оценку 3,61463 и общедоступную оценку 3,70210 на Kaggle.

Составная модель с Meta-Learner

Теперь мы создадим еще одну модель с накоплением, но с мета-обучателем, и посмотрим, лучше ли она, чем остальные наши модели. Мы используем Ridge Regressor с прогнозами XGBoost и LightGBM в качестве входных данных и поездом Y в качестве целевых значений. Модель Meta Leaner Stacked получила оценку RSME 3,65487, что немного хуже, чем у модели Weighted Stacked, но лучше, чем у остальных моделей. Прогнозы по модели Stacked получили частную оценку 3,61357 и общедоступную оценку 3,70053 на Kaggle.

Заключение

Из всех моделей простая многоуровневая модель имела лучший показатель RSME для данных поезда, рассчитанных путем перекрестной проверки. Но, к нашему удивлению, модель XGBoost имеет лучший частный показатель Kaggle 3,61264, который позволил нам занять первое место в 7%. в таблице лидеров соревнований.

Будущие улучшения

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

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

Рекомендации

  1. https://www.kaggle.com/c/elo-merchant-category-recommendation/overview
  2. https://www.kaggle.com/code/fabiendaniel/elo-world/notebook
  3. https://www.kaggle.com/code/artgor/elo-eda-and-models/notebook
  4. https://aiaspirant.com/elo-merchant-category-recommendation-kaggle/
  5. https://www.kaggle.com/code/rajeshcv/customer-loyalty-based-on-rfm-analysis/ноутбук
  6. https://www.kaggle.com/code/raddar/towards-de-anonymizing-the-data-some-insights/notebook
  7. https://www.analyticsvidhya.com/blog/2020/11/hyperparameter-tuning-using-optuna/