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

Реклама по возрасту и полу уже не работает: аудитория размыта, а бюджет уходит на тех, кто не готов к покупке. Мы разрабатываем AI-системы аудиторного таргетинга, которые предсказывают вероятность конверсии каждого пользователя и находят похожих на ваших лучших клиентов. Наша команда реализует проект под ключ — от анализа данных до внедрения модели, обеспечивая стабильную работу и поддержку.
Часто задаваемые вопросы

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.

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

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

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142