Волков бояться — uplift в прод не катить, или AUF 2.0

Волков бояться — uplift в прод не катить, или AUF 2.0

Всем привет! Меня зовут Мельников Виктор, я 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 появилось несколько способов сравнить аплифт-модель с моделью склонности:

  1. ROC AUC на тестовой выборке. Позволяет оценить аплифт-модель как модель склонности: для ранжирования используется сам аплифт, а не его компоненты. Модель склонности при этом обучать не нужно. Так можно понять, насколько аплифт-модель обусловлена склонностью.
  2. Корреляции (Пирсона, Спирмена, Кендалла). Быстрый, численный и интерпретируемый способ сравнить скоры двух моделей.
  3. Scatter plot. Если чисел недостаточно — можно визуально оценить распределение прогнозов. В идеале одинаково склонные клиенты должны по-разному реагировать на воздействие.
  4. Таблица метрик. Для модели склонности теперь доступна таблица метрик в том же формате, что и для аплифт-модели.

Аналитика вне pipeline

Пользователи AUF в Альфа-Банке часто спрашивали: как воспроизвести аналитику пайплайна, но вне его?

Теперь можно! Функция evaluate позволяет провести анализ любой модели на любой выборке любым доступным в AUF способом.

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

Результат — пара таблиц с метриками.

Архитектурные изменения

На этом описание продуктовых нововведений заканчивается. Но за год мы не только добавляли фичи, но и переписывали существующее. Эти изменения не видны при вызове pipeline.run(), но делают библиотеку стабильнее и удобнее для развития.

Докстринги везде

Теперь каждый модуль, класс, метод и функция имеют подробную docstring. Там — описание параметров, возвращаемых значений и примеры использования. Пользоваться библиотекой стало проще: IDE сама подсказывает, какой формат данных ожидает метод. Не нужно лезть в исходники.

Рефакторинг оптимизатора

Оптимизатор (на базе Optuna) пережил перестройку. Теперь у него всего три objective-функции: для модели склонности, для аплифт с бинарным воздействием и для аплифт с несколькими воздействиями. Код генерации моделей и сеток параметров стал модульным.

Рефакторинг класса модели и инференса

Мы полностью переработали базовый класс модели. Теперь он:

  1. Хранит все группы воздействий в случае мультитритмента — чтобы правильно считать предикты.
  2. Содержит препроцессор данных — можно скорить сырые данные без ручной подготовки.
  3. <3>Имеет единую логику predict, которая сама определяет, какую модель вызывать. Использование S-, T- и мультитритмент-моделей стало унифицировано.<4>Добавлен специальный класс для инференса модели напрямую из MLflow — для удобства в проде.

Кроме того, мы удалили устаревшие метрики и дефолтные модели без подбора гиперпараметров — на практике все используют run с Optuna. Библиотека стала строже, понятнее и полностью готова к production.

Заключение

За год AUF прошёл путь от экспериментального инструмента до зрелой библиотеки, работающей в проде и приносящей деньги. Мы добавили поддержку мультитритмента, научили пайплайн гибко настраивать обучение, расширили аналитику и навели порядок под капотом.

Но главное — доказали, что AutoML в uplift-моделировании работает. Он не заменяет дата-саентиста, но забирает на себя рутину, освобождая время для гипотез и общения с бизнесом. В связке с инфраструктурой позволяет моделям переобучаться в проде без участия человека.

Что дальше?

  1. Попробуйте AUF в своих задачах. Установка: pip install auf в окружении с Python 3.8.
  2. Изучите пример. Мы обновили ноутбук и выложили его на GitHub — можно пощупать новые фичи на открытых данных прямо в браузере.
  3. Ставьте звёздочки и контрибьютьте. Исходный код на GitHub. Нашли баг или хотите добавить фичу? Ждём pull requests.
  4. Делитесь опытом. Пишите вопросы и идеи в комментариях. Если знаете свежие научные статьи или доклады по мультитритменту — делитесь ссылками! Это поможет сделать инструмент лучше.

До встречи в комментариях! 🐺

Читать оригинал