Sobes.tech
Back to questions
Senior
10

Какие метрики оценки uplift-моделей (Qini, uplift curve)?

Companies where asked
Yandex Research
X5 techX5 tech
Тинькофф

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

Для uplift-моделей важна не просто точность предсказания, а способность правильно ранжировать пользователей по приросту от воздействия. Обычно ожидают упоминания uplift curve, Qini curve и Qini coefficient как основных метрик. Хороший ответ должен показать понимание, что сравнение идет с базовой линией случайного назначения и что метрики оценивают прирост, а не абсолютный отклик.

Определение:

Uplift-метрики измеряют, насколько хорошо модель находит пользователей, для которых воздействие действительно меняет вероятность целевого действия.
Uplift curve показывает накопленный прирост эффекта при последовательном выборе пользователей в порядке убывания предсказанного uplift.
Qini curve — это частный и более популярный вариант uplift curve, где сравнивается накопленный отклик в treatment-группе с ожидаемым откликом по контрольной группе.
Qini coefficient — площадь между Qini curve и базовой линией; чем она больше, тем лучше модель отделяет “согласных” на влияние от тех, кто и так бы совершил действие или не реагирует вовсе.

Пример использования:

Например, у банка есть модель, которая оценивает, кому отправить предложение о кредите. Модель сортирует клиентов по предсказанному uplift, и маркетинг сначала отправляет оффер верхним 10% клиентов. Если uplift curve быстро растет в начале, значит модель хорошо находит сегмент, где предложение реально увеличивает конверсию.

# Упрощенный пример вычисления uplift curve по бинам
# y: факт целевого действия (0/1)
# t: treatment (1 - получил воздействие, 0 - контроль)
# uplift_score: предсказанный uplift

import pandas as pd

df = pd.DataFrame({
    "y": [1, 0, 1, 0, 1, 0, 0, 1],
    "t": [1, 1, 0, 0, 1, 0, 1, 0],
    "uplift_score": [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2]
})

df = df.sort_values("uplift_score", ascending=False)
df["bin"] = pd.qcut(range(len(df)), 4, labels=False)

stats = df.groupby("bin").apply(
    lambda g: pd.Series({
        "t_rate": g.loc[g.t == 1, "y"].mean() if (g.t == 1).any() else 0,
        "c_rate": g.loc[g.t == 0, "y"].mean() if (g.t == 0).any() else 0,
        "uplift": (g.loc[g.t == 1, "y"].mean() if (g.t == 1).any() else 0) -
                  (g.loc[g.t == 0, "y"].mean() if (g.t == 0).any() else 0)
    })
)

print(stats)

Пояснение кода:

Код не является обязательным для понимания метрик, но пример показывает идею на практике. Сначала объекты сортируются по uplift_score от самых перспективных к менее перспективным. Затем выборка делится на бины, и для каждого бина считается доля целевого действия в treatment и control. Разница этих долей дает локальный uplift, а его накопление по бинам используется для построения uplift curve или Qini curve.

Ключевые моменты:

  • Uplift-модель оценивают не по ROC-AUC, а по качеству ранжирования инкрементального эффекта.
  • Uplift curve показывает накопленный прирост эффекта по мере охвата аудитории.
  • Qini curve — один из стандартов оценки uplift, особенно в маркетинге и таргетинге.
  • Qini coefficient — площадь между Qini curve и baseline; чем выше, тем лучше.
  • Важна корректная экспериментальная схема: нужны treatment и control группы, желательно рандомизированные.
  • Если данные смещены, uplift-метрики могут быть искажены, поэтому качество эксперимента критично.