Привет, Хабр!

Uplift-моделирование — это метод оценки эффекта от воздействия, который использует алгоритмы ML для предсказания изменения вероятности интересуемого события под влиянием этого воздействия. Зачастую цель Uplift заключается в выявление тех клиентов, которые с наибольшей вероятностью изменят своё поведение в желаемую сторону в ответ на предложение.

Uplift-модели считают разницу между вероятностями наступления события в обработанной и контрольной группах. С ними можно предсказать результат и определить, был ли он действительно вызван проведенной кампанией.

Основные подходы к Uplift-моделированию

T-Learner

T-Learner, или Two-model learner метод включает в себя обучение двух отдельных моделей ML: одна для обработанной группы и одна для контрольной группы. Затем разница в прогнозах этих двух моделей используется для оценки CATE, который показывает, как изменится результат в зависимости от применения или не применения воздействия.

Реализуем с помощью LightGBM. Создадим две модели: одна для обучения на данных с воздействием, другая — на контрольных данных. С функциями LightGBM можно установить различные параметры, типо количества итераций, количества листьев в деревьях, функцию потерь и др. После тренировки моделей, они применяются к тестовым данным для прогнозирования и последующего расчета uplift как разницы между прогнозами обеих моделей.

from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split

# загрузим данные
X_train, X_test, y_train, y_test, treatment_train, treatment_test = load_your_data()

# определим и обучим модель для обработанной группы
treatment_model = LGBMClassifier().fit(X_train[treatment_train == 1], y_train[treatment_train == 1])

# определим и обучим модели для контрольной группы
control_model = LGBMClassifier().fit(X_train[treatment_train == 0], y_train[treatment_train == 0])

# прогнозирование
treatment_preds = treatment_model.predict_proba(X_test)[:, 1]
control_preds = control_model.predict_proba(X_test)[:, 1]

# расчет uplift
uplift = treatment_preds - control_preds

X-Learner

Основная идея X-Learner заключается в двухэтапном процессе, где сначала обучаются две модели: одна на контрольной группе, другая на обработанной группе. Затем вычисляются "импутированные" эффекты лечения, которые используются для обучения второго ряда моделей для оценки CATE.

Представим, что компания проводит маркетинговую кампанию и хочет оценить, как различные виды воздействия влияют на вероятность покупки у разных клиентов. Используя X-Learner, можно было бы оценить, какой тип сообщения наиболее лучше для различных сегментов клиентов на основе их характеристик.

Можно реализовать в Питоне с помощью библиотеки CausalML:

from causalml.inference.meta import BaseXRegressor
from xgboost import XGBRegressor
from sklearn.model_selection import train_test_split
import pandas as pd

# данные
df = pd.read_csv('path_to_data.csv')
X = df.drop(['outcome', 'treatment_indicator'], axis=1)
y = df['outcome']
treatment = df['treatment_indicator']

# разбиение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test, treatment_train, treatment_test = train_test_split(X, y, treatment, test_size=0.2, random_state=42)

# инициализация и обучение X-Learner
x_learner = BaseXRegressor(learner=XGBRegressor(max_depth=4, learning_rate=0.1, n_estimators=100))
x_learner.fit(X=X_train, treatment=treatment_train, y=y_train)

# оценка CATE
cate_estimates = x_learner.predict(X_test)

S-learner

S-learner представляет собой подход, в котором используется единая модель ML для оценки воздействия на основе всех доступных данных, включая информацию о том, подвергался ли объект воздействию или нет. Это достигается путем добавления переменной воздействия как доп. признака в данные.

В scikit-uplift есть SoloModel и с ним можно легко интегрировать этот подход. В качестве оценщика может использоваться любой классификатор CatBoostClassifier, который поддерживает параметры verbose и random_state.

from sklift.models import SoloModel
from catboost import CatBoostClassifier

model = SoloModel(CatBoostClassifier(verbose=100, random_state=777))

