Привет, Хабр! В этом году мы совместно с ВТБ организовали соревнование Data Fusion Contest. Хотим вспомнить, как оно проходило, и подробно рассказать о лучших решениях участников конкурса.

Как и в прошлом году, участников ждали две задачи: одна в контейнерном формате, другая — в классическом, табличном. Также участники отправляли решения в специальную номинацию Companion, ставшую уже традиционной для Data Fusion.

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

В 2025 году мы снова будем организатором соревнования и с командой департамента анализа данных и моделирования ВТБ уже начали готовить интересные задачи и наборы данных для Data Fusion Contest 2025.

Первая задача, геоаналитика

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

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

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

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

Геоданные были представлены в формате H3-индекса, то есть разбиения всей карты на соприкасающиеся шестиугольники (гексы). Чтобы соблюсти анонимность данных, а также сделать задачу решаемой на обычном «железе», координаты были закодированы в H3-индекс 9-го уровня. Транзакционная информация тоже была упрощена до агрегированных за некоторое время транзакций, сгруппированных по MCC‑кодам. Данные предоставлялись для каждой локации, в которой клиент совершал транзакции.

Переведём задачу на рельсы машинного обучения. Для каждой пары (client_id, h3_index) имелась явная бинарная разметка, снимал ли этот клиент наличные в этой локации. Он мог снимать наличные сразу в нескольких местах, это нормальная практика. То есть, это задача multi‑label классификации.

Участникам необходимо было предложить в контейнерном формате решение, выдающее для всех возможных локаций (их список был известен заранее) вероятности, что клиент захочет снять там наличные. А оценивались решения по соответствующей для этого типа задач метрике BCE (Binary Cross‑Entropy).

Второе место, Никита Трифонов (madgnome)

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

Давайте подробнее рассмотрим модели первого уровня:

  1. Multi‑label XGBoost. Идея взята из открытого решения и заключается в предсказании одной моделью вероятностей снятия во всех возможных банкоматах. В качестве признаков использовано количество транзакций, совершённых в каждой из возможных локаций. Ещё добавлены минимальные и медианные расстояния от транзакций клиента до каждого из банкоматов. Кроме того, подсчитано количество транзакций в радиусе 1/3/5/10 гексов от каждого из банкоматов.

    Несколько аналогичных моделей обучалось на разные целевые переменные: на снятие в соседних банкоматах в радиусе 1/2/3/4 гексов от заданного, а также на снятие в банкоматах на «родительском» уровне H3 (6/7/8). Благодаря расширению локальности снятий удалось нарастить количество целевых меток, чтобы не переобучаться на непопулярных банкоматах с очень малым количеством снятий.

  2. Unet. Автор перевёл геоданные в модальность изображений, где пиксели соответствуют популярности конкретной локации. Целевой переменной служит изображение того же размера, на котором показаны факты снятия наличных в локации, то есть решается задача бинарной сегментации.

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

    В обучении активно применялись аугментации. Для создания изображений использовались не все транзакции клиента (брались случайные 90% для построения признаков‑каналов). Усреднялись предсказания одной и той же модели с последней и предпоследней эпох.

  3. Признаки Mean target. На обучающей выборке рассчитывалась и сохранялась статистика вероятности снятия наличных в каждом из банкоматов в зависимости от транзакций клиента. Например, вероятности снятия во всех банкоматах для тех, кто совершал транзакции в локации X. Рассчитанные вероятности затем применялись к отложенной выборке и использовались в качестве признаков. Они рассчитывались в зависимости от разных наборов параметров транзакции. Например, вероятности снятия для клиентов, которые совершали транзакции в локации X, — с MCC‑кодом Y; или в комбинации локации X, — с MCC‑кодом Y и в период дня Z; или в локации X, и при этом клиент живёт в локации Y.

Разберём теперь итоговую модель второго уровня. Это был Catboost, работающий на парах клиент‑локация в качестве бинарного классификатора. Ключевыми признаками были предсказания моделей с первого уровня, однако на вход подавались и обычные признаки. В основном использовались вышеописанные идеи из моделей первого уровня: интенсивность транзакций пользователя в этой локации и её окрестностях, популярность локации и другие.

Особенностью решения было то, что на втором уровне работала не одна, а три разных модели в зависимости от сегмента:

  1. Сегмент пар, где у клиента были транзакции в выбранной локации. Это 0,9% общей выборки, со средней вероятностью снятия в 7,71%.

  2. Сегмент пар, где транзакции были в ближайшей окрестности от рассматриваемой локации. Это соответствует 12,5% выборки со средней вероятностью снятия в 0,38%.

  3. Все остальные пары, то есть те, где не было транзакций рядом с локацией. Это 86,6% общей выборки со средней вероятностью снятия в 0,03%.

