Привет, Хабр!
В этой статье речь пойдет о больших данных в финансовых сервисах, а точнее, о том, насколько легко – или сложно – повысить конверсию клиентов при проведении маркетинговых кампаний по специфичным банковским продуктам, с помощью BigData и умных моделей. Другими словами, как, основываясь на наших знаниях о клиентах, выбрать именно тех из них, для которых предлагаемые продукты будут наиболее интересны.
Итак, в чем собственно состоит наш кейс? К нам обратился отдел маркетинга с задачей организации коммуникаций с клиентом посредством рассылки SMS с предложением рефинансирования ипотеки. Предполагалось рассылать предложения клиентам, которые ранее оставляли у нас заявку на ипотечный кредит (и она была одобрена), но оформление кредита по каким-то причинам не произошло. При этом необходимо было сегментировать клиентов, выделив в отдельную выборку высокоприоритетных, тем самым обеспечив более высокий уровень конверсии и экономию на рассылке SMS потенциально бесперспективным получателям.
Существует 3 подхода для решения задачи:
· Look-alike-модель оценивает вероятность того, что клиент выполнит целевое действие. В качестве обучающей выборки используются известные позитивные объекты (в нашем случае набор клиентов, откликнувшихся на рефинансирование) и случайные негативные объекты (сэмплирование небольшой подвыборки из всех остальных клиентов, кто не откликнулся на предложение). Модель будет пытаться искать клиентов, похожих на тех, кто совершил целевое действие;
· Response-модель оценивает вероятность того, что клиент выполнит целевое действие при условии коммуникации. В этом случае обучающей выборкой являются данные, собранные после некоторого взаимодействия с клиентами. В отличии от первого подхода, в нашем распоряжении имеются реальные позитивные и негативные наблюдения;
· Uplift-модель оценивает чистый эффект от коммуникации, пытаясь выбрать тех клиентов, которые совершат целевое действие только при нашем взаимодействии. Модель оценивает разницу в поведении клиента при наличии воздействия и при его отсутствии.
В нашем случае у нас были исторические данные по клиентам, пришедшим за рефинансированием, реальные позитивные и негативные наблюдения реакции клиентов по итогам первой маркетинговой волны рассылки SMS. Таким образом между look-alike и response моделями мы выбрали response. Для uplift-модели нужен особый дизайн эксперимента изначально (помимо данных по клиентам из первой маркетинговой волны рассылки нужны были данные о тех клиентах, кто пришел за рефинансированием через другой канал), а такими данными мы не располагали, поэтому от uplift-моделирования мы отказались.
В качестве обучающей выборки было взято множество записей X, описывающее параметры взаимодействия с клиентами по вопросу предложения рефинансирования, и множество записей Y с результатами этого взаимодействия:
В обучающей выборке содержалось 68 000 записей, в тестовой выборке 13 000 записей.
В итоге был разработан алгоритм определения вероятности положительного отклика на взаимодействие на первом этапе воронки по набору параметров CRM-кампании. Положительным откликом предложили считать переход по ссылке внутри SMS. В качестве бизнес метрики выступала конверсия.
Поскольку выборка была сильно не сбалансирована относительно таргета (процент положительного отклика 1,8%), в качестве метрики машинного обучения была выбрана F-мера.
В качестве источников данных брались стандартные анкетные данные клиента: возраст, пол, доход, данные о месте проживания и работе, а также данные кредитной заявки: ставка, срок, дата обращения и некоторые другие параметры. Данные хранились внутри Oracle database. Данные хранились внутри Oracle database. Чтобы подружить python и oracle использовали cx_Oracle, sqlalchemy и oracle client.
Две недели ушло на создание самой модели, и примерно столько же на подготовку и обработку данных (включая предоставление необходимых данных заказчиками). Методы очистки данных заслуживают отдельной статьи, не будем останавливаться на этом детально. Отмечу лишь, что в данном случае мы обошлись стандартной обработкой с помощью pandas. Исходные данные Единого Хранилища малопригодны для аналитических моделей в исходном виде, поэтому с ними пришлось повозиться:
Прошерстили исходные данные на предмет опечаток, грамматических и орфографических ошибок (Например, Образование «средне» вместо «среднее»);
Привели к единому виду семантические и синонимические изменения слов (Например, значения «образование техническое» и «техническое» по смыслу одно и тоже);
Устранили смысловые изменения (Например, в графе Семейное положение значения «не состою в браке», «холост», «не женат», «не замужем» по смыслу одно и тоже, поэтому заменили на единое гендерно-универсальное значение «не состою в браке»);
Заполнили пропуски данных (Например, для категориальных признаков, закодировали пропуски в виде новой переменной, а для числовых, так как использовали в качестве модели градиентный бустинг над решающими деревьями, заполнили пропуски сильно отрицательными значениями, если так поступить, то эти значения будут падать в отдельные листы при построении деревьев и соответственно обрабатываться отдельно);
Признаки с большим (более 85%) количеством пропусков из выборки исключили (Например, «место работы» и «тип организации», значение было заполнено только для 10% записей выборки). Стоит отметить, что существует много методов и алгоритмов заполнения пропусков, и что выбор как именно заполнить отсутствующие значения достаточно творческая задача. В нашем кейсе неплохо зашли методы, описанные выше.
Анализ и построение модели проводился в Jupiter notebook – удобное IDE на Рython, код можно писать по ячейкам и сразу выводить графики, таблицы быстро и в удобном виде.
Из множества оригинальных признаков путем их нелинейных преобразований было получено расширенное признаковое пространство.
Из алгоритмов для решения задачи мы выбрали градиентный бустинг над решающими деревьями Catboost из-за хорошего встроенного энкодера категориальных признаков. Отбор признаков производился на кросс-валидации с помощью permutation importance. Оптимизация параметров модели производилась с помощью пакета Hyperopt, в нём реализовано 3 алгоритма оптимизации: классический Random Search, метод байесовской оптимизации Tree of Parzen Estimators (TPE), и Simulated Annealing – метод имитации отжига. Hyperopt может работать с разными типами гиперпараметров – непрерывными, дискретными, категориальными и т.д, что является важным преимуществом этой библиотеки. Мы использовали TPE.
Финальное качество проверялось на отложенной тестовой выборке. F-мера на тесте составила ~0.11 (что мало, но ожидаемо из-за сильно ограниченного набора данных).
Графики logloss и F-меры:
На продуктив модель была запущена в виде A/B теста: сравнивалось взаимодействие с полностью случайными клиентами, а также с работой внешней моделью которая для нас представляла собой черный ящик. Применение модели на практике показали, что наша модель более качественно сегментирует клиентов, заинтересованных в предложении рефинансировать ипотеку, по результатам звонков Клиентам воронка на первом этапе конверсии выросла 2 раза по сравнению с ранее применяемыми методами.
Модель |
Клиентов заинтересованных в предложении, % |
Клиентов подавших заявку на рефинансирование, % |
Клиентов с одобренной заявкой, % |
Клиентов оформивших продукт, % |
Дом.РФ |
12,7% |
21% |
52% |
40% |
Внешняя модель |
6,3% |
29% |
60% |
37% |
Случайная выборка |
5,7% |
20% |
29% |
35% |
Т.к. сейчас ни одна из отраслей не способна создать полную картину своих клиентов без синергии с другими отраслями, дальнейшее развитие модели мы планируем за счет использования внешних данных бюро кредитных историй и телеком операторов, чтобы затащить в модель больше параметров для обучения и повысить степень влияния на целевую бизнес-метрику.
Sm1le291
А вам разве выгодно клиентам ипотеку рефинансировать?
Или вы пытаетесь перетянуть клиентов других банков?
Elen_Dor Автор
В кейсе имеется в виду работа с лидами - т.е. с теми клиентами, кто подавал заявку нам, но в итоге ипотеку не взяли у нас. Да, мы рефинансируем клиентов других банков.