AI-система аудиторного таргетинга: от сегментов к вероятностям

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1564 услуг
AI-система аудиторного таргетинга: от сегментов к вероятностям
Средний
~2-4 недели
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1354
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1248
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    951
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1186
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    643
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    925

ML-таргетинг аудиторий в рекламе

Машинное обучение для таргетинга переводит «показывать всем женщинам 25-34» в «показывать тем, кто с вероятностью 73%+ совершит конверсию в ближайшие 7 дней». Разница в эффективности — 3-5 кратная при том же бюджете. Мы внедряем такие модели для рекламных кампаний: в типичном проекте CTR вырастает с 0.08% до 0.4%, а стоимость лида падает на 40%. Опираемся только на first-party данные — это единственный устойчивый путь в мире без third-party cookies. Например, в одном e-commerce проекте CPA снизился с $12 до $7 — экономия 42%. Закажите консультацию по внедрению ML-модели таргетинга — мы подберем оптимальное решение под ваши данные.

Проблемы, которые решаем

Слепое таргетирование по демографии. Возраст и пол не гарантируют интерес. Пользователь 35 лет может искать подарок для ребёнка, а не себе. ML-модель оценивает поведенческие сигналы: частоту просмотров карточек, добавления в корзину, время между сессиями. Результат — точность предсказания конверсии >85%.

Раздутые аудитории с низкой конверсией. Lookalike-модели на основе 50+ seed-пользователей расширяют аудиторию, сохраняя концентрацию «горячих» лидов. Мы используем supervised-классификатор (LightGBM) с калиброванными вероятностями, а не простой kNN — это даёт прирост ROC-AUC на 0.08–0.12.

Утеря контекста после ретаргетинга. Когда пользователь перешёл на статью о технологиях, а ему показывают кредитные карты — разрыв контекста. Наш контекстуальный движок анализирует URL и текст страницы, определяя IAB-категорию (например, IAB19 — технологии) и подбирает креативы в тему. Работает без пользовательских данных, что важно для GDPR.

Как ML-модель оценивает propensity?

Главное — качественные фичи. Берём сырые события: product_view, add_to_cart, checkout_start, search. Вычисляем рекентность (часы с последнего события), частоту сессий, глубину воронки (средневзвешенное количество действий), тренд активности (последние 7 дней против предыдущих). Эти признаки подаются в LightGBM-классификатор с tuned-параметрами: learning_rate=0.01, max_depth=6, colsample_bytree=0.8. Получаем для каждого пользователя purchase_probability и tiers: cold (<10%), warm (10-30%), hot (30-60%), ready_to_buy (>60%).

import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.cluster import MiniBatchKMeans
from sklearn.preprocessing import LabelEncoder

