Привет, Хабр. Меня зовут Виктор, я 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 — пишите в комментарии, с радостью раскрою глубже.
ссылка на оригинал статьи https://habr.com/ru/articles/919774/
Добавить комментарий