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+ вопросов, которые спрашивают на собеседованиях аналитика. Бесплатно.