Материал Эйч · Опубликовано 27 октября 2026
Стажировка в команде транзакционного антифрода: данные, модели, метрики бизнеса и вывод в прод. Офис в Москве, переход в штат через ~6 месяцев.
Фишка: Ozon Банк позиционируется как банк собственной разработки внутри Ozon Fintech: короткие циклы, мало легаси, прямой диалог с коллегами; для антифрода критична связка «модель — бизнес-метрика — прод».
| Этап | Длительность | Что проверяют |
|---|---|---|
| Скрининг / HR | 20–40 мин | Мотивация, график обучения в вузе, готовность к офису 40 ч/нед, срок стажировки и ожидания по переходу в штат. |
| Техническое интервью | 60–90 мин | ML-база (классификация, метрики, дисбаланс), Python, SQL, разбор кейса по транзакциям или аномалиям. |
| Встреча с командой | 30–60 мин | Как рассуждаете о данных и рисках, умение задавать вопросы, интерес к антифроду и продукту банка. |
Обязательный минимум
Плюсом будет
Расскажи, что такое задача классификации.
Объект → дискретный класс по признакам; обучение по размеченным примерам; бинарный/мультикласс; отличие от регрессии.
Что делать, если для бизнеса важнее ошибка по нулевому или первому классу?
Подобрать метрику под класс (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 — без ухода в формулы.
Что находится под капотом у set? Какая фундаментальная структура данных?
Хеш-таблица; O(1) amortized insert/lookup; коллизии (chaining/open addressing); set не упорядочен (в CPython 3.7+ dict сохраняет порядок, set — нет).
Ловушка: Путают сложность set и list при поиске; для больших списков id транзакций set/dict предпочтительнее.
Как реализовать добавление поля в таблицу для вычисленных данных?
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
Каркас ответа
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| ML: классификация и антифрод | можете объяснить выбор метрики и порога при дисбалансе без формул с потолка |
| Временные ряды | можете описать time-based split и почему shuffle вреден |
| Python | объясняете set/dict и базовый sklearn pipeline |
| SQL | пишете rolling-агрегат по user_id без leakage |
| Кейс | за 5 минут набросаете пайплайн антифрода от данных до мониторинга |
В день собеседования