Uplift моделирование или как раздать скидки на шашлык



🍭 Зачем это нужно

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

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

Примерно с тем же постоянством, с которым uplift используется в индустрии и в продакшене, он игнорируется в курсах по ML.



🏋️Как построить модель

Сначала проведем эксперимент: случайной части людей дадим скидку 10%, а другим покажем прежнюю цену. Далее, как обычно, обучим модель на признаках пользователя предсказывать, купит ли он наш шашлык, но к фичам добавляем еще и наличие скидки. Далее для каждого пользователя предсказываем вероятность купить товар, добавляя фичу, соотвествующую наличию скидки. Также считаем вероятность купить товар, добавив фичу, показывающую, что скиду этот пользователь не получил. Из первой вероятности (купить товар при наличии скидки) вычитаем вторую вероятность (купить товар без скидки). Это и есть наше значение uplift, чем оно больше, тем выгодней давать клиенту скидку.



Наверное многих заинтересовал вопрос, почему скидка на шашлык именно 10%? Чтобы для каждого пользователя опредлить оптимальный размер скидки, мы можем раздавать в эксперименте разные значения скидок, обучать модель с фичой, соотвествующей не наличию, а размеру скидки, а далее считать вероятность купить товар для каждого размера скидки.



💃 Как раздать скидки по предсказанию модели

Допустим, пачка масок стоит 2000 рублей, мы провели эксперимент, в котором раздавали клиентам скидки 10%, 20% и 50%. Наша финальная задача: для каждого клиента сказать, какую скидку ему давать, и давать ли вообще. Также нужно сказать компании, сколько дополнительных денег наша скидочная кампания принесет в бюджет.

С помощью нашей модели посчитаем вероятности, купить товар для пользователя со скидкой и без.

Вероятности купить товар со скидкой 0%, 10%, 20% и 50% — p0, p10, p20 и p50 соответсвенно.

Цена товара без скидки, со скидкой 0%, 10%, 20% и 50% — 2000р, 1800р, 1600р и 1000р соответсвенно.

Нужно выбрать ту скидку, для которой итоговая цена минус себестоимость товара S, умноженная на вероятность купить товар максимальна: max_value = max((2000-S)*p0, (1800-S)*p10, (1600-S)*p20, (1000-S)*p50). Наш выигрыш с пользователя — это max_value - (2000-S)*p0.

Могут складываться ситуации, когда давать скидку не выгодно никогда, а также ситуации, когда всегда стоит давать максимальную скидку.



📚 Что почитать

Более подробное описание разных вариантов моделей

Пример кода для построения uplift модели