И несколько слов про проверку, так как от её качества часто зависит победа в соревновании. Проверка была несложной:

  • Клиентов стратифицированно поделили на 7 фолдов на основе количества снятий в банкоматах.

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

  • На оставшихся 2 фолдах кроссвалидировалась и обучалась модель второго уровня.

Первое место, Андрей Кузнецов

Решение состояло из трёх стадий.

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

  • модель на основе внимания, использующая транзакции как текст в NLP‑задачах;

  • модель Feedforward NN;

  • модель Xgboost.

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

Третья стадия обрабатывала результаты предыдущей стадии, калибруя вероятности Catboost.

Если проследить эволюцию решения по каждой из стадий на валидационном множестве, то уже первая стадия работала достаточно хорошо, чтобы с уверенностью попасть в топ-10 (с результатом в 8,7755). Вторая стадия заметно улучшает результат, уже забирая «золото» (с результатом 8,1982). И финальная стадия совсем немного улучшает результат (до 8,1784), обеспечивая дополнительную надёжность благодаря калибровке.

Отдельно поздравляем Андрея с тем, что он с каждым годом повышает свой призовой результат на Data Fusion Contest, и в этом году стал solo‑top-1! ?

Вторая задача, модели оттока

Участникам предстояло предсказать отток клиентов банка по их истории транзакций в постановке Time‑to‑event. Эта задача проводилась в классическом (табличном) формате: достаточно было обучать у себя модели и готовить решение, результатом которого можно было просто заполнить неразмеченные тестовые данные. В общем, порог входа был куда ниже.

Сама по себе задача предсказания оттока очень часто встречается в разных версиях и формулировках. В чате участников даже родился новый мем: «Задача давно решена на Западе™». Но всё равно были свои нюансы.

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

Несмотря на свою широкую распространённость, в задачах оттока есть много подводных камней и особенностей. Специалисты по машинному обучению очень часто пытаются прогнозировать отток «в лоб», как в случае с бинарной классификацией. Однако проблема оттока является явной Time‑to‑event (или survival) постановкой задачи, буквально «по учебнику». К тому же существует отдельное направление в анализе и предсказании оттока вокруг методов Buy‑till‑you‑die (BTYD).

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

Главное уточнение заключалось в том, что в рамках обучающих данных участникам предоставлялась не только метка, соответствующая тому, что клиент «уйдёт в отток», но и время до его последней транзакции (по сути, survival time). В качестве метрики использовался Concordance Index (CI), являющийся survival‑аналогом для ROC‑AUC, что тоже упрощало жизнь участникам, ранее не сталкивающимся с этими методами.

Участники могли подойти к решению задачи разными способами, включая и классические, и современные нейросетевые методы в Time‑to‑event/Survival‑анализе. Давайте посмотрим, чем же воспользовались и что придумали победители соревнования.

Второе место, команда Sber AI Lab: Омар Золоев, Амурхан Дзагкоев, Артём Сахно и Иван Сергеев

Решение основано на нейросетях, со значительной частью предобработки данных и обучения моделей на основе open‑source библиотеки pytorch‑lifestream. Было несколько экспериментов с survival‑подходами и библиотеками, а также со своими loss‑функциями на pyboost‑е, но значительного прироста метрик это не принесло. Поэтому решали задачу просто как бинарную классификацию со своим набором моделей.

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

  • Две модели были из открытых решений, а остальные либо использовали эмбеддинги, полученные с помощью обучения без учителя, либо сами были supervised‑нейросетями.

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

  • После получения скора на локальной валидации все модели переучивались уже на всех данных для получения финального предсказания.

Так как решение очень необычное, побольше расскажем про основные модели в составе ансамбля. Начнём с CoLES (Contrastive Learning for Event Sequences). Авторы хотели сделать представление, в котором удастся приблизить друг к другу транзакции одних пользователей и отдалить транзакции других. Для этого взяли подпоследовательности транзакций у каждого клиента в батче и прогнали через энкодер транзакций. Их можно агрегировать с помощью GRU или LSTM. Далее получили подпоследовательности транзакций каждого пользователя. С помощью softmax loss‑а их приблизили друг к другу в пространстве эмбеддингов и отдалили от подпоследовательностей других пользователей.

Подробнее расскажем про энкодер транзакций. Для числовых признаков типа суммы транзакций просто наложили batchnorm. Для категориальных признаков их пропустили через слой rnn‑embedding‑а. Затем все признаки конактенировали и пропустили через линейный слой.

