Собесов

ВК Middle: рекомендации по таргетингу рекламы через кластеризацию/классификатор

ML / Data ScienceКластеризацияСредняяMiddle

Условие

Даны логи событий рекламы одного рекламодателя в двух регионах:

  • device_id, device_type, datetime, ev_type (0=показ, 1=клик), adv_type, region_id, age, gender.

Сформулируйте рекомендации для рекламодателя — какие дополнительные настройки добавить, чтобы улучшить эффективность кампаний (таргетинг по группам, время показа и т. д.). Используйте кластеризацию пользователей или классификатор целевого действия.

Решение

План

  1. EDA: агрегация в pivot по сегментам (region × adv_type × device × age_bin × gender × hour); считаем CTR = clicks / impressions.
  2. Поиск "горячих" сегментов: где CTR заметно выше среднего и n_impressions достаточен (≥ N).
  3. Кластеризация пользователей по поведению (число показов, кликов, времени активности) — найти «кликабельных».
  4. Классификатор клика на уровне показа: features = час, день недели, девайс, возраст, пол, тип рекламы. Обучить градиентный бустинг (LightGBM), посмотреть feature importance / SHAP — это и есть факторы, влияющие на клик.

Реализация

import pandas as pd, numpy as np
from sklearn.cluster import KMeans
from lightgbm import LGBMClassifier
 
df = pd.read_csv("ads.csv", parse_dates=["datetime"])
df["hour"] = df.datetime.dt.hour
df["age_bin"] = pd.cut(df.age, bins=[0, 25, 35, 50, 100], labels=["18-25","26-35","36-50","50+"])
 
# 1) Сегментный CTR
seg_ctr = (df.groupby(["region_id","adv_type","device_type","age_bin","gender","hour"])
             .agg(impr=("ev_type","count"), clicks=("ev_type","sum"))
             .reset_index())
seg_ctr["ctr"] = seg_ctr.clicks / seg_ctr.impr
hot = seg_ctr[(seg_ctr.impr > 1000) & (seg_ctr.ctr > seg_ctr.ctr.median()*1.5)]
 
# 2) Классификатор
X = pd.get_dummies(df[["device_type","adv_type","region_id","age_bin","gender","hour"]])
y = df.ev_type
m = LGBMClassifier().fit(X, y)
fi = pd.Series(m.feature_importances_, index=X.columns).sort_values(ascending=False)

Рекомендации (примерные)

  • Добавить временной таргетинг: «показывать только в часы X–Y», если в эти часы CTR в 2× выше.
  • Девайс: если desktop CTR в N раз выше mobile → cap mobile.
  • Возраст: фокус на наиболее кликабельной когорте.
  • Тип рекламы × регион: разные креативы для разных регионов.
  • Пол × тип: если adv_type=2 на женщинах CTR в 3× выше — пушить.

Подводные камни

  1. CTR ≠ конверсия. Высокий CTR может означать кликбейт, но низкий ROI. В идеале — оптимизировать ROAS.
  2. Симсон: высокий CTR в одном сегменте может быть из-за смещённой выборки.
  3. Class imbalance: кликов в 10–100 раз меньше показов; в LightGBM использовать is_unbalance=True или scale_pos_weight.
  4. Если данные одного рекламодателя — feature importance не обобщается на других.
  5. На малых сегментах (impr < 100) CTR шумный — фильтр обязателен.

Эталонный ответ

Сегментный CTR + бустинг-классификатор клика; рекомендации — таргетинг по комбинациям (час, девайс, возраст, регион) с CTR заметно выше медианы.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти