Uplift-моделирование: индивидуальный эффект воздействия
Что такое uplift-моделирование
В классическом A/B-тесте мы считаем средний эффект воздействия (ATE — Average Treatment Effect): на сколько в среднем выросла метрика у тестовой группы по сравнению с контрольной. Но «в среднем» — это ловушка. Представьте: вы запустили скидку 20%, ATE показывает +5% к конверсии. Звучит хорошо. Но кто-то и так бы купил без скидки, кто-то не купит даже с ней, а кого-то скидка раздражает. Средний эффект — это сумма этих разнонаправленных поведений.
Uplift-моделирование (uplift model, incremental model) решает другую задачу: предсказать индивидуальный эффект воздействия для каждого пользователя. Не «скидка в среднем работает», а «этому конкретному пользователю скидка увеличит вероятность покупки на 12%, а вот этому — уменьшит на 3%».
Почему средний эффект — не всегда то, что нужно
ATE полезен для принятия решения «раскатывать фичу или нет». Но для таргетирования — бесполезен.
Примеры, где ATE недостаточен:
- Промокоды. Рассылать всем — дорого. Нужно найти тех, кто купит только из-за промокода.
- Push-уведомления. Часть пользователей раздражают пуши, и они отключают уведомления или удаляют приложение.
- Кредитные предложения. Банку нужно предлагать кредит тем, кто возьмёт его именно благодаря предложению, а не тем, кто и так пришёл бы.
Для этих задач нужен не ATE, а CATE (Conditional Average Treatment Effect) — эффект воздействия, условный на характеристики пользователя.
Четыре типа пользователей
В uplift-моделировании выделяют четыре группы (классификация Radcliffe & Surry):
| Тип | Без воздействия | С воздействием | Стратегия |
|---|---|---|---|
| Persuadables | Не купят | Купят | Таргетировать |
| Sure things | Купят | Купят | Не тратить ресурсы |
| Lost causes | Не купят | Не купят | Не тратить ресурсы |
| Sleeping dogs | Купят | Не купят | Избегать воздействия |
Persuadables — единственная группа, на которую стоит тратить маркетинговый бюджет. Sure things купят и так. Lost causes не купят ни при каком воздействии. А Sleeping dogs — самая коварная группа: воздействие им вредит. Если отправить им пуш, они могут отписаться.
Uplift-модель пытается отличить persuadables от остальных.
Подходы к uplift-моделированию
S-learner (Single model)
Самый простой подход. Обучаем одну модель, в которую добавляем признак treatment (0/1) как обычную фичу.
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier
# X — признаки пользователя + treatment flag
# y — целевое действие (купил/не купил)
model = GradientBoostingClassifier()
model.fit(X_train, y_train)
# Предсказываем uplift как разницу
X_test_treat = X_test.copy()
X_test_treat['treatment'] = 1
X_test_control = X_test.copy()
X_test_control['treatment'] = 0
uplift = model.predict_proba(X_test_treat)[:, 1] - model.predict_proba(X_test_control)[:, 1]Плюс: просто реализовать. Минус: модель может игнорировать treatment-признак, если он слабо коррелирует с таргетом.
T-learner (Two models)
Обучаем две отдельные модели: одну на контрольной группе, другую на тестовой. Uplift — разница предсказаний.
from sklearn.ensemble import GradientBoostingClassifier
# Разделяем данные
treat_mask = df['treatment'] == 1
X_treat, y_treat = X[treat_mask], y[treat_mask]
X_control, y_control = X[~treat_mask], y[~treat_mask]
# Две модели
model_treat = GradientBoostingClassifier().fit(X_treat, y_treat)
model_control = GradientBoostingClassifier().fit(X_control, y_control)
# Uplift = P(Y=1|T=1) - P(Y=1|T=0)
uplift = (model_treat.predict_proba(X_test)[:, 1]
- model_control.predict_proba(X_test)[:, 1])Плюс: модели специализируются на своей группе. Минус: каждая модель обучается на половине данных — может не хватить объёма.
X-learner
Улучшение T-learner. На первом этапе обучаем две модели (как T-learner). На втором — оцениваем индивидуальный эффект для каждого наблюдения и строим модель uplift на этих оценках. Работает лучше, когда группы сильно различаются по размеру (например, treatment 5%, control 95%).
На практике X-learner даёт лучшие результаты в задачах с малым treatment-трафиком — а это типичная ситуация для маркетинговых кампаний.
Как оценить качество uplift-модели
С uplift-моделями есть фундаментальная проблема: для каждого пользователя мы наблюдаем только один исход — либо с воздействием, либо без. Истинный uplift для конкретного человека неизвестен.
Основные метрики:
- Uplift curve — аналог ROC-кривой. Сортируем пользователей по предсказанному uplift, применяем воздействие к топ-N% и смотрим, как растёт эффект.
- AUUC (Area Under Uplift Curve) — площадь под uplift-кривой. Чем больше, тем лучше модель отделяет persuadables.
- Qini curve / Qini coefficient — вариант uplift curve с поправкой на размер групп.
Практические применения
Uplift-моделирование активно используют в:
- E-commerce: таргетирование промо-акций и купонов. Ozon, Wildberries, Lamoda — у всех есть задачи на персонализацию скидок.
- Банки: предодобренные кредитные предложения, кросс-продажи.
- Мобильные приложения: сегментация для push-уведомлений — отправлять пуши только тем, кто отреагирует позитивно.
- Retention: определить пользователей, которых ещё можно удержать (persuadables), и не тратить ресурсы на тех, кто уйдёт в любом случае (lost causes).
В байесовском подходе к A/B-тестам uplift-моделирование естественным образом дополняет анализ: вместо точечной оценки ATE вы получаете распределение CATE для каждого сегмента.
Вопросы с собеседований
Чем uplift-моделирование отличается от обычной предиктивной модели?
Предиктивная модель предсказывает P(Y=1) — вероятность целевого действия. Uplift-модель предсказывает P(Y=1|T=1) - P(Y=1|T=0) — изменение вероятности из-за воздействия. Пользователь с высоким P(Y=1) может быть sure thing и не нуждается в промо.
Как бы вы использовали uplift-модель для оптимизации push-рассылок?
Обучил бы модель на данных A/B-теста, где часть пользователей получала пуш, а часть нет. Предсказал бы uplift для всех пользователей. Рассылал бы пуши только пользователям с положительным uplift выше порога. Sleeping dogs (отрицательный uplift) получали бы альтернативный канал коммуникации или не получали бы ничего.
Что такое CATE и чем он отличается от ATE?
ATE — средний эффект по всей популяции. CATE — средний эффект для подгруппы с определёнными характеристиками (возраст, активность, город). CATE позволяет персонализировать воздействие. На практике CATE оценивают с помощью CUPED для повышения точности или через uplift-модели для персонализации.
Как валидировать uplift-модель, если мы не знаем истинный uplift?
Используем uplift curve: сортируем пользователей по предсказанному uplift, последовательно «включаем» воздействие для топ-N% и считаем инкрементальный эффект на реальных данных A/B-теста. Хорошая модель должна показывать, что включение воздействия для топ-20% даёт бОльший эффект, чем для случайных 20%.
FAQ
Нужен ли A/B-тест для uplift-моделирования?
Да. Uplift-модель обучается на данных рандомизированного эксперимента, где есть treatment и control группы. Без рандомизации невозможно корректно оценить причинно-следственный эффект — будет смещение из-за confounders.
Какие библиотеки Python поддерживают uplift-моделирование?
Основные: causalml (Uber), pylift (Wayfair), scikit-uplift. Библиотека causalml наиболее зрелая — включает S/T/X-learner, uplift trees и инструменты визуализации.
Когда uplift-моделирование не нужно?
Когда воздействие бесплатное и не может навредить. Если отправка push-уведомления ничего не стоит и не раздражает пользователей — можно отправлять всем. Но в реальности воздействие почти всегда имеет стоимость (деньги, внимание, риск оттока), поэтому uplift полезен.
Потренируйте вопросы по A/B-тестам и статистике на реальных задачах — откройте тренажёр. 1500+ вопросов, которые спрашивают на собеседованиях аналитика. Бесплатно.