Условие
В мобильной игре после установки и запуска идёт туториал, состоящий из последовательных шагов. Данные — строки (user_id, datetime, step_number).
Гипотеза геймдизайнеров: если с высокой вероятностью предсказать шаг, на котором игрок уйдёт, и запустить альтернативное продолжение туториала с этого шага, мы избежим оттока и увеличим прохождение туториала.
Вопросы:
- Как бы вы решили задачу предсказания отвала игрока?
- Как оценить качество модели? Какой метод считаете оптимальным и почему?
- Опишите дизайн A/B-эксперимента для проверки гипотезы геймдизайнеров.
Решение
Подход
Это последовательная классификация: на каждом шаге туториала прогнозируем P(churn | history). Задача похожа на sequential models / survival analysis.
Ключевые моменты:
- Целевая переменная: «дошёл ли до следующего шага в течение Δt минут?». Нужен таймфрейм отсечки (5/15 минут).
- Features — последовательность шагов и время между ними.
- Очень несбалансированный класс: на первых шагах туториала уходят ~50% (стандартный D0 drop-off в мобайле), позже всё реже.
Реализация — задача предсказания
Признаки
| Группа | Примеры |
|---|---|
| Шаговые | step_number; время между шагами; число попыток на step_n; cumulative time |
| Пользовательские | source (organic/paid); platform; OS-version; geo |
| Поведенческие | число действий за last_minute; pause_count; UI-jitter (если логируется) |
| Сегментные | UTM, кампания UA, тип installation (re-install) |
Архитектура моделей
Baseline — LogReg / LightGBM на агрегированных признаках текущего шага. Простая, быстрая, объяснимая.
Sequential — LSTM / Transformer на последовательности (step_t, time_since_last_step_t). Лучше учитывает динамику, но дольше обучается, сложнее интерпретируется.
Survival analysis — Cox proportional hazards с time-varying covariates. Натурально для «когда уйдёт?».
Реализация — оценка качества
Метрики и почему:
| Метрика | Зачем |
|---|---|
| ROC-AUC | общая сепарабельность классов; устойчива к несбалансированности |
| PR-AUC | для редкого позитивного класса (на поздних шагах позитив = «не ушёл», class imbalance) |
| Recall на пороге precision = 0.5 | бизнес-сторона: сколько уходящих ловим, не теряя качество |
| Calibration | вероятности должны быть «честные» (если модель говорит 0.7, то в 70% случаев действительно уходят); важно для решений |
| Lift @ top 10% | экономика: на 10% «риск-уходящих» применяем альтернативный туториал — насколько они правда чаще уходят |
Оптимально: ROC-AUC (общий обзор) + PR-AUC (редкие классы) + lift @ top-10% для выбора порога. Calibration — для решений (Platt scaling / isotonic).
Валидация
- Time-based split: обучаемся на установках до даты X, валидируемся на установках после. Не random — это утечка.
- Cross-validation внутри train: time-series CV (rolling forecast).
- Out-of-sample test set: последний месяц установок не трогаем.
Реализация — A/B-тест гипотезы геймдизайнеров
Гипотеза: альтернативный туториал на «риск-шагах» снижает churn.
Дизайн:
- Юнит: новый игрок, sticky randomization.
- Группы:
- A (контроль): всем стандартный туториал.
- B (тест): модель на каждом шаге считает
P(churn). ЕслиP(churn) > τ— игрок видит альтернативный туториал; иначе — стандартный. - Альтернативно — третья группа
C: «всем альтернативный туториал», чтобы отделить эффект «модели угадала» от «альтернативный туториал просто лучше».
- Decision-метрика: % игроков, прошедших туториал полностью.
- Вторичные: D1, D7 retention; конверсия в первую покупку (туториал часто связан с активацией).
- Гарды: совокупное время в туториале (если альтернатива в 5 раз длиннее — UX-катастрофа); rage-quit (короткие сессии).
- Размер выборки: считаем по основной метрике (% прохождения), используя историческую дисперсию.
- Длительность: минимум 2 недели + время на «созревание» туториала (если игрок может вернуться через сутки).
Анализ результатов
- ITT (intention-to-treat) анализ: всем в группе B считаем эффект, даже если модель пометила их как low-risk и они получили стандартный.
- CACE (complier average causal effect): эффект только на тех, кто реально получил альтернативу.
- Сегментный анализ: модель могла работать только на одном сегменте (платформа/гео).
- Calibration check: верно ли P(churn) предсказывала риск.
Анализ / интерпретация
Если B побеждает A:
- Модель + альтернатива работают.
- Сравниваем с C — если C тоже побеждает A на всех, выгоднее всем дать альтернативу (модель не нужна).
- Если только на high-risk — modelled targeting корректен.
Если B не отличается от A:
- Возможно, модель плохо предсказывает (проверить calibration).
- Или альтернативный туториал не эффективнее.
- Или ушли «по другой причине» (UI bug, не туториал).
Подводные камни
- Утечка через
step_number: само значение шага — feature, и одновременно модель оптимизируется по нему. Без time-based split рискуем «подсмотреть будущее». - Class imbalance: на поздних шагах позитива (ушёл) мало → модель с трудом учится. Используйте
class_weightили focal loss. - Survivorship bias в обучающей выборке: учим на тех, кто хоть что-то сделал. Установки без events игроков отсутствуют.
- Предсказание на «уже ушедших»: если игрок не возвращается — это «правый цензор». Survival analysis правильно учитывает.
- A/B на модели: если модель сама часть treatment (т.е. на её основе показываем альтернативу), смешиваем «эффект модели» и «эффект альтернативы». Группа C — обязательна.
- Sample Ratio Mismatch, особенно если treatment-логика триггерится клиентом. Может оказаться, что половина устройств не загрузила модель.
- Длительность. Туториал — короткий, но «полное прохождение» и retention D7 — нужно ждать.
Альтернативы
- Causal inference на исторических данных (если уже выкатывали разные туториалы) — uplift modeling.
- Multi-armed bandit на 3–5 туториальных вариантах — оптимизирует пользу, но не даёт чёткой статвыводности.
Эталонный ответ
Модель: gradient boosting / LSTM на признаках (step, time-between-steps, install-source, platform). Метрики — ROC-AUC + PR-AUC + lift @ top-10% + calibration. Time-based split. A/B: 3 группы (контроль, модель + альтернатива на high-risk, альтернатива всем) с decision-метрикой «% прошедших туториал», ITT + CACE анализ, размер выборки рассчитан по исторической дисперсии. Главное в ответе — отделить «работает модель» от «работает альтернативный туториал».