MR-Uplift: множественные ответы в моделях Uplift

Введение

В Ibotta мы построили и развернули несколько моделей подъема за последние несколько лет. Ранее мы описывали некоторые теоретические наработки и практические советы в блогах. В них мы обсуждали, как оценивать их, как можно использовать конкретные функции потерь для их оценки и как оценивать компромиссы между несколькими переменными отклика.

Обладая этими с трудом заработанными знаниями и достижениями в оценке и оценке, мы решили открыть исходный код пакета на Python под названием MR-Uplift.

В этом посте будет рассказано о том, что этот пакет может делать и как он может быть полезным дополнением к существующим там пакетам. Представлен пример и предоставлены дополнительные ресурсы.

Пакетные предложения

Моделирование роста (также известное как гетерогенные или индивидуальные эффекты лечения) - это ветвь машинного обучения, которая изучает причинно-следственную связь между лечением t и конкретной реакцией y для индивидуума x. Примером может служить будущая деятельность конкретного человека, получившего конкретную рекламу.

Несмотря на то, что существует несколько пакетов для построения моделей повышения (см. GRF и Причинное дерево), они, как правило, полагаются на один вариант лечения и один вариант ответа. Как правило, они не дают оценок того, как модель будет работать в производстве. Кроме того, нет поддержки для оценки компромиссов между несколькими переменными ответа.

Этот пакет пытается создать автоматизированное решение для моделирования подъемов, которое удовлетворяет потребности сценариев использования Ibotta со следующими функциями:

  1. MR-Uplift позволяет проводить несколько процедур. Это означает, что пользователь может ввести в модель произвольное количество обработок (а не только обычную двоичную переменную). Кроме того, для каждого лечения можно добавить мета-функции. Например, конкретное лечение может иметь несколько общих черт с другими видами лечения. Вместо создания фиктивного индикатора для каждого лечения пользователь может создать вектор категориальных или непрерывных переменных для представления лечения. Указание переменной лечения таким образом позволяет модели учитывать сходство между видами лечения.
  2. Немногие текущие пакеты дают вневыборочные (OOS) оценки ожидаемой производительности модели, если она была развернута в производственной среде. MR-Uplift позволяет оценить это с помощью метрики ERUPT. Этот показатель рассчитывает ожидаемый ответ, если модель была дана среднему пользователю.
  3. Поддержка множественных ответов. Это, пожалуй, самая уникальная особенность этого пакета (и причина его нынешнего названия). Вместо одного ответа у модели есть возможность построить модель с несколькими выходами. Таким образом, можно оценить компромиссы между переменными отклика. Мы обнаружили, что это полезный инструмент для определения того, какие возможности нам доступны и какую целевую функцию использовать в производственной среде.

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

Одним из особых недостатков этой работы является то, что она не измеряет эффект лечения напрямую, как Причинное дерево. Расширение модели для включения более конкретных функций потерь может привести к повышению производительности. Кроме того, предполагается, что существует случайное контрольное испытание для данных лечения, поскольку в настоящее время нет поддержки для оценки эффектов лечения на основе данных наблюдений.

Быстрый пример

Если вы новичок в моделях аплифта, я предлагаю просмотреть примеры, предоставленные в репо. Ниже приведен пример, который генерирует данные, строит модель и оценивает компромиссы. Пожалуйста, см. Этот блокнот для более подробной информации об этом гипотетическом примере.

Предположим, мы маркетологи в компании, которая хотела бы увеличить доход пользователей с помощью рекламы (известной как лечение). Данные состоят из случайно назначенной переменной обработки с четырьмя переменными отклика для каждого пользователя: доход, стоимость, прибыль и переменная случайного шума. Обработка увеличивает доход пользователей, но за счет затрат, которые являются функциями объясняющих переменных. Мы заинтересованы в оценке возможных компромиссов переменных отклика, доступных для бизнеса. Ниже приведен код, который генерирует данные и строит модель.

y, x и t - это переменные ответа, объяснения и лечения соответственно. Обратите внимание, что предполагается, что каждый из них имеет числовой тип (для категориальных переменных требуется однократное кодирование), но может иметь ширину в несколько столбцов.

import numpy as np
import pandas as pd

from dataset.data_simulation import get_simple_uplift_data
from mr_uplift.mr_uplift import MRUplift

#Generate Data
y, x, t = get_simple_uplift_data(10000)
y = pd.DataFrame(y)
y.columns = ['revenue','cost', 'noise']
y['profit'] = y['revenue'] - y['cost']
#Build / Gridsearch model
uplift_model = MRUplift()
param_grid = dict(num_nodes=[8], 
             dropout=[.1, .5], 
             activation=['relu'], 
             num_layers=[1, 2], 
             epochs=[25], 
             batch_size=[30])
uplift_model.fit(x, y, t.reshape(-1,1), param_grid = param_grid, n_jobs = 1)

Это автоматически применяет разделение поездов / тестов, применяет шкалу z ко всем переменным и строит нейронную сеть с несколькими выходами в форме y~f(t,x).

Чтобы увидеть, как модель работает и какие компромиссы доступны для бизнеса, разработчик моделей может применить функцию get_erupt_curves() для получения кривых ERUPT вне выборки. Они оценивают компромиссы, применяя различные веса к каждому из предсказанных ответов и вычисляя соответствующие ожидаемые ответы.

Например, предположим, что у нас есть вес β и целевая функция β*revenue-(1-β)*costs. Вес β=1 соответствует максимизации дохода, β=0 минимизации затрат, а β=.5 максимизации прибыли. Ниже показан код и график ожидаемых ответов при различных весах β.

erupt_curves, dists = uplift_model.get_erupt_curves()

Выше представлены кривые ERUPT, которые изменяют целевую функцию от минимизации затрат до максимизации дохода. По мере увеличения веса β увеличиваются расходы и доходы.

Обратите внимание, что шумовая реакция остается примерно около нуля, что имеет смысл, поскольку обработка не влияет на нее. Также обратите внимание, что ответ о прибыли показывает максимум на уровне β=.5, как и ожидалось.

Также существует «случайная» кривая распределения. Это «перемешивает» оптимальное лечение, а затем вычисляет ERUPT. Сравнение «модельной» линии с «случайной» линией показывает, насколько хорошо модель распределяет лечение на индивидуальном уровне.

На практике я нашел эти диаграммы полезными при принятии решения о возможных компромиссах. Заинтересованные стороны могут заранее не знать, какие относительные компромиссы должны быть между более неоднозначными показателями ответа. Эти диаграммы отображают доступные варианты для заинтересованных сторон и устанавливают ожидания относительно того, чего модель может и чего не может достичь в производстве.

Начало работы

Чтобы начать работу с MR-Uplift, ознакомьтесь с репозиторием github и примерами или pip install mr_uplift. Пожалуйста, сообщайте о любых проблемах, если вы их обнаружите. Более того, вы можете внести свой вклад, если у вас есть идеи, которые вы хотите реализовать.