Привет, Хабр!  В этой статье речь пойдет о больших данных в финансовых сервисах, а точнее, о том, насколько легко – или сложно – повысить конверсию клиентов при проведении маркетинговых кампаний по специфичным банковским продуктам, с помощью 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%   Т.к. сейчас ни одна из отраслей не способна создать полную картину своих клиентов без синергии с другими отраслями, дальнейшее развитие модели мы планируем за счет использования внешних данных бюро кредитных историй и телеком операторов, чтобы затащить в модель больше параметров для обучения и повысить степень влияния на целевую бизнес-метрику.