model.fit(X_train, y_train, treatment_train, estimator_fit_params={'plot': True})

uplift = model.predict(X_val)

X_train, y_train, treatment_train и X_val представляют собой тренировочные и валидационные наборы данных.

Параметр plot=True в estimator_fit_params позволяет визуализировать процесс обучения.

Методы, основанные на преобразовании классов

Метод преобразования классов представляет собой подход, при котором целевая переменная трансформируется таким образом, чтобы упростить задачу моделирования и применить стандартные методы ML для классификации. Фича метода заключается в том, что он переопределяет целевую переменную, позволяя модели предсказать изменённую цель, которая отражает воздействие интервенции.

Метод основан на создании новой целевой переменной Z, которая определяется следующим образом:

Z_i = Y_i \times W_i + (1 - Y_i) \times (1 - W_i)

где:

  • Yi — исходный ответ (например, совершил ли юзер покупку),

  • Wi — бинарный индикатор воздействия (например, получил ли юзер рекламное сообщение).

Значение Zi равно 1, если юзер отреагировал на воздействие так же, как и ожидалось, и 0 в противном случае.

Можно реализовать с scikit-uplift и классификатором CatBoostClassifier:

from sklift.models import ClassTransformation
from catboost import CatBoostClassifier
import pandas as pd
import numpy as np

# предполагаем, что X_train, y_train, treat_train и X_val уже загружены

# создадим и настроим модельку
ct_model = ClassTransformation(CatBoostClassifier(verbose=100, random_state=42))

# обучим модельку
ct_model.fit(X_train, y_train, treat_train)

# предскажим uplift
uplift_predictions = ct_model.predict(X_val)

К слову, метод преобразования классов предполагает, что обработанные и контрольные группы сбалансированы.

Метрики

Среди наиболее юзабельных метрик:

  1. Uplift@k - измеряет эффективность модели по достижению улучшения в верхней части списка ранжирования, которое часто используют для оценки кампаний с ограниченным бюджетом.

  2. AUUC - это общая мера качества модели, которая показывает, насколько хорошо модель отделяет "леченные" и "не леченные" объекты по всей выборке.

  3. AUQC - аналогична AUUC, но применяется для оценки качества модели в контексте конкретной рекламной кампании, показывая, как модель способствует увеличению конверсии.

Пример вычисления метрик на T-learner с использованием scikit-uplift:

from sklift.metrics import qini_auc_score, uplift_at_k
from sklift.models import TwoModels
from catboost import CatBoostClassifier

# подготовка данных: X_train, y_train, treat_train, X_test, y_test
model_treat = CatBoostClassifier(iterations=100, learning_rate=0.1, random_state=42)
model_control = CatBoostClassifier(iterations=100, learning_rate=0.1, random_state=42)

# инициализация T-Learner
tm = TwoModels(estimator_trmnt=model_treat, estimator_ctrl=model_control, method='vanilla')

# обучение модели
tm = tm.fit(X_train, y_train, treat_train)

# предсказание
uplift_tm = tm.predict(X_test)

# вычисление метрик
uplift_auc_score = qini_auc_score(y_test, uplift_tm, treat_test)
uplift_score_at_30 = uplift_at_k(y_test, uplift_tm, treat_test, strategy='by_group', k=0.3)

print(f"Qini AUC score: {uplift_auc_score}")
print(f"Uplift at 30%: {uplift_score_at_30}")

Рассчитали AUUC и Uplift@k, которые показывают общую эффективность модели и ее способность улучшать результаты на "верхнем срезе" данных.


Все актуальные методы и инструменты DS и ML можно освоить на онлайн-курсах OTUS: в каталоге можно посмотреть список всех программ, а в календаре — записаться на открытые уроки.

Комментарии (1)


  1. marks
    04.05.2024 12:40

    Хабрапостерам на заметку! Если постить по 10 подобных заметок в день, и каждая наберет по 1 баллу рейтинга, то будет 10 баллов в день! А вы всего 4-5 в день публикуете.