Привет, Хабр!
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: в каталоге можно посмотреть список всех программ, а в календаре — записаться на открытые уроки.
marks
Хабрапостерам на заметку! Если постить по 10 подобных заметок в день, и каждая наберет по 1 баллу рейтинга, то будет 10 баллов в день! А вы всего 4-5 в день публикуете.