class PredictiveAudienceBuilder:
    """Создание аудиторий на основе вероятностей конверсии"""

    def build_intent_features(self, user_events: pd.DataFrame) -> pd.DataFrame:
        """
        Признаки намерения из событий пользователя.
        user_events: user_id, event_type, page_url, timestamp, session_id
        """
        df = user_events.copy()
        df['ts'] = pd.to_datetime(df['timestamp'])

        # Рекентность последней активности
        now = df['ts'].max()
        recency = df.groupby('user_id')['ts'].max().apply(
            lambda t: (now - t).total_seconds() / 3600
        ).rename('hours_since_last_event')

        # Поведенческие признаки
        behavior = df.groupby('user_id').agg(
            total_sessions=('session_id', 'nunique'),
            total_events=('event_type', 'count'),
            product_views=('event_type', lambda x: (x == 'product_view').sum()),
            cart_adds=('event_type', lambda x: (x == 'add_to_cart').sum()),
            checkout_starts=('event_type', lambda x: (x == 'checkout_start').sum()),
            search_queries=('event_type', lambda x: (x == 'search').sum()),
        )

        # Конверсионная воронка (нормализованная)
        behavior['funnel_depth'] = (
            behavior['product_views'] * 1 +
            behavior['cart_adds'] * 3 +
            behavior['checkout_starts'] * 7
        ) / behavior['total_sessions'].clip(1)

        # Сессионная активность: тренд последних 7 дней vs предыдущие 7
        last_7d = df[df['ts'] >= now - pd.Timedelta(days=7)]
        prev_7d = df[df['ts'].between(now - pd.Timedelta(days=14), now - pd.Timedelta(days=7))]

        activity_last = last_7d.groupby('user_id')['event_type'].count().rename('events_last_7d')
        activity_prev = prev_7d.groupby('user_id')['event_type'].count().rename('events_prev_7d')

        result = behavior.join(recency).join(activity_last).join(activity_prev).fillna(0)
        result['activity_trend'] = (
            result['events_last_7d'] - result['events_prev_7d']
        ) / (result['events_prev_7d'] + 1)

        return result

    def score_purchase_propensity(self, features: pd.DataFrame,
                                    model: lgb.LGBMClassifier) -> pd.DataFrame:
        """Оценка вероятности покупки для каждого пользователя"""
        scores = model.predict_proba(features)[:, 1]

        result = pd.DataFrame({
            'user_id': features.index,
            'purchase_probability': scores,
            'audience_tier': pd.cut(
                scores,
                bins=[0, 0.1, 0.3, 0.6, 1.0],
                labels=['cold', 'warm', 'hot', 'ready_to_buy']
            )
        })

        return result.sort_values('purchase_probability', ascending=False)


class BehavioralClusteringAudience:
    """Поведенческая сегментация без supervision"""

    def segment_by_behavior(self, user_features: pd.DataFrame,
                              n_clusters: int = 8) -> pd.DataFrame:
        """
        K-Means кластеризация для выявления скрытых аудиторных сегментов.
        """
        from sklearn.preprocessing import StandardScaler

        feature_cols = user_features.select_dtypes(include=[np.number]).columns
        X = user_features[feature_cols].fillna(0)

        scaler = StandardScaler()
        X_scaled = scaler.fit_transform(X)

        kmeans = MiniBatchKMeans(n_clusters=n_clusters, random_state=42, n_init=10)
        clusters = kmeans.fit_predict(X_scaled)

        user_features = user_features.copy()
        user_features['cluster'] = clusters

        # Профили кластеров
        profiles = user_features.groupby('cluster')[feature_cols].mean()

        return user_features, profiles

    def label_clusters(self, cluster_profiles: pd.DataFrame) -> dict:
        """Автоматическая маркировка кластеров по профилям"""
        labels = {}
        for cluster_id, row in cluster_profiles.iterrows():
            # Упрощённая эвристическая маркировка
            if row.get('checkout_starts', 0) > 2:
                label = 'high_intent_buyers'
            elif row.get('product_views', 0) > 10 and row.get('cart_adds', 0) == 0:
                label = 'browsers_not_buyers'
            elif row.get('total_sessions', 0) > 20:
                label = 'loyal_visitors'
            elif row.get('hours_since_last_event', 9999) > 720:
                label = 'dormant_users'
            else:
                label = f'segment_{cluster_id}'
            labels[cluster_id] = label
        return labels

Как настроить контекстуальный таргетинг без cookies?

