Собес в Ozon · Стажер Data Scientist (транзакционный антифрод, Ozon Банк)
Материал Эйч · Опубликовано 27 октября 2026
Обзор
Стажировка в команде транзакционного антифрода: данные, модели, метрики бизнеса и вывод в прод. Офис в Москве, переход в штат через ~6 месяцев.
Фишка: Ozon Банк позиционируется как банк собственной разработки внутри Ozon Fintech: короткие циклы, мало легаси, прямой диалог с коллегами; для антифрода критична связка «модель — бизнес-метрика — прод».
| Этап | Длительность | Что проверяют |
|---|---|---|
| Скрининг / HR | 20–40 мин | Мотивация, график обучения в вузе, готовность к офису 40 ч/нед, срок стажировки и ожидания по переходу в штат. |
| Техническое интервью | 60–90 мин | ML-база (классификация, метрики, дисбаланс), Python, SQL, разбор кейса по транзакциям или аномалиям. |
| Встреча с командой | 30–60 мин | Как рассуждаете о данных и рисках, умение задавать вопросы, интерес к антифроду и продукту банка. |
Стек и темы
Обязательный минимум
- Python (pandas, базовые структуры данных, sklearn-уровень)
- SQL (джойны, агрегаты, оконные функции, CTE)
- Задачи классификации: train/val/test, переобучение
- Метрики при сильном дисбалансе: precision, recall, PR-AUC, F1 с весами
- Базовая теория вероятностей и линейная алгебра
- Честная валидация на временных данных (без утечки из будущего)
Плюсом будет
- Пет-проекты в ML (Kaggle, GitHub)
- Опыт с anomaly detection
- Знакомство с gradient boosting (CatBoost/LightGBM) и monotonic constraints
- Понимание cost-sensitive learning и порогов решения
- Базовый MLOps: воспроизводимость экспериментов, feature store на уровне идей
ML: классификация и антифрод
Расскажи, что такое задача классификации.
Объект → дискретный класс по признакам; обучение по размеченным примерам; бинарный/мультикласс; отличие от регрессии.
Что делать, если для бизнеса важнее ошибка по нулевому или первому классу?
Подобрать метрику под класс (precision/recall нужного класса), веса в loss, порог по кривой PR/ROC, cost matrix; в антифроде часто дороже пропуск фрода или ложная блокировка — уточнить у бизнеса.
Что такое monotonic constraints и зачем они нужны?
Ограничение: рост признака не уменьшает скор (или наоборот); интерпретируемость и соответствие бизнес-логике; поддержка в CatBoost/LightGBM/XGBoost.
Что такое query-by-committee?
Активное обучение: комитет моделей; разметка примеров с максимальным разногласием — экономия бюджета разметки.
Фишка: В транзакционном антифроде редко оптимизируют accuracy — готовьтесь объяснить trade-off ложных срабатываний и пропущенного фрода.
Ловушка: Случайный split по строкам транзакций даёт завышенное качество; нужен split по времени или по клиенту.
Временные ряды и валидация
Какие особенности построения датасета и валидации для моделей временных рядов?
Sliding window; train/test по времени; walk-forward; без shuffle; учёт сезонности и дрейфа; leakage через агрегаты «из будущего».
Как использовать курс валют с последнего доступного дня для выходных и праздников?
ASOF join / last known value: для даты без котировки брать max(date) < target; оконные функции или lookup по календарю.
Совет: Транзакции — это поток во времени: упомяните lag-фичи, rolling-агрегаты и отдельную валидацию на «хвосте» периода.
Статистика и байесовский взгляд
Что такое сопряжённые распределения и зачем они удобны?
Априор и апостериор в одном семействе (напр. бета–биномиальное); аналитическое обновление по данным без тяжёлого MCMC на простых моделях.
Совет: На стажёрском уровне достаточно связать с оценкой доли редких событий и uncertainty — без ухода в формулы.
Python
Что находится под капотом у set? Какая фундаментальная структура данных?
Хеш-таблица; O(1) amortized insert/lookup; коллизии (chaining/open addressing); set не упорядочен (в CPython 3.7+ dict сохраняет порядок, set — нет).
Ловушка: Путают сложность set и list при поиске; для больших списков id транзакций set/dict предпочтительнее.
SQL и инженерия признаков
Как реализовать добавление поля в таблицу для вычисленных данных?
GENERATED/COMPUTED column или materialized view; trade-off: на лету vs хранение; индексы на вычисляемых полях зависят от СУБД.
Как использовать курс валют с последнего доступного дня для выходных и праздников?
Тот же паттерн в SQL: LATERAL join, DISTINCT ON, window last_value ignore nulls.
Фишка: На собесе часто дают задачу «собери витрину признаков по транзакциям за N дней» — CTE + window functions.
Дополнительно (если успеют)
Что такое гибридный поиск в RAG?
Семантический (эмбеддинги) + keyword (BM25); rerank; баланс recall по точным терминам и по смыслу.
Что такое Arrow и где он применяется?
In-memory columnar format; zero-copy между Python/Java/Spark; ускорение ETL и ML-пайплайнов.
Совет: Вопросы про RAG/генеративный ML в Ozon Tech встречаются чаще на других направлениях; для антифрода держите фокус на табличных данных.
Задачи
Метрики при дисбалансе 1:1000
Есть бинарный классификатор мошенничества: 1 млн транзакций, 1000 фродов. Модель A: precision=0.8, recall=0.5. Модель B: precision=0.4, recall=0.9. Какую выберете для продакшена и как обоснуете? Как посчитать ожидаемое число ложных блокировок при пороге?
Выбор зависит от cost matrix: cost(FN) vs cost(FP). При высоком cost пропуска фрода — B; при дорогих ложных блокировках клиентов — A. Ожидаемые FP ≈ (TP/recall - TP) при фиксированном recall или через precision: FP = TP*(1-precision)/precision. На практике строят PR-кривую и согласуют порог с лимитом на долю заблокированных легитимных операций.
Сложность: O(1) для расчёта на агрегатах
SQL: агрегаты по клиенту за 7 дней
Таблица transactions(user_id, ts, amount, is_fraud). Для каждой транзакции добавьте признаки: сумма amount за предыдущие 7 дней (не включая текущую) и число транзакций за тот же период. Без утечки из будущего.
Оконные функции: SUM(amount) OVER (PARTITION BY user_id ORDER BY ts ROWS BETWEEN 7 PRECEDING AND 1 PRECEDING) — при необходимости заменить на RANGE по интервалу 7 days. COUNT(*) аналогично. Альтернатива: self-join с условием t2.ts BETWEEN t1.ts - interval '7 days' AND t1.ts - epsilon.
Сложность: O(n log n) при сортировке по user_id, ts
Python: порог по PR-кривой
Даны y_true и y_score (вероятности). Напишите логику выбора порога, при котором recall ≥ 0.85, а precision максимальна среди таких порогов.
from sklearn.metrics import precision_recall_curve prec, rec, thr = precision_recall_curve(y_true, y_score) mask = rec[:-1] >= 0.85 best = thr[mask][np.argmax(prec[:-1][mask])] if mask.any() else thr[np.argmax(rec[:-1])]
Сложность: O(n log n) из-за сортировки порогов в sklearn
System Design
- Как бы вы построили MVP модели транзакционного антифрода от сырых логов до алерта в прод?
- Как организовать переобучение модели при дрейфе атак?
- Где поставить human-in-the-loop для разметки спорных кейсов?
Каркас ответа
- Уточнить объект scoring (транзакция, сессия, клиент) и SLA решения (мс vs минуты)
- Источники данных, витрина признаков, latency и хранение
- Разметка и задержка labels; стратегия валидации по времени
- Модель + порог + объяснимость для операторов
- Мониторинг: доля алертов, precision на разметке, drift признаков
- План отката и A/B или shadow mode перед жёсткой блокировкой
Поведенческое
- Почему антифрод в банке, а не классический ML в e-commerce?
- Расскажите о пет-проекте или курсовой, где работали с несбалансированными данными
- Как вы проверяете, что модель не «подглядывает» в будущее?
- Пример, когда вы не согласились с метрикой, которую предложили — как аргументировали?
- Готовы ли к офисному графику и как совместите со учёбой?
- Какие вопросы хотите задать команде про стажировку и переход в штат?
План подготовки
3 дня
- Повторить precision/recall/PR-AUC на игрушечном дисбалансе 1:100
- Решить одну SQL-задачу с window functions (rolling 7d)
- Прочитать описание вакансии и сформулировать 5 вопросов команде
7 дней
- Пройти 2–3 вопроса из блоков ML и SQL вслух с таймером
- Собрать мини-ноутбук: train CatBoost/LightGBM на публичном fraud-датасете (IEEE-CIS, Kaggle credit card — любой)
- Отработать ответ про валидацию временных рядов и leakage
14 дней
- Углубить anomaly detection: isolation forest vs supervised при редком фроде
- Повторить monotonic constraints и cost-sensitive порог
- Мок-интервью: кейс «выбор модели A vs B» + SQL витрина признаков
- Подготовить STAR-историю про учебный/личный ML-проект
| Блок | Готов, если... |
|---|---|
| ML: классификация и антифрод | можете объяснить выбор метрики и порога при дисбалансе без формул с потолка |
| Временные ряды | можете описать time-based split и почему shuffle вреден |
| Python | объясняете set/dict и базовый sklearn pipeline |
| SQL | пишете rolling-агрегат по user_id без leakage |
| Кейс | за 5 минут набросаете пайплайн антифрода от данных до мониторинга |
В день собеседования
- Повторить шпаргалку метрик и типичные SQL-паттерны (CTE, window)
- Взять ноутбук/примеры кода без секретов
- Уточнить адрес офиса и формат (live coding vs обсуждение)