Привет, Хабр. Меня зовут Виктор, я Big Data Engineer в antifraud-направлении. В этом посте хочу рассказать о том, как мы выстраивали процесс обнаружения подозрительных паттернов поведения в ставках на зарубежной БК-платформе DoseSports — без воды и маркетинга. Только архитектура, фичи, модели и выводы.
Исходные вводные
DoseSports — закрытая букмекерская платформа, ориентированная на mid/high-roll игроков. В отличие от большинства отечественных БК, здесь отсутствует агрессивное лимитирование по ставкам, поэтому спектр поведенческих сценариев шире. С одной стороны, это привлекает аудиторию. С другой — усложняет задачу antifraud-системы.
Перед нами стояла задача в real-time вычленять:
- мультиаккаунтинг 
- ботов/скриптов 
- арбитражников 
- аномальное поведение по ROI и объёму ставок 
Архитектура обработки
Ставки, логины, действия пользователей поступают в централизованный поток:
- Kafka — основной брокер, разбит на топики - bets,- auth,- sessions
- Spark Structured Streaming — для оконной агрегации и feature extraction 
- ClickHouse — агрегаты и дешёвый OLAP 
- PostgreSQL — хранилище метаданных и результатов скоринга 
- S3 (Parquet) — архив событий для оффлайн-обучения 
Формат и структура сообщений строго типизированы, схема событий валидируется через Avro.
Feature engineering
Основная сложность — не в данных, а в построении информативных признаков, отличающих нормальное поведение от аномального. Вот часть того, что оказалось полезным:
| Признак | Описание | 
|---|---|
| 
 | средняя сумма ставки в пятиминутном окне | 
| 
 | время между логином и первой ставкой | 
| 
 | энтропия исходов ставок в текущей сессии | 
| 
 | доля смены IP за последние 24 часа | 
| 
 | сколько раз ставит на один и тот же маркет | 
| 
 | отклонение ROI за 7 дней от медианного | 
Кроме того, применяли эмбеддинги по ставочным последовательностям и cosine similarity между сессиями разных пользователей.
ML-модель
После тестирования нескольких подходов (RandomForest, Isolation Forest, Autoencoder) остановились на XGBoost по ряду причин:
- высокая скорость инференса 
- возможность кастомизации loss-функции 
- удобная explainability через feature importance 
Работали в semi-supervised парадигме:
- Вручную размеченные кейсы → обучающая выборка 
- Остальные кейсы — псевдометки через confident predictions 
- Построение модели с регулярной переобучаемостью (раз в неделю) 
Также делали эксперимент с LSTM (сессии как временные ряды), но из-за слабой интерпретируемости и большего inference-time он ушёл в оффлайн-анализ.
Тестирование и отладка
Чтобы не "ломать прод", создали локальный testbench:
- генератор сессий со скриптовым поведением (на Go) 
- имитация вилок, дублирования, смены IP 
- latency-тестирование пайплайна (требование: <100мс в пике) 
Кроме того, включили обратную связь от модераторов в виде ручной метки и комментариев — это пошло обратно в pipeline обучения.
Результаты
| Метрика | Значение | 
|---|---|
| Precision | ~83% | 
| Recall | ~74% | 
| False Positive Rate | ниже 4% | 
| Обработка в проде | ~2,5% действий маркируется как high-risk | 
Около 10–15 кейсов в месяц — передаются в compliance-отдел для дальнейших действий.
Плюсы и минусы платформы
Что порадовало в DoseSports:
- Стабильный REST + WebSocket API 
- Доступ к сырым логам ставок (не агрегатам, что редкость) 
- Архитектура backend'а без "магии" — понятно, что проектировали инженеры 
Что стоит улучшить:
- Нет sandbox-среды для безопасного тестирования 
- Документация API/событий крайне фрагментирована 
- Клиентский фронт не всегда репрезентативен (расхождение с backend-таймингом) 
Вывод
Для тех, кто работает в antifraud, risk management или просто интересуется применением ML в прикладных задачах — кейс DoseSports может быть интересен.
 Сложностей хватает, но благодаря стабильному API, доступу к логам и адекватной архитектуре, проект оказался рабочим. Конечно, не enterprise-уровня, но в рамках fast-growing private продукта — вполне зрелый стек.
Если интересны детали кода, пайплайна или примеры фичей в Spark — пишите в комментарии, с радостью раскрою глубже.
Комментарии (4)
 - nikolaj_kozlovn20.06.2025 12:11- Внятная реализация без излишней "магии". Все на местах: схема, фичи, оценка, retrain. ML без цирка. Видно, что делали не ради слайда 
 - alex_ehorov20.06.2025 12:11- Порадовало внимание к latency и fallback’ам. Архитектура стриминга адекватная, тестбенч — нормальное решение. Надежно, без overengineering 
 - alex_novgorodsky20.06.2025 12:11- Фичи практичные, latency уложились, пайплайн предсказуемый. По сути — правильная эксплуатационная модель 
 
           
 
fika29588
Круто, что ушли от автоэнкодеров в онлайн и остались на XGBoost — при такой explainability это прям маст