Следующая модель — WTTE‑RNN. С её помощью предсказали время до наступления следующего события — появления новой транзакции. Для этого ввели равномерную сетку по времени: если в какой‑то день у человека были транзакции, эта транзакция подавалась без изменений. Если было несколько транзакций в один день, то они агрегировались: бралась общая сумма и самый частый МСС‑код. Если не было транзакций, то подавался нулевой токен. На каждом состоянии RNN предсказывали время (количество дней) до следующей транзакции. На обучение выделялась последовательность по 151-ю дату транзакции, а на предсказание — оставшиеся 30 дней перед отчётной датой.

CoLES не очень хорошо работает с частотой транзакций, хотя именно она — один из ключевых факторов в этой задаче. Чтобы это исправить, решили взять равномерную сетку из WTTE и применить к ней метод CoLES. Таким образом удалось убить двух зайцев: в сетку стали явно подаваться пустые транзакции, а у нерегулярных событий стал учитываться порядок. Именно этот подход дал основной прирост для общего результата решения.

В решении была обычная supervised‑нейросеть, которая предобучалась методом CoLES и училась одновременно на target и time. Из этой нейросети брались только предсказания target. При этом учёт time в качестве признака тоже был, но организован несколько иначе, нежели в рецепте команды, занявшей первое место. На кросс‑валидации отделялся отложенный тест, на котором модель обучалась на признаках агрегированных статистик сперва для предсказания time, а после этого уже доучивалась для предсказания target. Но чтобы не было переобучения, использовали early‑stopping по отложенному тесту.

Итого, ансамбль состоял из следующих моделей:

  1. Два открытых решения: модели от nazarovo и kdimon15, к которым были добавлены признаки TF‑IDF по MCC кодам.

  2. Модель WTTE‑RNN для получения риск‑эмбеддингов клиента в последний месяц.

  3. CoLES‑эмбеддинги пользователя, полученные при помощи контрастивного обучения с использованием библиотеки pytorch‑livestream.

  4. Модель Supervised NN, предобученная методом CoLES. Finetuning с двумя головами на time и target.

  5. WTTE‑CoLES‑эмбеддинги пользователя, полученные при помощи CoLES на равномерной сетке по времени. Также использовались агрегации по выходу энкодера транзакций.

  6. Time в качестве признака: предсказание time по агрегатным признакам для дальнейшего предсказания target.

Первое место, Иван Черных и Дмитрий Кожемяко

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

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

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

Полезными признаками оказались расчёты темпа активности клиентов. Транзакции делили на периоды по 30 дней и в каждом считали статистику (как медианную сумму за период) для периодов T, T-1, T-2. В качестве признаков рассчитывали отношения между T и T-1, а также T-1 и T-2.

Важно упомянуть user_id, о котором было много споров в чате участников. Опасаясь, что в нём содержится утечка, но не будучи уверенными в этом, решили поступить следующим образом. Чтобы сохранить какую‑то историю о порядке появления клиентов просто разделили user_id на 20 групп.

  • Сразу после того, как удалось получить устойчивый baseline, запустили перебор моделей на Optuna. Постоянно было около 20 моделей XGBoost и CatBoost, которые далее объединяли в ансамбль взвешенным усреднением.

  • Потом эти модели отбирали путём подбора весов для каждой из них, проходя через Optuna. Модели с маленькими весами безжалостно выбрасывали, осталось пять.

  • Распределение значимости признаков в XGBoost и CatBoost было достаточно однородным между двумя библиотеками.

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

Удалось обнаружить, что при некоторых образцах данных модель ведёт себя неустойчиво, с высокой вариативностью в метриках. Экспериментально выяснили, что есть 227 клиентов с более чем 20 транзакциями в день, которых стоило исключить из обучающей выборки. Это приблизило к результатам в топ-10 с локальной валидацией в 0,7919.

Затем решили исключить ещё 93 клиента, у кого было более 11 уникальных MCC‑кодов за день. Это повысило локальный результат до 0,7927. На чём и остановились в изысканиях с фильтрацией.

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

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

  2. Борьба с дисбалансом затронула и отбор признаков. Их генерировалось очень много, и авторы нещадно удаляли. Модель постоянно проверяли и упрощали, что ещё больше повышало её обобщающие способности.

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

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

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

В этом году соревнование стало рекордным: в нём приняли участие более 1500 data scientist‑ов из 186 городов и 33 стран. Участники на протяжении двух месяцев вели активную борьбу за призовой фонд в 2 000 000 рублей, отправив суммарно почти 7000 решений.

В феврале‑апреле 2025 года мы приглашаем вас на новый Data Fusion Contest. Он будет состоять из двух основных задач и одной образовательной. Кроме интересных и сложных задач вас ждут онлайн‑митапы, разборы решений и подарки!

Комментарии (0)