Привет, Хабр!
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, которая определяется следующим образом:
где:
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)
К слову, метод преобразования классов предполагает, что обработанные и контрольные группы сбалансированы.
Метрики
Среди наиболее юзабельных метрик:
Uplift@k - измеряет эффективность модели по достижению улучшения в верхней части списка ранжирования, которое часто используют для оценки кампаний с ограниченным бюджетом.
AUUC - это общая мера качества модели, которая показывает, насколько хорошо модель отделяет "леченные" и "не леченные" объекты по всей выборке.
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: в каталоге можно посмотреть список всех программ, а в календаре — записаться на открытые уроки.
