ML-таргетинг аудиторій: від демографії до предиктивних ймовірностей

Реклама за віком і статтю вже не працює: аудиторія розмита, а бюджет іде на тих, хто не готовий до покупки. Ми розробляємо 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 даних забезпечують CTR 0.3-0.8% і мінімальні витрати бюджету на «холодну» аудиторію. У довгостроковій перспективі лише перший не залежить від регуляторних ризиків. Предиктивний таргетинг кращий за демографічний у 3-5 разів за CTR, а за конверсію — у 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%. Наприклад, в одному проєкті економія склала $10 000 на місяць. Як зазначають експерти, градієнтний бустинг — стандарт індустрії для задач бінарної класифікації з табличними даними.

Детальніше про метрики моделі Для оцінки якості 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 успішних проєктів та 5 років досвіду в ML-таргетингу. Наш досвід: понад 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