Подготовка к собеседованию в команду антифрода Ozon Банка: ML-модели на кредитных продуктах, графовая аналитика, мониторинг в проде и бизнес-метрики
Фишка: Команде важны end-to-end ownership: от фича-инжиниринга и R&D графовой аналитики до деплоя realtime-сервисов, мониторинга дрейфа и расчёта экономического эффекта модели для кредитных продуктов банка с 35+ млн клиентов
| Этап | Длительность | Что проверяют |
|---|---|---|
| HR-скрининг | 30–45 мин | Опыт в антифроде/скоринге, мотивация, формат работы (офис/удалёнка), зарплатные ожидания, готовность к финтех-темпу |
| Техническое интервью с DS/тимлидом | 60–90 мин | ML-алгоритмы, метрики классификации при дисбалансе классов, feature engineering, SQL, Python, кейсы из антифрода и кредитного скоринга |
| Практический кейс / домашнее задание | 1–3 часа (иногда take-home) | Построение модели на табличных данных, выбор метрик, интерпретация результатов, расчёт бизнес-эффекта |
| Интервью с заказчиком / hiring manager | 45–60 мин | Самостоятельность, работа с бизнесом, интеграция внешних скоров, опыт доведения проектов до прода, коммуникация с юристами и закупками |
Обязательный минимум
Плюсом будет
Какие метрики выбираешь для модели обнаружения мошенничества и почему?
При дисбалансе (fraud < 1%) PR-AUC и Recall@fixed FPR важнее ROC-AUC. Считай cost matrix: стоимость пропущенного фрода vs ложного блокирования. KS/Gini — для скоринга.
Что важнее — precision или recall — для блокировки транзакции vs отправки на ручную проверку?
Автоблок → высокий precision (минимум false positive). Ручная модерация → можно поднять recall, precision менее критичен. Порог подбирается по бизнес-cost.
Как борешься с дисбалансом классов в антифроде?
Undersampling majority, SMOTE (осторожно с leakage), class weights, focal loss, anomaly detection (Isolation Forest, Autoencoder), метрики на imbalanced data.
Чем отличаются онбординговые и транзакционные модели?
Онбординг — скоринг при открытии продукта (мало данных о клиенте, внешние скоры). Транзакционные — scoring в момент операции (behavioral features, velocity, device fingerprint).
Как оцениваешь экономический эффект модели?
Saved fraud losses − operational costs (manual review, false blocks) − model maintenance. A/B или backtesting на out-of-time выборке.
Фишка: Ozon Банк ожидает умение переводить precision/recall в язык бизнеса: сколько сэкономили, сколько клиентов заблокировали зря.
Ловушка: Не используй accuracy как основную метрику — при fraud rate 0.1% модель «всё ок» даст 99.9% accuracy.
Совет: Подготовь 1–2 кейса: как нашёл паттерн мошенничества, как довёл модель до прода, как реагировал на инцident/drift.
Как работает градиентный бустинг?
Последовательно добавляет деревья, каждое обучается на residual (градиент loss). Регуляризация: learning rate, max_depth, subsample. CatBoost/LightGBM/XGBoost — основа в антифроде.
В чём разница в реализации между XGBoost и LightGBM?
XGBoost — level-wise рост деревьев. LightGBM — leaf-wise (быстрее, риск overfit). LightGBM — GOSS, EFB для категорий. CatBoost — ordered target encoding.
Что такое регуляризация в машинном обучении?
Штраф сложности модели: L1 (sparse features), L2 (smooth weights), dropout, early stopping, max_depth, min_samples_leaf.
В чём разница между L1 и L2 регуляризацией?
L1 → разреженные веса, feature selection. L2 → малые равномерные веса, устойчивость. Elastic Net = L1 + L2.
Какие плюсы и минусы древовидных моделей?
+ интерпретируемость, работа с нелинейностями, не нужен scaling. − overfit, плохая экстраполяция, нестабильность при drift.
Как коллинеарность признаков влияет на Random Forest?
RF устойчив к коллинеарности (importance размывается между коррелированными). Для линейных моделей — проблема. SHAP/permutation importance для интерпретации.
Как выполняется кросс-валидация для временных данных?
Time-based split, expanding/rolling window. Нельзя random K-Fold — leakage из будущего. Out-of-time validation обязательна в антифроде.
Что является таргетом для бустинга?
Negative gradient of loss function (pseudo-residuals). Для MSE — разность y − prediction. Для logloss — y − p.
Совет: В антифроде почти всегда бустинг (CatBoost/LightGBM) — знай гиперпараметры и как их тюнить на imbalanced data.
Ловушка: Random K-Fold на транзакционных данных = data leakage через будущие транзакции того же клиента.
Что такое precision?
TP / (TP + FP). Доля реальных фродов среди заблокированных. Высокий precision = мало ложных срабатываний.
Для чего используются различные метрики классификации?
Accuracy — сбалансированные классы. Precision/Recall — trade-off. ROC-AUC — ранжирование. PR-AUC — imbalanced. F1 — баланс P/R. Business KPI — fraud saved.
Какие метрики используешь для оценки качества модели?
Offline: PR-AUC, Recall@FPR=1%, KS, Gini. Online: fraud rate, approval rate, manual review rate, $ saved. Calibration — для скоринга.
Какая алгоритмическая сложность вычисления ROC-AUC?
O(n log n) — сортировка по score + один проход. PR-AUC — аналогично по precision-recall curve.
Что такое доверительный интервал?
Диапазон, в котором истинный параметр с вероятностью 1−α. Bootstrap или Wilson interval для метрик на hold-out.
Фишка: На собесе могут попросить выбрать порог по ROC/PR curve и обосновать через cost matrix.
Какие знаешь методы кодирования категориальных признаков?
One-Hot (линейные модели), Target/Mean encoding (бустинг, риск leakage — CV encoding), CatBoost ordered encoding, Frequency encoding, Hashing.
Какие способы кодирования категориальных признаков существуют?
Label, One-Hot, Target, Leave-One-Out, Weight of Evidence (WoE) для скоринга, Embedding для high-cardinality.
Как отбираешь признаки при их большом количестве?
Filter (correlation, IV/WoE), Wrapper (RFE), Embedded (L1, feature importance, SHAP). В антифроде — domain knowledge + velocity features.
Как классифицировать возраст по бинам с шагом 5 лет?
pd.cut() с bins=[0,5,10,...] или SQL CASE WHEN age BETWEEN x AND y. WOE-бинning для монотонности в скоринге.
Для каких моделей предпочтителен One-Hot Encoding, а для каких нет?
Линейные/логрег — OHE. Деревья/бустинг — не нужен, CatBoost/LightGBM обрабатывают категории нативно.
Совет: Velocity features (кол-во транзакций за N минут, сумма за час, geo-jump) — ключевые в транзакционном антифроде.
Ловушка: Target encoding без CV — leakage. Всегда fit на train fold, transform на val.
Работал ли со Spark?
PySpark DataFrame API, Spark SQL, UDF. Альтернативы: Polars, DuckDB, ClickHouse для OLAP. В Ozon — ClickHouse/Vertica/Spark/Hadoop.
Что можно использовать как альтернативу PySpark?
Polars, DuckDB, Dask, ClickHouse SQL, BigQuery. Выбор зависит от объёма и latency.
Напиши SQL: топ-3 мерчанта по сумме транзакций за последние 7 дней с оконной функцией
SUM(amount) OVER (PARTITION BY merchant ORDER BY date ROWS 7 PRECEDING) или CTE + RANK() OVER (PARTITION BY ... ORDER BY sum DESC).
Как детектировать аномалии в SQL на больших объёмах?
Z-score/percentile по агрегатам, window functions для velocity, HAVING COUNT > threshold, approximate quantiles в ClickHouse.
Фишка: Ozon Банк работает с ClickHouse — знай ARRAY JOIN, approximate functions, materialized views.
Как мониторишь модель в проде?
Data drift (PSI, KS на фичах), concept drift (метрики на labeled subset), latency, throughput, score distribution, alert thresholds.
Что такое PSI (Population Stability Index)?
Σ (actual% − expected%) × ln(actual%/expected%). PSI > 0.25 — значимый drift. Считается по score bins или фичам.
Как реагируешь на инцident с моделью?
Rollback/champion-challenger, rule-based fallback, root cause (data pipeline? drift? fraud pattern change?), retrain pipeline.
Опыт с MLflow?
Experiment tracking, model registry, staging → production, artifact storage. Аналоги: Weights & Biases, ClearML, Kubeflow.
Фишка: В вакансии явно указан мониторинг: алерты, drift analysis, incident response — подготовь пример из опыта.
Какие знаешь неизменяемые типы данных в Python?
int, float, str, tuple, frozenset, bytes. list/dict/set — mutable.
В чём разница между = и оператором is в Python?
= — присваивание. is — identity (same object in memory). `a is b` vs `a == b` (value equality).
Что такое метод Copy vs DeepCopy в Python?
copy.copy() — shallow (вложенные объекты shared). copy.deepcopy() — рекурсивная копия. Важно для pandas DataFrame.
Какая сложность сортировки списка?
O(n log n) — Timsort в Python. sorted() vs .sort() — второй in-place.
Совет: Могут дать live-coding: группировка транзакций, расчёт velocity features, парсинг JSON-логов.
Как графовые методы помогают в антифроде?
Fraud rings: shared device/IP/card/phone между аккаунтами. Community detection (Louvain), PageRank, connected components, link prediction.
Какие графовые БД знаешь?
Neo4j (Cypher), Amazon Neptune, GraphFrames (Spark). Хранение edges: (user)→(device)→(merchant).
Как строишь граф для fraud detection?
Nodes: users, devices, cards, IPs, merchants. Edges: transaction, login, registration. Features: degree, clustering coefficient, betweenness.
Фишка: Ozon Банк активно развивает graph analytics в антифроде — даже без глубокого опыта покажи понимание fraud rings.
Расчёт velocity features для транзакций
Дан DataFrame транзакций: user_id, timestamp, amount, merchant_id. Напиши код, который для каждой транзакции считает: (1) количество транзакций пользователя за последний час, (2) сумму транзакций за последний час, (3) число уникальных merchant_id за последние 24 часа.
import pandas as pd
def add_velocity_features(df: pd.DataFrame) -> pd.DataFrame:
df = df.sort_values(['user_id', 'timestamp'])
df['ts'] = pd.to_datetime(df['timestamp'])
result = []
for user_id, group in df.groupby('user_id'):
g = group.set_index('ts')
g['txn_count_1h'] = g.rolling('1h').count()['amount']
g['txn_sum_1h'] = g.rolling('1h').sum()['amount']
g['unique_merchants_24h'] = g.rolling('24h')['merchant_id'].apply(lambda x: x.nunique(), raw=False)
result.append(g.reset_index())
return pd.concat(result, ignore_index=True)
# SQL-альтернатива (ClickHouse):
# SELECT *,
# count() OVER (PARTITION BY user_id ORDER BY timestamp RANGE BETWEEN INTERVAL 1 HOUR PRECEDING AND CURRENT ROW) AS txn_count_1h,
# sum(amount) OVER (PARTITION BY user_id ORDER BY timestamp RANGE BETWEEN INTERVAL 1 HOUR PRECEDING AND CURRENT ROW) AS txn_sum_1h
# FROM transactionsСложность: O(n log n) per user due to rolling window
Выбор порога классификации по cost matrix
Модель антифрода выдаёт score ∈ [0,1]. Cost matrix: пропущенный фрод = 500₽, ложная блокировка = 50₽. Средний чек фрода = 5000₽. Напиши функцию, которая по массивам y_true, y_score находит оптимальный порог, минимизирующий total cost.
import numpy as np
from sklearn.metrics import confusion_matrix
def optimal_threshold(y_true, y_score, cost_fn=500, cost_fp=50):
thresholds = np.sort(np.unique(y_score))
best_cost, best_t = float('inf'), 0.5
for t in thresholds:
y_pred = (y_score >= t).astype(int)
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
cost = fn * cost_fn + fp * cost_fp
if cost < best_cost:
best_cost, best_t = cost, t
return best_t, best_cost
# На собесе: объясни, что при cost_fn >> cost_fp оптимальный порог ниже (больше recall)Сложность: O(n × k) где k — число уникальных порогов
Расчёт PSI для мониторинга drift
Реализуй функцию PSI между expected (train) и actual (prod) распределениями скоров. Разбей на 10 equal-frequency bins по train.
import numpy as np
def calculate_psi(expected, actual, n_bins=10):
breakpoints = np.percentile(expected, np.linspace(0, 100, n_bins + 1))
breakpoints[0], breakpoints[-1] = -np.inf, np.inf
expected_pct = np.histogram(expected, bins=breakpoints)[0] / len(expected)
actual_pct = np.histogram(actual, bins=breakpoints)[0] / len(actual)
# Smoothing для избежания log(0)
expected_pct = np.clip(expected_pct, 1e-4, None)
actual_pct = np.clip(actual_pct, 1e-4, None)
psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
return psi
# Интерпретация: PSI < 0.1 — OK, 0.1-0.25 — мониторить, > 0.25 — retrainСложность: O(n log n) для percentile + O(n) для histogram
Каркас ответа
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| Антифрод и скоринг | можешь выбрать метрики для fraud detection, объяснить trade-off precision/recall и посчитать cost matrix |
| Gradient Boosting | можешь объяснить как работает бустинг, чем отличаются XGB/LGBM/CatBoost, и как тюнить на imbalanced data |
| SQL и Big Data | можешь написать запрос с оконными функциями для velocity features и знаешь основы ClickHouse/Spark |
| MLOps | можешь описать pipeline мониторинга: PSI, drift, alerting, incident response, MLflow |
| Feature Engineering | можешь перечислить методы encoding категорий, velocity features и избежать data leakage |
| System Design | можешь нарисовать realtime scoring pipeline с feature store, model serving и decision engine |
| Behavioral | есть 2–3 STAR-кейса с измеримым бизнес-результатом в антифроде/финтехе |
В день собеседования