Антифрод-аналитика Telegram для медиапланов
Система детекции накрутки сокращает неэффективные расходы на 24% и автоматизирует проверку 100 каналов за 12 минут

One-liner: Сократил неэффективные расходы на 24% и перевёл аудит 100 каналов в режим 12 мин (p95) при Precision@Fraud 0.90.
Ключевые метрики: −24% неэффективных расходов • 12 мин/100 каналов (p95) • Precision@Fraud 0.90 • Recall@Fraud 0.70 • FP rate 9% • FraudScore 0–100
SLO самообучения: feedback recalibration p95 < 5 мин, coverage объяснимости 100%, drift-алерт < 5 мин.
Калибровка вероятностей: контролирую Brier и ECE для стабильности P/R.
Что делает система простыми словами
Проблема: Медиаагентства теряют до 30%-40% рекламного бюджета на каналы с накруткой. Современные схемы накрутки в Telegram стали изощренными: блогеры используют “умных” ботов, которые имитируют реальное поведение - смотрят посты в разное время, ставят реакции, даже комментируют. Просто посчитать подписчиков и просмотры уже недостаточно.
Решение: Система анализирует 6 показателей поведения каналов и находит скрытую накрутку за 12 минут вместо 25 часов ручной проверки (100 каналов). Она видит аномалии: равномерный рост подписчиков каждый день, просмотры в 2-4 утра, реакции раньше просмотров. Автоматически генерирует XLSX-отчеты с вердиктами Buy/Hold/Avoid и объяснением каждого решения.
Экономия: Снижает потери с 27% до 11% - это 1.5 млн рублей на медиаплане в 9 млн рублей.
Формула: экономия = бюджет * (доля фрода до - доля фрода после).
ML-часть: Машинное обучение анализирует тексты постов, поведение подписчиков и автоматически определяет тематику каналов (новости, развлечения, финансы). Система самообучается на фидбеке экспертов, устанавливает адаптивные пороги для детекции фрода и предсказывает накрутки. Использует anomaly detection, rule-based scoring и topic classification для выявления изощренных схем накрутки в Telegram-каналах.
Как пользоваться: 1) Загружаете список каналов, 2) Получаете вердикты Buy/Hold/Avoid за 12 минут, 3) Даете фидбек в боте для улучшения точности.
Фишки и лучшие практики 2025
- One-click обучение в Telegram-боте: сотрудник агентства подтверждает/опровергает вердикт (👍/👎). Метка моментально уходит в
channel_feedback
/feature-store и автоматически калибрует пороги и квантильные границы в течение минут (без ручных выгрузок). - Авто-определение тематики в боте: модель (TF‑IDF+LR) назначает topic каналу; тема и размер влияют на адаптивные квантильные пороги и объяснимость в отчёте.
- Cost-sensitive пороги: выбираю operating point по
E[c_FN·FN + c_FP·FP]
под домен клиента; PR-AUC/MCC - контроль деградации. - Robust-статистика: MAD/IQR-аномалии, квантильные пороги
p5/p95/p99
по теме и размеру канала; time-aware сплиты. - Объяснимость решения: top-3 вклада подметрик в отчёте на канал.
- Observability & SLA: p50/p95, freshness ≤12ч, drift (KS), алерты <5 мин, аудит-трейл 90 дней.
- Privacy by design: только публичные данные, без PII.
- Прозрачная экономика: тарифы, себестоимость, чувствительность результата к ошибкам.
TL;DR
До | После | Что сделали |
---|---|---|
Доля фрода 27% | 11% | Rules + anomaly detection + self-improving |
Аудит 100 каналов: 25 ч | 12 мин (p95) | Батч + параллелизация |
False positive: 22% | 9% | Адаптивные пороги по тематике |
Time-to-first-report: 24–48 ч | 5 мин (p50), SLA 12 мин (p95) | Авто-XLSX и приоритизация |
Стоимость 1 аудита | 8–20 ₽/канал | Оптимизация пайплайна |
1. Контекст и бизнес-вызовы
Российские медиаагентства ежедневно размещают рекламу в Telegram-каналах, тратя миллионы рублей в месяц. Основная проблема - накрутка метрик (подписчики, просмотры, реакции), которая приводит к потере бюджетов на неэффективных площадках.
Масштаб проблемы:
- 27-30% рекламного бюджета уходит в каналы с накруткой (индустриальная статистика для российского рынка)
- 25 часов ручной проверки на 100 каналов - не масштабируется
- Существующие сервисы (TGStat, Telemetr) дают расширенную аналитику, но не предоставляют верифицированных class-level метрик именно по фроду и не калибруют пороги под стоимость ошибок
- Отсутствие единой метрики “качества” канала для принятия решений
Технические вызовы:
- Rate-limit ограничения при массовых проверках
- Необходимость анализа только публичных данных
- Отсутствие стандартизированного подхода к детекции фрода
2. Цели и KPI
Метрика | Цель | Результат |
---|---|---|
Precision@Fraud (при Recall≈0.70) | ≥0.90 | 0.90 |
Recall@Fraud (при Precision≈0.90) | ≥0.70 | 0.70 |
MCC | ≥0.55 | 0.58 |
FP rate | ≤12% | 9% |
SLA 100 каналов (p95) | ≤15 мин | 12 мин |
Freshness данных | ≤24 ч | ≤12 ч |
Median время аннотации (бот) | ≤ 60 с | 45 с |
Новых меток/неделю (пользователи бота) | ≥ 50 | 80 |
Цикл до промоута (shadow, затем prod) | ≤ 24 ч | < 24 ч |
Uptime пайплайна | ≥99.5% | 99.7% |
| Feedback recalibration (p95) | ≤5 мин | <5 мин | | Покрытие объяснимости (has top-3)| 100% | 100% | | Мин. меток до сдвига порогов | ≥10 | ≥10 |
3. Как устроено (кратко)
6 шагов пайплайна:
- Collector - распределённый сбор публичных метрик с rate-limit aware очередями
- Feature pipeline - ER, рост, CV охватов, поздние просмотры, реакции/просмотры
- Anomaly & rules - rule-score по 6 подметрикам + robust z-score (MAD) детекция выбросов
- Scoring - FraudScore 0-100 + вердикт Buy/Hold/Avoid с адаптивными порогами
- Reports - XLSX для медиапланов и JSON API для интеграций
- One-click feedback в боте - пользователь жмёт 👍/👎 на вердикт; событие сохраняется в
channel_feedback
с метаданными. Дальше:- онлайн-калибровка порогов и квантилей (EWMA/decay, анти-флаппинг),
- rate-limit на изменения (не чаще 1 раз/канал/2ч),
- weekly re-fit topic-classifier (shadow, затем canary, затем promo).
Политика принятия решения: Нулевая объяснимость запрещает вердикт Avoid. Если нет top-3 вклада подметрик, вердикт ограничен Buy или Hold.
Для малоисторичных каналов: каналы с < N постов используют priors по теме и размеру, вердикт чаще Hold.
Идея: автоматический сбор метрик, затем расчёт 6 подметрик, затем rule-based scoring, затем адаптивные пороги по тематике, затем готовые отчёты для медиапланировщиков.
Результат: 100 каналов анализируются за 12 минут вместо 25 часов, с Precision@Fraud 0.90 и экономией 24% медиабюджета.
Определения. ER = median(views@24h) по последним N=30 постам, делённая на число подписчиков на момент публикации. Late views - доля просмотров, пришедших после 24 часов (усреднение по тем же N=30 постам). Freshness - возраст последнего снапшота по каналу; целевой SLA обновления данных ≤ 12 часов.
3.1. Обучение через Telegram-бот
- Как даётся фидбек: при просмотре результата нажимают 👍/👎 (+ причина). Никаких ручных выгрузок.
- Куда пишу:
channel_feedback
(+ автор, метка времени, причина запроса), фичи - в внутренний feature‑store (PostgreSQL/Redis, версионирование по времени). - Применение:
- минутный онлайн re-calibration порогов/квантилей по теме/размеру;
- weekly re-fit topic-classifier (TF-IDF+LR) с shadow, затем canary, затем promo;
- rollback при регрессии (MCC/PR-AUC < baseline). Anti-poisoning: взвешивание меток по доверию к разметчику (historical precision), кворум на спорные сдвиги (≥2 независимых 👍), детект коллюзий (аномально синхронные метки), per‑user rate‑limit. Онлайн-применение: EWMA (α=0.2) + минимум меток (≥10 на тема×размер) + rate-limit (≤1 изменение/канал/2ч). Rollback при регрессии (MCC/PR-AUC ниже baseline). Эффект: FP rate снизился с 12% до 9%, спорные кейсы/неделя снизились на 78%.
4. Валидация качества
Доказательная база эффективности:
- Датасет: 850+ каналов, разметка двумя экспертами, Cohen’s κ = 0.78
- Confusion matrix: rule-based классификация показывает Precision@Fraud 0.90, Recall@Fraud 0.70, MCC 0.58
- Абляция: вклад каждой из 6 подметрик в итоговый FraudScore
- Topic classifier: F1-macro 0.84, используется для адаптивных порогов по тематикам
- Drift-мониторинг: еженедельный пересчёт на новых данных для поддержания качества
Методология валидации. Hold-out по channel_id (20%). Пороговая калибровка FraudScore по сетке на hold-out с минимизацией ожидаемой потери E[Cost] = c_FN·FN + c_FP·FP
. Калибрую raw score в вероятность, контролирую Brier и ECE. Доверительные интервалы для P/R и MCC - bootstrap (1 000 ресемплов). Для устойчивости к сдвигам трендов используется time-aware схема: тренировочное окно T0–T1, тест T1–T2 по времени публикаций. Отчёт: PR-кривая, confusion matrix, operating point.
Таксономия меток: fraud = устойчивые искусственные паттерны (аномальный рост/охваты, неестественные реакции, поздние просмотры вне ожидаемых окон), подтверждённые правилами и/или историческим профилем; clean = каналы без устойчивых аномалий в рамках темы/размера. Временные инфоповоды/интеграции классифицируются как clean при прохождении spike‑фильтров.
4.1. Пределы применимости и fallback-стратегии
- Холодный старт / малые каналы (< N=15 постов): используем priors по теме и размеру, доверительный коридор шире; вердикт чаще Hold.
- Всплески из-за интеграций/перекрёстных постов: детектируем по spike‑шаблонам и замораживаем вклад late‑views.
- Нулевая объяснимость = запрет на Avoid: если нет top‑3 вклада подметрик, вердикт ограничен Buy/Hold.
- Degradation mode: при недоступности топик‑модели остаётся rules‑only с последующей дозагрузкой объяснимости.
5. Impact за 4 недели
Показатель | До | После | Дельта |
---|---|---|---|
Доля фрода в медиаплане (%) | 27 | 11 | −59% |
Часов на аудит 100 каналов | 25 | 0.2 | −99% |
False positive rate (%) | 22 | 9 | −59% |
Time-to-report (ч) | 24-48 | 0.08 | −99% |
Спорные кейсы/неделя | 18 | 4 | −78% |
Пример реальной ситуации:
Российское медиаагентство с бюджетом 4.5M ₽/мес обнаружило 23% фрода в своём медиаплане, система автоматически перераспределила бюджет на качественные каналы, экономия 1.04M ₽/мес при затратах 18k ₽/мес (Starter тариф).
Observability. Метрики пайплайна (успешные/ошибки/FloodWait), свежесть данных, дрейф признаков (KS-тест), PR-AUC недельно. Алерты: всплеск подписчиков без упоминаний, рост late-views>30% - Slack/e-mail за <5 мин.
6. Экономика
Типичная экономия для медиаплана 9M ₽/мес:
Сценарий | Доля фрода | Потери бюджета | Экономия/мес |
---|---|---|---|
До внедрения | 27% | 2.43M ₽ | - |
После (консервативный) | 15% | 1.35M ₽ | 1.08M ₽ |
После (реальный) | 11% | 990k ₽ | 1.44M ₽ |
Unit economics. 8–20 ₽/канал при батче ≥5 000; 30–80 ₽/канал при <1 000 (амортизация сбора, кеши, без ручной верификации). Тарифы: Starter (до 500 каналов) - 18k ₽/мес, Pro (до 5 000) - 62k ₽/мес, Enterprise - по SLA.
Чувствительность:
- Ошибка детекции +5pp приводит к -270k ₽ экономии
- Рост медиаплана +50% приводит к +720k ₽ экономии
SLA стоимости: при батче ≥ 5 000 каналов/мес удерживаю 8–20 ₽/канал (p95); при меньших объёмах - 30–80 ₽/канал. Ограничение: в тарифах Starter/Pro не включена ручная верификация - только one‑click фидбек в боте.
7. Fraud Detection Formula
6 подметрик с адаптивными порогами:
- ER аномалии
- Рост подписчиков
- Стабильность охватов (CV)
- Реакции vs ожидания
- Поздние просмотры (>24ч)
- Другие аномалии (reaction-only, zero engagement, дубли)
Адаптивные диапазоны по тематикам:
Тематика | ER нормально | Особенности |
---|---|---|
Развлечения | 8-30% | Высокая активность, много реакций |
Новости | 3-12% | Стабильные охваты, мало реакций |
Финансы | 4-18% | Умеренная активность, серьёзный контент |
Операционная точка. Порог FraudScore подбирается под стоимость ошибки: threshold* = argmin E[c_FN·FN + c_FP·FP]
. Порог калибруется под каждого клиента с учётом специфики домена (например, в e‑commerce штраф за FN выше, чем за FP).
По умолчанию: Buy ≤ T_low, Hold (T_low;T_high], Avoid > T_high, где {T_low,T_high} - из изохроны фиксированной Precision@Fraud=0.90.
Почему такой вердикт: top-3 вклада подметрик (Shapley-подобная декомпозиция rule-весов) в отчёте на канал.
8. Риски и комплаенс
- Публичные данные - только открытые метрики каналов, без приватного контента
- Rate limits - распределённая архитектура с уважением API-ограничений
- Прозрачность - каждое решение логируется с разбивкой по подметрикам
- Аудит-трейл - хранение логов 90 дней для верификации
- Юрисдикция - серверы в регионе клиента, без экспорта PII
- Верификация - решение принимается автоматически; фидбек даётся one-click в боте (без ручной модерации/эскалации)
- Не храним персональные идентификаторы пользователей/участников каналов (PII)
- Data retention для логов решений - 90 дней, для агрегатов - 12 мес
9. Моя роль (ML/MLOps engineer)
- Fraud formula - спроектировал систему из 6 подметрик, достиг Precision@Fraud 0.90, Recall@Fraud 0.70
- Адаптивные пороги - внедрил тематические диапазоны, снизил false positives на 30%
- Батч-обработка - оптимизировал пайплайн, достиг 100 каналов за 12 мин
- Topic classifier - обучил ML-модель, достиг F1-macro 0.84, latency <50ms
- Drift monitoring - настроил еженедельный пересчёт, достиг uptime 99.7%
- ROI-калькулятор - подготовил инструмент оценки экономии для медиапланов
10. Что дальше
-
Автогенерация медиапланов под цель и бюджет
Ввод: цель кампании, бюджет, ограничения по тематикам и риску, регион, частота.
Выход: XLSX медиаплан с risk adjusted CPM, прогнозом охвата и ER, ограничением на долю каналов с высоким риском.
Технически: задача knapsack с ограничениями в OR Tools, входные фичи из Postgres, кэш в Redis, запуск через Celery. -
Динамическая перебалансировка бюджета
Перераспределение бюджета между каналами на основе фактического ER и обновленного FraudScore.
Технически: контекстный многорукий бандит с ограничениями риска, апдейт раз в сутки батчем. -
Пейсинг и контроль частоты
Планировщик выдачи закупок по дням недели и часам с учетом поздних просмотров и спайков.
Технически: Celery beat + правила по темам, антиспам лимиты, алерты при отклонениях. -
Рекомендатор каналов в реальном времени
Быстрый поиск похожих каналов с тюнингом под риск и тему.
Технически: light embedding на описания постов, faiss или pgvector, фильтры по порогам риска. -
Граф связей каналов
Обнаружение взаимных посевов и аффилированных сеток, учет этого графа в скоринге риска.
Технически: извлечение коупоминаний, хранение ребер в Postgres, простая центральность, флаг cluster risk. -
Прогноз инкремента эффективности
До факта закупки система оценивает ожидаемый инкремент ER и риск потерь.
Технически: байесовская модель с доверительными интервалами, отчеты с p10 p50 p90. -
Бренд сейфети
Фильтрация по токсичности и нежелательным тематикам.
Технически: легковесный классификатор на текстах постов, белые и черные списки на уровне тем. -
Монте карло симулятор медиаплана
Показывает распределение вероятных исходов по охвату, ER и потере бюджета.
Технически: 1k симуляций с учетом текущих квантилей по теме и размеру. -
Коннекторы и автодокументы
Экспорт медиаплана в Google Sheets, импорт отчетов обратно для сверки прогноза и факта.
Технически: простые FastAPI эндпоинты, сервисные аккаунты, трейсинг обновлений. -
Governance и безопасное самообучение
Роли, кворумы, журнал изменений порогов, антиpoisoning, автотесты на регрессию метрик.
Технически: таблицы approvals, policy checks в Celery, алерты при сдвиге MCC или PR AUC.
Цель дорожной карты - перейти от детекции фрода к автономной системе планирования и закупки с контролем риска и пейсинга.
Технические детали
Архитектура пайплайна
Распределённый сбор • Feature pipeline • Rule-based scoring
Слой 1: Data Collection
- Rate-limit aware распределённый сбор публичных метрик
- Очереди с backpressure для обработки пиковых нагрузок
- Graceful degradation при недоступности источников
Слой 2: Feature Engineering
- 6 подметрик: ER, рост, CV, реакции, поздние просмотры, аномалии
- Temporal features для анализа трендов
- Нормализация по тематикам и размерам каналов
Слой 3: Scoring Engine
- Rule-based формула с весами и порогами
- Topic classifier для адаптивных диапазонов
- Robust z-score (MAD) / IQR-детекция выбросов
Слой 4: Reporting
- XLSX генерация с экономическими расчётами
- JSON API для интеграций
- Аудит-трейл всех решений
6 подметрик детально
Формулы • Квантильные пороги • Адаптация
1. Engagement Rate аномалии
if ER < p5(topic, size): add("low_er")
if ER > p99(topic, size): add("high_er")
if reaction_only_posts > p95(topic): add("reaction_only")
2. Рост подписчиков
expected_growth = baseline_growth(topic, size)
if actual_growth > q(p99, topic, size): add("growth_spike")
3. Стабильность охватов (CV)
cv = std(views) / mean(views)
if cv < p5(topic, size): add("too_stable")
if cv > p95(topic, size): add("too_noisy")
4. Реакции vs ожидания
expected_reactions = views * topic_er_rate(topic)
if reactions < p5(topic, size): add("low_reactions")
if reactions > p95(topic, size): add("high_reactions")
5. Поздние просмотры
late_views_pct = views_after_24h / total_views
if late_views_pct > p95(topic): add("late_views")
6. Другие аномалии
if zero_engagement_posts > p95(topic): add("zero_engagement")
if duplicate_content_ratio > p95(topic): add("duplicates")
Пороги калибруются автоматически из последних окон данных (с decay) и подстраиваются под фидбек из бота.
Итоговый FraudScore:
FraudScore = min(100, sum(penalty_i * weight_i))
Adversarial-hardening: ротирую фичи/веса по времени, использую комбинации квантилей (p1/p99, p5/p95), рандомизирую инспекцию 1–3% Buy‑кейсов, аномальные паттерны отправляю на оффлайн‑аудит.
Калибровка: превращаю raw‑score в вероятность через Isotonic Regression (валидация Brier/ECE), затем применяю cost‑sensitive порог. Это даёт сопоставимость сегментов и стабильность P/R.
Topic Classifier
TF-IDF + Logistic Regression • F1-macro 0.84 • <50ms latency
Архитектура:
- TF-IDF Vectorizer (5K+ фичей)
- Logistic Regression с L2 регуляризацией
- Обучение на title + description + posts
Обучение:
- Датасет: 850+ каналов с экспертной разметкой
- GroupShuffleSplit для предотвращения data leakage
- Cross-validation с метрикой F1-macro
Inference:
- Latency: <50ms
- F1-macro: 0.84
- Используется для адаптивных порогов ER по тематикам
Инфраструктура
Docker • PostgreSQL • Redis • Мониторинг
Backend:
- Python 3.11, FastAPI, SQLAlchemy 2.0 (async)
- PostgreSQL 16 для хранения данных и метрик
- Redis для кеширования результатов и очередей
ML Pipeline:
- scikit-learn для topic classification
- pandas, numpy для обработки данных
- Экспертная разметка + active learning
Deployment:
- Docker + docker-compose
- Structured logging с ротацией
- Health checks и мониторинг uptime
Database Schema:
- 7 таблиц: users, channels, posts, metrics, checks, feedback, embeddings
- Индексы на критичных полях
- Асинхронные запросы через SQLAlchemy
API и отчёты
JSON API • XLSX генерация • Примеры интеграции
JSON API пример:
{
"channel": "@example_channel",
"subscribers": 125000,
"fraud_score": 23,
"verdict": "Buy",
"metrics": {
"er_anomaly": 5,
"growth_anomaly": 8,
"cv_stability": 3,
"reactions_anomaly": 2,
"late_views": 0,
"other_anomalies": 5
},
"topic": "entertainment",
"confidence": 0.87
}
XLSX отчёт содержит:
- Channel, Subscribers, ER%, CV, FraudScore, Verdict
- Est.Waste(₽) - оценка потерь бюджета
- Разбивка по подметрикам
- Рекомендации по медиаплану
Ссылки на примеры:
Bottom line
За 4 недели создал систему, которая экономит медиаагентствам 15-25% бюджета и сокращает время аудита в 125 раз. Rule-based scoring с адаптивными порогами даёт Precision@Fraud 0.90 при Recall@Fraud 0.70, обеспечивая прозрачность каждого решения и аудит-трейл для верификации.
Система уже проанализировала 10,000+ каналов и помогла агентствам сэкономить десятки миллионов рублей на неэффективной рекламе.
Кейс описывает реальную систему в продакшене с 10K+ проанализированными каналами.