В Альфа-Банке естественным образом накапливаются разнообразные последовательные данные: истории транзакций клиентов, кредитные истории, истории коммуникаций. Одно из двух направлений Лаборатории машинного обучения Альфа-Банка занимается построением нейросетевых моделей на таких данных для решения разных задач. Одна из них — задача кредитного скоринга. Любой прирост в качестве скоринга платежеспособности клиентов на входе может быстро принести большой прирост в прибыли на выходе за счет увеличения числа выдач при неизменном риске.  Мы уже рассказывали о построении моделей на последовательностях карточных транзакций и транзакций расчетного счета для решения задачи кредитного скоринга. В обоих случаях вместо классических подходов – логистической регрессии и градиентного бустинга – использовались настоящие «черные ящики»: рекуррентные нейронные сети. Теперь же мы хотим рассказать о применении этого неклассического подхода на другом источнике данных – кредитных историях. Появление модели на данных КИ стало переломной точкой, когда совокупный вес нейронок на последовательных данных при принятии решений превысил вес бустинговой модели на табличных данных. В этой статье мы опустим некоторые технические детали, о которых уже рассказывали в предыдущих. Вместо этого расскажем, как звучала постановка задачи, какие данные использовали, какие применяли модели, с какими сложностями столкнулись и как с ними справились. От этого рассказ, может быть, станет чуть менее техническим, но при этом не менее интересным.		 В Банке естественным образом накапливаются разнообразные последовательные данные: истории транзакций клиентов, кредитные истории, истории коммуникаций. Одно из двух направлений Лаборатории машинного обучения Альфа-Банка занимается построением нейросетевых моделей на таких данных для решения разных задач, в которых заинтересован банк.  Первой задачей, которую Лаборатория начала решать с помощью рекуррентных нейронок на последовательных данных, стала задача кредитного скоринга. Такая честь этой задаче выпала совершенно не случайно. Кредитный скоринг – очень «аппетитная» задача для банка.  Хотя многие банки и стремятся вырасти во что-то большее, чем просто финансовая организация, кредиты для них по-прежнему основная статья доходов. Поэтому любой прирост в качестве скоринга платежеспособности клиентов на входе может быстро принести большой прирост в прибыли на выходе за счет увеличения числа выдач при неизменном риске.  Подход к построению моделей на кредитных историях ничем существенно не отличается от подходов на последовательностях карточных транзакций и транзакций расчетного счета, о которых мы рассказывали. Если мы заново будем рассказывать, как строить эмбеддинги категориальных признаков и подавать их на вход какому-нибудь рекуррентному слою, то непременно получим мем с Человеком- Пауком в комментариях. Вместо этого, кроме рассказа об особенностях данных кредитных историй и конкретных «фишках», которые зашли при разработке модели именно на этих данных, в этой статье мы постараемся подвести промежуточные итоги по решению задачи кредитного скоринга с помощью рекуррентных нейронок:  как звучала постановка задачи; какие использовались данные; какие применяли модели; с какими сложностями столкнулись; как с блеском с ними справились. Тем более, что появление модели на данных КИ стало переломной точкой, когда совокупный вес нейронок на последовательных данных при принятии решений превысил вес бустинговой модели на табличных данных. От этого рассказ, может быть, станет чуть менее техническим, но при этом не менее интересным. Примечание: об этом и многом другом мы рассказываем в треке Deep Learning in Finance на ods.ai. Кредитный скоринг – классическая банковская задача, которую решают много десятков лет. Её суть проста: перед тем, как выдать незнакомому человеку большую сумму денег, банк хочет оценить свои риски. Риск для банка формализуется с помощью понятия дефолта. Определения дефолта бывают разные, но общая суть такова: после выдачи клиенту кредитного продукта банк в течение N месяцев наблюдает, как клиент платит по этому кредиту. Если в течение непрерывного промежутка в K дней клиент не внес обязательный платеж, то считается, что он «ушел в дефолт». Варьирование значений для N и K порождает большой набор определений дефолта. В нашем случае это просрочка на 90 и больше дней в течение 12 месяцев со дня выдачи кредитного продукта. Подходы к решению задачи кредитного скоринга проделали большой путь от применения методов математической статистики на анкетных данных до обучения всевозможных моделей машинного обучения на данных телекомов, транзакций или чеков.  До недавнего времени SOTA подходом было построение мощных моделей градиентного бустинга на большом наборе табличных признаков. При таком подходе дата-сайентист вручную генерирует признаки, в том числе на основе последовательных данных, агрегируя их по временной оси.  Такой подход обладает очевидными недостатками. От разработчика модели требуется: много времени для проверки большого числа гипотез и построения широкого набора признаков; глубокое понимание доменной области, чтобы построенные признаки были осмысленными и информативными. В последние годы росли два фактора: вычислительные мощности и готовность бизнеса мириться с издержками от использования «черных ящиков» в пользу более высокого качества решений. Поэтому получили развитие рекуррентные нейронные сети на последовательных данных.  В таком подходе надежды возлагаются на то, что приняв на вход последовательности в сыром виде, нейронка сама выявит нужные признаки и по ним посчитает итоговый скор. В таком случае при агрегировании информация не теряется, и модель располагает всеми доступными данными. Именно такой подход мы применяем в Лаборатории. Сначала поговорим о том, откуда взять выборку для обучения моделей. Казалось бы, вопрос почти риторический – банк выдает сотни тысяч кредитов, достаточно сформировать целевую переменную в соответствии с тем, вернул клиент кредит или нет. Тогда в распоряжении разработчиков моделей оказывается огромная выборка объемом в несколько миллионов объектов. Но как бы не так. Опытный дата-сайентист сразу поймет, что такая выборка будет сильно смещена.  Дело в том, что кредиты выдаются только тем клиентам, которые получили высокий кредитный скор с помощью работающей в банке модели кредитного скоринга. Поэтому в описанную выборку попадут только «хорошие» клиенты. В то же время модель, которую необходимо разработать, будет работать на всем входном потоке: и на «хороших», и на «плохих» клиентах одновременно. С описанной точки зрения, идеальной была бы выборка, в которой кредиты выдаются всем клиентам, независимо от их рискового скора. Нам повезло: для проведения различной аналитики банк ежемесячно выдает небольшому подмножеству клиентов кредитные карты, несмотря на политику отказа. Но при такой стратегии он непременно терпит убытки, поэтому объемы такой выборки совсем небольшие. Поэтому решив предыдущую проблему со смещенным распределением, мы получаем новую: как обучить нейронную сеть с огромным числом параметров на такой маленькой выборке, использовав при этом и в десятки раз большую выборку исторических выдач.  Примечание. Наверное потому эта выборка и называется challenger, что бросает новый вызов разработчикам моделей. Перед нами стоит проблема: как обучить одну модель на двух сегментах данных? Безудержная фантазия сразу подсказывает как минимум 3 варианта. Разберем каждый из них. Подход #1. Учим всё вместе, не обращая внимания на сегмент. Плюсы: это очень просто. Минусы: из-за того, что выборка челленджера в десятки раз меньше, этот подход практически не будет её учитывать, хотя ее распределение наиболее приближенно к реальному. Подход #2. Учим модель на внутренних данных, а потом дообучаем на челленджере. Плюсы: качество лучше, чем в первом подходе. Минусы: это очень долго и не всегда работает – как ускорить? Подход #3. Учим всё вместе, но каждому сегменту присваиваем некоторый вес, который говорит о том, сколько внимания нужно обращать на данный сегмент при обучении. Плюсы: это очень просто, а результат гарантированно лучше, чем в первом подходе. Минусы: иногда результат немного хуже, чем дообучение. При построении наших моделей мы предпочитаем третий подход как баланс качества и простоты.  Отлично, с выборкой объектов разобрались. Теперь поговорим об особенностях сбора данных для этой выборки.  Первая особенность в том, что при разработке мы должны использовать только данные, которые были доступны на момент подачи клиентом заявки на кредит. Это нужно, чтобы не обучать модель на данных, которых не будет в распоряжении модели при реальном скоринге. Вторая особенность напрямую следует из того, как мы определили целевую переменную. Как хорошему вину, дефолту нужно время, чтобы настояться: о факте ухода клиента в дефолт мы можем узнать только через год после выдачи. Поэтому для обучения мы можем использовать только те кредиты, которые были выданы как минимум год назад.  Однако, для тестирования модели можно брать и более «короткие» определения дефолта: просрочки на 30–60 дней в течение 4–6 месяцев со дня одобрения кредита. Данные кредитных историй обладают некоторыми преимуществами в контексте задачи кредитного скоринга перед данными транзакционных историй, о которых мы рассказывали раньше.  Во-первых, очевидно, что кредитная история клиента несёт в себе много информации о способности клиента платить по своим кредитным обязательствам.  Во-вторых, если человек обращается в банк за кредитным продуктом, то он не всегда текущий клиент этого банка. При обращении человека в банк за кредитным продуктом велика вероятность, что в банке для него не найдется транзакционная история.  С другой стороны, кредитную историю для нового клиента банк всегда может купить в бюро кредитных историй. В России существует несколько таких бюро, крупнейшие из которых: Объединенное кредитное бюро (ОКБ), Национальное бюро кредитных историй (НБКИ) и Эквифакс. Также внутри банка естественным образом накапливаются исторические данные по кредитам, выданным самим банком. Как правило, с учетом кредитных отчетов из бюро кредитная история находится для 90% клиентов, обращающихся за кредитом. Кредитная история заявителя (как в общем-то и транзакционная) — это фактически многомерный временной ряд. Каждый элемент ряда — это прошлый кредит заемщика, который описывается набором вещественных и категориальных признаков. Набор признаков может меняться, в зависимости от организации, в которой накапливаются данные кредитных историй. Чаще всего встречаются такие признаки: сумма кредита; валюта; срок кредита; процентная ставка; сумма ежемесячного платежа; статус кредита: активен, закрыт, просрочен; тип кредита: автокредит, ипотека, кредитная карта; тип отношения к кредиту: заемщик, поручитель, юридическое лицо; число просрочек на N дней. В этом году в рамках Соревнования на данных кредитных историй, мы опубликовали датасет с кредитными историями банковских клиентов (разумеется, тщательно их анонимизировав перед публикацией). По этим данным можно посмотреть разные интересные статистики. Например, на графике ниже можно увидеть распределение длин кредитных историй.			 В отличие от транзакций, максимальная длина последовательности в этом случае не превышает нескольких десятков. Это позволяет использовать при обучении вообще всю информацию из кредитной истории клиента, а не только срез за последние M месяцев. Общий подход к построению модели на данных кредитных историй существенно не отличается от случая моделей на транзакциях.  Сначала приводим вещественные признаки к категориальным, заменяя значения признака на номер квантиля, в который это значение попадает. Затем для каждого категориального признака получаем векторное представление — эмбеддинг. Конкатенируем представления для разных признаков и получаем общий эмбеддинг кредита. Дальше последовательность кредитных эмбеддингов идёт на вход рекуррентному слою. На выходе получаем некоторое закодированное векторное представление кредитной истории клиента. Для предсказания целевой переменной представление идет в многослойный перцептрон. Схематичное изображение архитектуры модели на данных кредитных историй представлено ниже. Чтобы рассказ о модели на данных КИ не превратился в перечисление того, что использовалось в моделях на транзакциях, отметим, какие новые «фишки» хорошо показали себя в данной модели. Архитектура. Возможно, из-за меньших объемов данных, модель на данных КИ обучалась хуже транзакционных моделей при той же архитектуре. Поэтому в компанию к пуллингам скрытых состояний были добавлены пуллинги от эмбеддингов и отдельно финальные скрытые состояния, чтобы увеличить количество обучаемых параметров и сложность модели. Sample Weight. Поскольку применение модели лежит на временной шкале правее разработки, полезным приемом оказалось взвешивание объектов выборки, в зависимости от даты открытия кредита. Чем ближе к текущей дате дата открытия кредита из выборки — тем больший вес ошибки на данном кредите. Learning Rate Scheduler. В прошлых статьях мы уже рассказывали о применении стратегии Cyclical Learning Rate для выбора длины шага градиентного спуска на каждой эпохе. При обучении модели на данных КИ лучшей стратегией оказался подход One Cycle — некоторое развитие стратегии Cyclical Learning Rate. В этом случае learning rate в течение заданного числа эпох увеличивается. Затем оставшиеся эпохи непрерывно уменьшается. На последних эпохах learning rate выбирается на несколько порядков ниже, чем первоначальный. Как и отмечается в оригинальной статье, это позволяет достичь более быстрого обучения модели, а также получить эффект регуляризации. Для задачи кредитного скоринга мы построили 3 модели на последовательных данных: модель на карточных транзакциях, модель на транзакциях расчетного счета, модель на данных кредитных историй. Также независимо разрабатывается бустинговая модель на табличных данных, которая также содержит различные агрегации транзакционных данных и данных кредитных историй.  В продакшне эти модели работают вместе путем простого смешивания с помощью логистической регрессии. Эффект от нейросетевых моделей рассчитывается как прирост в метрике Джини относительно бустинговой модели при добавлении этих скоров логрегом.  Все 3 модели внедрены только во вторичные предложения, когда банка сам скорит клиентскую базу и делает предложения об открытии кредитных продуктов. Эффект составляет около 3 пунктов Джини на выборке исторических выдач, и около 4 пунктов Джини на выборке челленджера.  В подтверждение слов выше о релевантности данных кредитных историй решаемой задачи, отметим, что: Модель на данных БКИ демонстрирует высокое самостоятельное качество: не уступает модели на табличных данных на выборке выдач и при этом показывает качество на 3 пункта Джини выше на выборке челленджера. Обычно, когда мы рассказываем о наших моделях, человек со стороны искренне удивляется, что в банке для решения задачи кредитного скоринга используется не логистическая регрессия, и даже не градиентный бустинг, а настоящие «черные ящики» – тяжелые нейронные сети.  Реакция весьма логична: ещё недавно нам самим приходилось доказывать право нейросетей на существование в процессе кредитного скоринга. Поэтому мы двигались постепенно: сначала разработали модель на карточных транзакциях; затем появилась модель на транзакциях расчетного счета; и совсем недавно мы внедрили модель на данных кредитных историй. Логичное продолжение этого движения — построение единой модели на всех трёх доменах данных.  Действительно, сейчас каждая модель строит с помощью эмбеддингов и рекуррентных слоев некоторые представления последовательных данных по клиенту. Уже на этих представлениях работает многослойный перцептрон (MLP) для предсказания целевой переменной.  При использовании всех трёх моделей одновременно, вместо смешивания уже финальных скоров модели, кажется разумнее объединять представления данных по клиенту из трёх доменов и на этом строить MLP, учитывая взаимодействия между доменами. С другой стороны, такие представления клиентов можно переиспользовать не только в задаче кредитного скоринга, но и в других, таких как склонность клиентов ко всевозможным продуктам или предсказание дохода. Кроме того, для клиентов можно строить представления на основе данных из других доменов: данных чеков, истории коммуникаций, логах мобильного приложения и сайта. Всё это мы планируем опробовать в ближайшее время, а о своих успехах и неуспехах (но надеемся, что больше все-таки об успехах) будем продолжать делиться здесь, а также в нашем Телеграмм-канале «Нескучный Data Science». Подписывайтесь на нас и до новых встреч!  А ещё приходите на Data Science Meet Up #2 11 августа. Митап будет в стиле киберпанк, а программе доклады об LTV, Uplift, совершенство и Reject/Inference. Подробное описание программы. Рекомендуем почитать: Как мы участвовали в чемпионате по DS длиной 3,5 месяца Как настраивать аналитику, если у вас Backend Driven UI Знакомство с Apache Airflow: установка и запуск первого DAGа Нейросетевой подход к моделированию транзакций расчетного счета