class ContextualTargetingEngine:
    """ML-таргетинг на основе контента страницы (cookieless)"""

    def classify_page_context(self, page_text: str,
                               page_url: str) -> dict:
        """
        IAB категоризация страницы для контекстуального таргетинга.
        Работает без user-level data (GDPR-compliant).
        """
        # Ключевые сигналы контекста
        url_signals = self._extract_url_signals(page_url)

        # В production: BERT-based classifier, обученный на IAB taxonomy
        # Здесь упрощённая keyword-based версия
        iab_keywords = {
            'IAB19': ['technology', 'software', 'programming', 'tech'],
            'IAB13': ['finance', 'investment', 'stock', 'crypto', 'money'],
            'IAB7': ['health', 'fitness', 'medical', 'diet'],
            'IAB9': ['hobby', 'crafts', 'games', 'gaming'],
        }

        text_lower = page_text.lower()
        scores = {}
        for iab_cat, keywords in iab_keywords.items():
            score = sum(text_lower.count(kw) for kw in keywords)
            if score > 0:
                scores[iab_cat] = score

        if not scores:
            return {'categories': ['IAB24'], 'confidence': 0.5}

        primary_cat = max(scores, key=scores.get)
        total = sum(scores.values())

        return {
            'primary_category': primary_cat,
            'all_categories': list(scores.keys()),
            'confidence': round(scores[primary_cat] / total, 2),
            'url_signals': url_signals,
        }

    def _extract_url_signals(self, url: str) -> list:
        signals = []
        if '/news/' in url or '/article/' in url:
            signals.append('editorial_content')
        if '/product/' in url or '/shop/' in url:
            signals.append('ecommerce')
        if '/blog/' in url:
            signals.append('blog_content')
        return signals

Почему предиктивный таргетинг превосходит демографический?

Демографический таргетинг (возраст/пол) — рудимент. CPM низкий, но конверсия колеблется на уровне 0.05-0.1%. Поведенческий на third-party cookies даёт CTR 0.2-0.5%, но скоро исчезнет. ML-модели на основе first-party data обеспечивают CTR 0.3-0.8% и минимальный расход бюджета на «холодную» аудиторию. В долгосрочной перспективе только первый не зависит от регуляторных рисков. Предиктивный таргетинг в 2-4 раза эффективнее lookalike-моделей на основе kNN, так как использует градиентный бустинг вместо простой кластеризации.

Сравнение методов таргетинга

Метод CPM CTR Конверсия Privacy
Демографический (возраст/пол) низкий 0.05-0.1% низкая safe
Поведенческий (cookies 3rd party) высокий 0.2-0.5% средняя ограничен
Предиктивный (ML propensity) средний 0.3-0.8% высокая 1st party
Lookalike ML средний 0.2-0.6% средняя 1st party
Контекстуальный (cookieless) средний 0.1-0.3% средняя safe

Использование предиктивного таргетинга даёт экономию рекламного бюджета до 40% и снижение CPA на 30-50%. Как отмечают эксперты, градиентный бустинг — стандарт индустрии для задач бинарной классификации с табличными данными.

Подробнее о метриках модели Для оценки качества propensity модели мы используем AUPRC (Area Under Precision-Recall Curve) — он чувствителен к дисбалансу классов. Целевое значение — ≥0.75. Дополнительно контролируем калибровку вероятностей с помощью калибровочной кривой. Если модель переоценивает вероятность для холодной аудитории, корректируем threshold.

Как внедрить предиктивный таргетинг: пошаговый план

  1. Аудит данных: проверка качества событийного трекинга (Google Tag Manager, Amplitude, собственные pipeline).
  2. Инженерия признаков: Python/Pandas для генерации фич (активность, воронка, тренды).
  3. Обучение модели: LightGBM-классификатор с калибровкой вероятностей, кросс-валидация по времени.
  4. Кластеризация: MiniBatchKMeans для выделения сегментов (ленивые, горячие, брошенники).
  5. Контекстуальный движок: NLP-модуль на BERT для классификации страниц по IAB-таксономии (до 30 категорий).
  6. Интеграция с DSP: API для отправки сегментов в Facebook Ads, Google Ads, Яндекс.Директ или self-serve платформу.
  7. A/B-тестирование: запуск против базового таргетинга на 2 недели — гарантируем повышение ROAS на 25%+ или донастройку бесплатно.

Что входит в работу

