Условие
У вас есть месяц логов Netflix: account_id, device_id, метаданные платежей. Как обнаружить фрод — кражу аккаунта (account takeover) и платёжный фрод?
Решение
Подход
Две задачи, две модели. Общий каркас: фичи → классификатор → правила.
1. Account takeover (ATO).
- Сигналы аномалии: новый device_id, новая страна / IP, рост числа одновременных сессий, ночные логины для дневного пользователя.
- Целевая разметка: подтверждённые случаи возврата паролей / жалоб пользователей.
- Модель: gradient boosting на per-event фичах + последовательность последних 30 логинов (LSTM или агрегаты
count_last_24h).
2. Payment fraud.
- Сигналы: карта впервые на этом аккаунте, страна карты ≠ страна логина, chargeback в истории, BIN карты в чёрном списке.
- Сильный класс-имбаланс (≤ 1%):
class_weight='balanced', focal loss, PR-AUC как метрика. - Калибровка вероятностей — критична: триггер «hold payment» при
p > τ, τ выбирается под бизнес-ограничение.
3. Признаки.
- Сессионные: длина сессии, число одновременных стримов.
- Истории: разница между текущим IP/девайсом и историческим распределением.
- Графовые: один device_id, привязанный к 10 аккаунтам — сигнал sharing/abuse.
- Эмбеддинги девайсов: автоэнкодер или Word2Vec по последовательностям
account → device.
4. Архитектура production.
- Online inference на стриме логинов (Kafka → Flink/Spark Streaming → модель).
- Реакция: блок логина, запрос 2FA, мягкая капча.
- Offline пересчёт фичей и retraining раз в неделю.
5. Метрики.
- Offline: PR-AUC, recall@precision=0.95.
- Online: доля заблокированных, false positive rate (жалобы пользователей), доля предотвращённых chargebacks.
import lightgbm as lgb
model = lgb.LGBMClassifier(
objective="binary",
is_unbalance=True,
n_estimators=500,
)
model.fit(X_train, y_train, eval_set=[(X_val, y_val)], eval_metric="average_precision")Подводные камни
- Дешёвая метка. Подтверждённый фрод — это только верхушка айсберга; в «нефроде» полно скрытых положительных. Используйте PU-learning или semi-supervised, или таргетируйте только верифицированные случаи и принимайте, что мы недодиагностируем.
- Concept drift. Атакующие меняют тактику; модель надо мониторить и переобучать. Дашборд: распределение скоров по часам, доля high-risk.
- Cost of false positive. Заблокировать честного пользователя — больно. Лучше step-up через 2FA, чем жёсткий блок.
- Latency. Inference на логине должен укладываться в 100-200 мс. Heavy LSTM может не успеть — берите GBM + предрасчитанные эмбеддинги.
Эталонный ответ
Две модели: ATO и payment fraud. GBM на per-event и сессионных фичах + графовые/историчные признаки. Метрика — PR-AUC, recall@precision. На проде — streaming inference и step-up auth вместо жёсткого блока. Регулярное переобучение из-за concept drift обязательно.