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

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
ML-таргетинг аудиторій: від демографії до предиктивних ймовірностей
Середній
~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 даних забезпечують 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.

Розробка рекомендаційних систем: від 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.