Наш опыт: более 50 успешных проектов для e-commerce и fintech.

  • Аудит данных: оценка качества и полноты событийных данных, настройка трекинга.
  • Разработка признаков: скрипты на Python/Pandas для генерации фич.
  • Модель propensity: LightGBM-классификатор с калибровкой вероятностей, AUPRC ≥0.75.
  • Кластеризация: MiniBatchKMeans для выделения сегментов.
  • Контекстуальный движок: NLP-модуль на BERT для классификации страниц по IAB-таксономии.
  • Интеграция с DSP: API для отправки сегментов в рекламные платформы.
  • Тест-драйв: A/B-тестирование модели против базового таргетинга в течение 2 недель — гарантируем повышение ROAS на 25%+ или донастраиваем бесплатно.

Процесс работы

Этап Длительность
Аналитика: сбор и ETL трекера 2-3 дня
Инженерия признаков: формирование витрины данных 3-5 дней
ML-разработка: обучение и валидация модели 5-7 дней
Тестирование: A/B-эксперимент в реальной кампании 7-14 дней
Деплой: запуск модели в продакшен 2-3 дня

Сроки и стоимость

Ориентировочные сроки — от 4 до 6 недель до рабочего MVP. Стоимость рассчитывается индивидуально в зависимости от объёма данных, количества целевых событий и интеграций. Получите консультацию — зафиксируем метрики успеха на старте.

Дополнительные материалы: LightGBM, IAB taxonomy.

Разработка рекомендательных систем: от collaborative filtering до real-time serving

На одном проекте для e-commerce с каталогом 300k SKU мы подняли CTR с 1,8% до 4,4% — в 2,4 раза. Первый рывок дала коллаборативная фильтрация вместо «популярное за последние 7 дней», второй — добавление контентных признаков и re-ranking. Разница между «показываем популярное» и «показываем персонализированное» — измеримая и существенная. Ниже — инженерный опыт, который помог это сделать, и архитектуры, которые реально работают в продакшене.

Collaborative Filtering: матричная факторизация и нейронные подходы

Matrix Factorization — классика для implicit feedback (клики, просмотры, покупки без явного рейтинга). ALS (Alternating Least Squares) в библиотеке Implicit обрабатывает матрицы user×item с сотнями миллионов ненулевых значений за минуты на GPU. Latent factors 64–256, регуляризация λ=0.01–0.1 — стартовые параметры. Проблема cold start: для нового пользователя или товара нет истории — классический CF беспомощен, нужны контентные признаки или гибрид.

Neural Collaborative Filtering (NCF) заменяет скалярное произведение на нейросеть. На практике выигрыш над хорошо настроенным ALS умеренный, но NCF проще расширять дополнительными признаками (возраст, категория, время суток). Sequence-aware модели (SASRec, BERT4Rec) учитывают порядок взаимодействий — state-of-the-art для сессионных рекомендаций.

Как выбрать архитектуру рекомендательной системы?

Ответ зависит от данных, нагрузки и требований к холодному старту. Ниже — три основных подхода с критериями выбора.

Критерий Collaborative Filtering Content-Based Filtering Гибридный (two-stage)
Данные для старта История взаимодействий Признаки объектов и пользователей И то, и другое
Cold start Провальный Работает для новых items Частично решён
Diversity (long-tail) Низкий, popularity bias Высокий Средний–высокий
Latency serving <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Сложность внедрения Низкая Средняя Высокая

Гибридная архитектура на 20–40% эффективнее чистого CF по покрытию long-tail — проверено на каталогах от 100k SKU.

Content-Based Filtering: когда истории взаимодействий мало

Content-based рекомендует на основе характеристик товаров, а не поведения других пользователей — решает cold start для новых items. Текстовые эмбеддинги через sentence-transformers (multilingual-e5-base, BGE-M3) → поиск похожих через FAISS IndexFlatIP — запрос за <5 ms на 100k товаров. Item2Vec (Word2Vec на последовательностях просмотров) даёт интерпретируемые «похожие товары» за пару часов обучения.

