Всем привет! Меня зовут Мельников Виктор, я middle data scientist в Альфа-Банке в Управлении по разработке инструментов автоматизации моделирования.
Год назад вышла статья о первой open source библиотеке Альфа-Банка для автоматического построения uplift-моделей — Automatic Uplift Framework, или сокращённо AUF 🐺. В ней мы рассмотрели основной функционал библиотеки с примерами кода, а также разместили ссылку на ноутбук с примером на открытом датасете.
Прошёл год. Пришло время рассказать о новшествах и результатах применения AUF в Альфа-Банке. В конце — обновлённый пример кода, с которым можно сразу начать строить uplift-модели быстро и качественно. Достаточно создать окружение с Python 3.8 и выполнить команду pip install auf. Исходный код библиотеки доступен на GitHub.
Небольшой дисклеймер: как и первая, эта статья посвящена именно библиотеке AUF, а не uplift-моделированию в целом. Ссылки на материалы по теории есть в конце первой статьи.
Мы начнём с того, как AutoML превращает сложный поиск инкрементального эффекта в эффективный промышленный процесс. Вспомним основы uplift-моделирования и покажем на кейсах, как автоматизация ускорила разработку, позволила внедрить автопереобучение в продакшн и реализовать поддержку мультитритмента. Вы узнаете, в каких сценариях AUF приносит максимум пользы, с какими ограничениями можно столкнуться и как использовать библиотеку в своих задачах.
Кроме прикладных кейсов, заглянем «под капот»: расскажем о рефакторинге оптимизатора, новых режимах обучения, кастомизации и инструментах глубокого анализа моделей — например, оценке чувствительности сегментов и сравнении с моделями склонности. В завершение поделимся результатами масштабного рефакторинга, который сделал систему стабильнее, и расскажем, как наше видение «умных и свободных» моделей воплощается в жизнь.
Напомним контекст
Что такое uplift-моделирование?
Допустим, нужно запустить маркетинговую кампанию и предложить клиентам новый продукт. В случае банка — это может быть кредитная карта с кэшбэком или семейный счёт. Можно показать рекламу всей базе, но это дорого и неэффективно: многие клиенты не заинтересованы, а чрезмерная коммуникация может повредить лояльности.
Можно ограничиться случайной выборкой, но и тогда мы будем тратить ресурсы на нецелевых клиентов.
Умный маркетинг работает иначе: нужно найти тех, кто возьмёт продукт только если ему его предложить. Нам не нужны те, кто и так купит, или те, кто не купит ни при каких условиях.
Именно здесь помогает uplift-моделирование — оно оценивает эффект воздействия на конкретного клиента.
Такие задачи встречаются повсеместно: в ритейле (нужна ли скидка?), в телекоме (звонить или хватит push?), в медицине (поможет ли препарат?). Если хочется разобраться глубже — ссылки на материалы есть в первой статье.
Зачем нам AutoML?
Допустим, вы поняли, что такое uplift, и хотите построить модель. Вы ищете библиотеки — например, scikit-uplift, causalml, EconML — и понимаете, что это строительные блоки. Нужно самому реализовать отбор признаков, подбор гиперпараметров (например, через Optuna), визуализацию для бизнеса… В итоге одна модель — это 1–2 недели работы. А если бизнес запросит новую гипотезу? Ещё две недели.
Отсюда родилась идея AUF — Automatic Uplift Framework. Это open source библиотека Альфа-Банка, которая берёт на себя всю рутину: загрузите выборку, запустите pipeline.run() — и через несколько часов получите готовую модель с полным отчётом, понятным как для DS, так и для бизнеса. Ускорение — в 5–10 раз. Вместо двух недель — один рабочий день.
Год назад мы рассказали о первой версии AUF: как устроен пайплайн, какие модели поддерживаются, как запустить на открытом датасете. С тех пор библиотека выросла: появился мультитритмент, настроено автопереобучение в проде, добавлено множество новых функций.
Главные итоги AUF за год
Ускорение разработки
AUF изначально создавался как внутренний инструмент для ускорения тестирования гипотез и разработки uplift-моделей «по кнопке». За счёт автоматизации отбора признаков, подбора моделей, логирования результатов разработка ускорилась в 5–10 раз — с 5–7 рабочих дней до 4–8 часов.
Важно: обучение через AUF занимает время, но оно не требует постоянного внимания. Это позволяет параллельно работать над другими задачами — реальная эффективность ещё выше.
Внедрение моделей
На данный момент AUF помог обучить и вывести в продакшн 4 модели. Ещё более 10 находятся в стадии пилота. Эти модели помогают избегать спама, делать персонализированный прайсинг и привлекать клиентов, повышая эффективность маркетинга и бизнеса в целом.
Особенно важно, что одна из production-моделей работает в режиме автопереобучения — об этом далее.
Работа с деградацией моделей в проде
На практике данные часто меняют распределение — из-за сезонности, изменения ключевой ставки и других факторов. Даже если таргет не изменился, модель может деградировать. Обычно разработчик должен вручную собрать данные, переобучить модель, проверить качество и вывести в прод.
Но зачем тогда AutoML?
При наличии стабильного процесса сбора данных можно автоматизировать контроль качества. Если метрика ухудшилась, Jenkins запускает пайплайн переобучения. Если новая модель лучше — она автоматически заменяет текущую в проде. Человек не участвует.
Конечно, при условии, что Spark, MLflow, Git, Hadoop, Airflow и инфраструктура в целом работают стабильно =)
Мультитритмент
Что это такое
Стандартная задача: кому отправить предложение о новом продукте. Классический uplift отвечает на вопрос: «Стоит ли вообще коммуницировать с этим клиентом?» — уже большой шаг вперёд по сравнению с массовой рассылкой.
Но на практике вопрос часто звучит иначе: как именно коммуницировать? Звонок — дорогой канал. Если клиент откликнется на push, тратить время оператора нерационально. Баннер — дёшево, но кому-то нужен живой разговор.
Разным клиентам нужны разные воздействия.
Здесь на помощь приходит multitreatment uplift: вместо бинарного «воздействовать / не воздействовать» модель определяет, какое из нескольких воздействий принесёт наибольший эффект для каждого клиента. Это позволяет не просто отсеивать нечувствительных, но и персонализировать канал коммуникации.
Как пользоваться
Хорошая новость: если вы работали с AUF, освоить мультитритмент будет легко. Новый класс учить не нужно — используется тот же UpliftPipeline с методами load_sample и run.
Единственное отличие — формат словаря с маппингом групп в load_sample. В бинарном случае указывались контрольная и одна целевая группа. Для мультитритмента нужно передать все группы, при этом ключ 'control' обязателен — относительно него будет считаться эффект каждого воздействия.
После вызова run() пайплайн сам определит, что задача — мультитритмент, обучит соответствующие модели и выдаст аналитику в привычном формате. На выходе — скор по каждому воздействию для каждого клиента. Вы сможете выбрать оптимальный канал.
После выполнения кода сначала выводится статистика по конверсиям в каждой группе и результат проверки гипотезы о значимом отличии от контрольной группы.
Затем — статистика по train-val-test подвыборкам, аналогично бинарному пайплайну.
Ограничения
Мультитритмент — активно развивающаяся область. Будем честны: в текущей версии AUF реализован базовый вариант мультитритмента.
Поддерживаются основные модели (включая расширения S-, T-, X-learner на несколько групп), но метрика качества считается по бинаризованному воздействию. Каждый тритмент сравнивается с контролем отдельно, а не в рамках единой многоклассовой метрики. Подход рабочий и интерпретируемый, но не учитывает конкуренцию между тритментами напрямую.
Почему так? Потому что в академическом сообществе пока нет единой общепринятой метрики для оценки мультитритмент-аплифта. Разные статьи предлагают разные подходы, и мы не хотели навязывать один из них как «правильный».
Если вы занимаетесь этой темой и знаете свежие работы или подходы к оценке — напишите в комментариях. Обратная связь от сообщества напрямую влияет на развитие библиотеки.
Обновление функционала AUF
За год библиотека изменилась как внешне, так и внутренне. Часть изменений заметна сразу: новые параметры, графики, возможности. Часть — под капотом: чище код, надёжнее работа.
Чтобы не превращать этот раздел в changelog, разобьём его на три блока:
- «Учим модели как умные и свободные» — о тонкой настройке подбора моделей под задачу.
- «Анализируем модели как профи» — о новых инструментах для понимания, что модель нашла и можно ли ей доверять.
- «Архитектурные изменения» — о рефакторинге и документации.
Учим модели как умные и свободные
Обучение моделей и подбор гиперпараметров — сердце любого AutoML-фреймворка. В первой версии AUF этот процесс был рабочим, но прямолинейным. За год мы собрали фидбек и поняли: для действительно крутых моделей нужна гибкость. Каждое изменение иллюстрируется примером параметров pipeline.run().
Кастомизация обучения
Раньше для всех моделей использовались одни и те же настройки. Время обучения задавалось одним числом (например, 300 секунд), количество топ-признаков — одним списком (например, [20, 50, 100]).
На практике это означало: пайплайн брал S-learner, T-learner и X-learner и учил их на 20, 50 и 100 признаках, по 5 минут на итерацию. Но X-learner обучает 4 модели, а S-learner — только одну. Очевидно, X-learner’у нужно больше времени, а признаков, возможно, стоит дать меньше, чтобы избежать переобучения.
Теперь параметры feature_nums и timeout_estimator можно задавать в виде словаря, где ключи — названия моделей. Это позволяет точно настроить пайплайн под сложность алгоритмов. Ключи должны совпадать с именами классов в classes_for_train.
Трекинг переобучения
Теперь при подборе гиперпараметров пайплайн учитывает штраф за переобучение. Функция оценивает разницу метрик между трейном и валидацией. Модели, сильнее подогнавшиеся под обучающую выборку, оказываются ниже в итоговом рейтинге.
Режимы обучения
Иногда данных много — и хочется выжать максимум качества. Иногда выборка небольшая — и нужно быстро проверить гипотезу.
Для этого добавлен параметр training_mode, управляющий «силой» подбора гиперпараметров. Доступны три режима: light, medium, hard. Чем тяжелее режим, тем шире сетка параметров для Optuna и дольше обучение.
Теперь конфиг запуска pipeline.run() может выглядеть так:
Анализируем модели как профи
Это, пожалуй, самый важный блок изменений. Обучить модель — полдела. Сложнее доказать бизнесу, что она работает и принесёт деньги. Теперь из анализа в AUF можно получить больше полезной информации для планирования маркетинговой кампании.
Расширенный uplift_by_percentile
Если вы работали с scikit-uplift, вы знаете функцию uplift_by_percentile. Она делит выборку на бакеты (обычно 10) по убыванию предсказанного аплифта и показывает метрики в каждом.
Мы расширили эту таблицу: теперь в ней два новых столбца — процент целевых действий в контрольной и целевой группах в каждом бакете.
Зачем? Представьте: верхний бакет (клиенты с высоким аплифтом) содержит 60% всех органических сделок — тех, что произошли бы и без коммуникации. Возможно, их лучше оставить в покое, чтобы не рисковать лояльностью.
Эта информация теперь выводится накопительным итогом по нескольким порогам — в виде таблицы и наглядного графика по всей выборке.
Анализ чувствительности top vs bottom
Ещё один важный инструмент — график конверсий в контрольной и целевой группах, выбранных по модели. Он строится так: берём X% клиентов с наибольшим прогнозным аплифтом (top, кому отправим коммуникацию) и сравниваем с остальными (bottom, кому не отправим).
График наглядно показывает, насколько сегмент чувствителен к коммуникации по сравнению с остальной базой. Часто именно он становится доказательством для бизнеса: «Насколько вырастет конверсия, если мы возьмём этот топ-сегмент, а не случайных людей?»
Сравнение с моделью склонности
Этот пункт особенно важен. Модель склонности — бейзлайн в uplift-моделировании. Если её метрики не сильно хуже, можно избежать сложностей с пилотами и мониторингом.
В AUF появилось несколько способов сравнить аплифт-модель с моделью склонности:
- ROC AUC на тестовой выборке. Позволяет оценить аплифт-модель как модель склонности: для ранжирования используется сам аплифт, а не его компоненты. Модель склонности при этом обучать не нужно. Так можно понять, насколько аплифт-модель обусловлена склонностью.
- Корреляции (Пирсона, Спирмена, Кендалла). Быстрый, численный и интерпретируемый способ сравнить скоры двух моделей.
- Scatter plot. Если чисел недостаточно — можно визуально оценить распределение прогнозов. В идеале одинаково склонные клиенты должны по-разному реагировать на воздействие.
- Таблица метрик. Для модели склонности теперь доступна таблица метрик в том же формате, что и для аплифт-модели.
Аналитика вне pipeline
Пользователи AUF в Альфа-Банке часто спрашивали: как воспроизвести аналитику пайплайна, но вне его?
Теперь можно! Функция evaluate позволяет провести анализ любой модели на любой выборке любым доступным в AUF способом.
Больше не нужно изучать внутренние методы отрисовки. Достаточно вызвать одну функцию, указав модель, выборку и тип аналитики.
Результат — пара таблиц с метриками.
Архитектурные изменения
На этом описание продуктовых нововведений заканчивается. Но за год мы не только добавляли фичи, но и переписывали существующее. Эти изменения не видны при вызове pipeline.run(), но делают библиотеку стабильнее и удобнее для развития.
Докстринги везде
Теперь каждый модуль, класс, метод и функция имеют подробную docstring. Там — описание параметров, возвращаемых значений и примеры использования. Пользоваться библиотекой стало проще: IDE сама подсказывает, какой формат данных ожидает метод. Не нужно лезть в исходники.
Рефакторинг оптимизатора
Оптимизатор (на базе Optuna) пережил перестройку. Теперь у него всего три objective-функции: для модели склонности, для аплифт с бинарным воздействием и для аплифт с несколькими воздействиями. Код генерации моделей и сеток параметров стал модульным.
Рефакторинг класса модели и инференса
Мы полностью переработали базовый класс модели. Теперь он:
- Хранит все группы воздействий в случае мультитритмента — чтобы правильно считать предикты.
- Содержит препроцессор данных — можно скорить сырые данные без ручной подготовки. <3>Имеет единую логику
predict, которая сама определяет, какую модель вызывать. Использование S-, T- и мультитритмент-моделей стало унифицировано.<4>Добавлен специальный класс для инференса модели напрямую из MLflow — для удобства в проде.Кроме того, мы удалили устаревшие метрики и дефолтные модели без подбора гиперпараметров — на практике все используют run с Optuna. Библиотека стала строже, понятнее и полностью готова к production.
Заключение
За год AUF прошёл путь от экспериментального инструмента до зрелой библиотеки, работающей в проде и приносящей деньги. Мы добавили поддержку мультитритмента, научили пайплайн гибко настраивать обучение, расширили аналитику и навели порядок под капотом.
Но главное — доказали, что AutoML в uplift-моделировании работает. Он не заменяет дата-саентиста, но забирает на себя рутину, освобождая время для гипотез и общения с бизнесом. В связке с инфраструктурой позволяет моделям переобучаться в проде без участия человека.
Что дальше?
- Попробуйте AUF в своих задачах. Установка:
pip install aufв окружении с Python 3.8. - Изучите пример. Мы обновили ноутбук и выложили его на GitHub — можно пощупать новые фичи на открытых данных прямо в браузере.
- Ставьте звёздочки и контрибьютьте. Исходный код на GitHub. Нашли баг или хотите добавить фичу? Ждём pull requests.
- Делитесь опытом. Пишите вопросы и идеи в комментариях. Если знаете свежие научные статьи или доклады по мультитритменту — делитесь ссылками! Это поможет сделать инструмент лучше.
До встречи в комментариях! 🐺