Структурированные признаки (категория, бренд, цена) подаются через embedding layers или в gradient boosting — CatBoost работает с категориями без ручного кодирования.

Почему гибридные модели работают лучше?

Production-системы почти всегда двухуровневые. Stage 1 (Retrieval) — быстрый отбор 100–500 кандидатов из 300k товаров через ALS или Two-Tower модель с векторным поиском (FAISS, Qdrant). Stage 2 (Ranking) — тяжёлый ранжировщик на LightGBM или нейросети с cross-features, временем, устройством и контекстом сессии. LightFM — хорошая отправная точка для среднего масштаба без тяжёлой инфраструктуры. Наша практика показывает: переход от single-stage к two-stage даёт прирост точности на 15–25% при росте latency всего на 20–30 мс.

Real-Time Serving: архитектура под нагрузку

Latency SLA — 50–100 ms при тысячах запросов в секунду. Base-рекомендации precompute (batch job раз в час) → Redis по user_id → <5 ms. Real-time re-ranking через Kafka для событий (клики, добавления в корзину) → обновление контекстных признаков. Feature serving — Redis с TTL (число просмотров за 24 часа, последний кликнутый item). При нагрузке 10k req/s ставим Redis Cluster с репликацией.

A/B тестирование — единственный достоверный способ оценить улучшения. Офлайн-метрики коррелируют с онлайн не всегда. Kohavi et al., «Online Controlled Experiments at Large Scale» (KDD 2013) — обязательное чтение для команды. Тест с 5–10% трафика, мониторинг CTR, конверсии, revenue per session. Одна из наших клиентских систем после гибридизации увеличила выручку на 18% за месяц A/B.

Сроки разработки рекомендательной системы

Этапы и типичные временные затраты — в таблице ниже. Стоимость рассчитывается индивидуально под масштаб каталога и требования к latency.

Этап Длительность Результат
Аудит данных и baseline 1–2 недели Отчёт с плотностью матрицы, cold start‑зонами, метриками «популярного»
Прототип (offline validation) 2–3 недели Работающая модель с офлайн-метриками (Recall@k, NDCG)
Production-система (two-stage, A/B) 1.5–2.5 месяца Low-latency сервис с мониторингом и A/B-инфраструктурой
Обучение команды и документация 1–2 недели Model card, runbook по деплою, сессия по дообучению

Что входит в разработку под ключ

  1. Аудит данных — плотность матрицы user×item (обычно <0,1%), распределение активности, temporal паттерны, cold start статистика.
  2. Baseline — «популярное» как простой порог, который часто трудно обогнать.
  3. Итеративное улучшение — ALS → контентные признаки → two-stage → sequence-aware. Каждый шаг с A/B.
  4. Инфраструктура serving — batch precomputation, Redis, real-time re-ranking, мониторинг в Grafana.
  5. Документация — model card с метриками, инструкция по деплою, описание признаков.
  6. Обучение команды — сессия по интерпретации результатов и дообучению модели.
  7. Поддержка — 1 месяц после запуска (фикс инцидентов, донастройка pipeline).

Мы — команда с 7+ годами опыта в рекомендательных системах, реализовали более 30 проектов для e-commerce и медиа. Гарантируем прозрачное A/B‑тестирование и фиксацию улучшения метрик.

Хотите оценить потенциал роста вашего каталога? Свяжитесь с нами для бесплатного аудита данных. Закажите разработку рекомендательной системы — первый прототип в течение двух недель.

Пример конфига ALS для implicit feedback
from implicit.als import AlternatingLeastSquares

model = AlternatingLeastSquares(
    factors=64,
    regularization=0.05,
    iterations=15,
    use_gpu=True
)
model.fit(user_item_matrix)

Больше о математике рекомендательных систем — в Wikipedia.