ML Advertising
1.21K subscribers
137 photos
13 videos
2 files
193 links
Пишу про AdTech, AI и разработку

Для связи: @evgenii_munin
Download Telegram
Мультирегиональная репликация Apache Kafka: кластерные топологии

Статья о том, какую топологию может иметь кластер Apache Kafka при межрегиональной репликации по нескольким ЦОД и как это реализовать. Плюс описывается, чем брокеры-наблюдатели отличаются от подписчиков в Confluent Server и при чем здесь конфигурация подтверждений acks в продюсере.

Для репликации в нескольких регионах кластер Kafka может иметь следующую топологию:

- растянутые кластеры (stretched clusters), когда один кластер Kafka устанавливается в нескольких ЦОД. При этом используется протокол синхронной репликации Kafka.

- связанные кластеры (connected clusters) с асинхронной репликацией в нескольких регионах. В этом случае может использоваться внешняя система для копирования данных из одного или нескольких кластеров в другой.

Преимущество растянутого кластера в том, что он сохраняет смещения, а также обеспечивает быстрое аварийное восстановление и автоматическое переключение клиента при сбое без дополнительного кода.
👍1🔥1
Где будет жить модель: в облаке или на девайсе?

📱 Девайс
К модели есть автономный доступ без интернета, входные данные не отправляются на третью сторону, нет расходов на сервер

Правда, стоит держать в уме, что если у вас сложная хитрая архитектура модели, которая включает еще и препроцессинг, то скорее всего ее будет непросто уложить на девайс. В таком случае всю логику с условиями надо будет переписать на тензорную арифметику

Например, можно рамещать ML модели, например, на смартфоны и платы Raspberry Pi, Arduino. Для этих целей предусмотрены соответствующие либы
- TensorFlow Lite
- Core ML от Apple
- Pytorch Mobile

☁️Облако
Можно использовать большую модель, легко обновлять у всех пользователей, масштабировать. Сейчас существует много удобных сервисов, которые сертифицированы по privacy и выставляют счета on-demand.

На том же AWS предлагаются образы AMI, с помощью которых ML либы предустанливаются на машину
🔥2👍1
tqdm для pandas

Небольшой hint по препроцессингу данных.
Есть такая удобная библиотека tqdm, которая позволяет прикреплять прогресс бар для циклических операций. В работе с pandas зачастую приходится применять циклы к датафреймам через метод apply (хотя это и не всегда оптимально). Если датафрейм большой, то это может занять много времени (поскольку pandas нагружает только один поток, но как бороться с этим поговорим отдельно). И чтобы понимать, сколько это займет времени можно воспользоваться расширением progress_apply в tqdm


tqdm.auto import tqdm
tqdm.pandas()

result = df.progress_apply(lambda row: row['label']+2, axis=1)


Достаточно инициировать tqdm для пандаса и использовать progress_apply вместо apply.

#mltips
👍11
Введение в Ad Tech

Начинаю цикл постов по введению в цифровую рекламу Ad Tech. В качестве источника воспользуюсь методичками Jounce Media Little Black Book.

Сегодня начнем с описания специфических для индустрии терминов.

Издатель (Publisher): Продавец рекламного инвентаря (рекламных мест) — веб-сайт или приложение. Также известен как сторона продажи или сторона предложения.

Рекламодатель (Advertiser): Покупатель рекламного инвентаря. Также известен как сторона покупки или сторона спроса.

Ad Exchange: Платформа, проводящая аукционы в реальном времени (Real Time Bidding или RTB). Платформы стороны предложения (Supply Side Platform SSPs) управляют аукционами и взаимодействуют с издателем.

Bidder: Платформа, покупающая рекламный инвентарь. Платформы стороны спроса (Demand Side Platform DSPs) аггрегируют участников торгов на стороне рекламодателей.

Client Side: Всё, что происходит на устройстве пользователя (в браузере и приложении)

Server Side: Все операции, которые происходят удаленно от пользователя, на серверах ad tech платформ и аггрегаторах.

#adtech
👍5
ML Advertising
Photo
Feature Selection by Variance Threshold

Продолжаем #mltips . Сегодня затронем вопрос отбора фичей, а конкретней отбор по порогу дисперсии.

Дисперсия - это мера изменчивости данных. Фича с нулевой дисперсией статична. Фича с около-нулевой дисперсией так же будет мало полезной для модели. Поэтому такие фичи следует удалять.

В sklearn есть метод VarianceThreshold, он удаляет фичи из датасета по порогу дисперсии

Также подход можно кастомизировать следующим образом: посчитаем соотношение самого частого значения в каждой колонке ко второму самому частому значению. Чем больше это отношение, тем хуже. Колонки с самым большим значением можно удалить.


top_values = {}
for col in df.columns:
tv = df[col].value_counts(dropna=True)
if len(tv) > 1:
tv = tv.values[0] / tv.values[1]
top_values[col] = tv
top_values = pd.Series(top_values).sort_values(ascending=False)

plt.figure(figsize=(20,4))
sns.barplot(x=top_values.index, y=top_values).set_title('Соотношение самого частого значения ко второму самому частому значению')
plt.xlabel('Колонки')
plt.ylabel('Соотношение');
plt.xticks(rotation=90);
👍71
👍2
ML Advertising
Photo
Real Time Bidding

Продолжаем введение в Ad Tech. Сегодня поговорим про аукционы в реальном времени (Real Time Bidding RTB).

1️⃣ Как это работает?
Цепь доставки display рекламы можно описать следующим образом:
- когда издатель решает продать рекламное место, он это делает через цеопчку посредников
- Publisher Ad Server. Аггрегеторы на стороне предложения собирают инвентарь на продажу одновременно с нескольких издателей
- SSP или Ad Exchange. Платформа, которая проводит аукцион на покупку рекламного места
- DSP. Платформы-аггрегаторы на стороне спроса. Собирают рекламодателей или рекламные агентства и от их лица делают ставки на RTB аукционе


2️⃣ Bid Request & Bid Response
На каждое продаваемое рекламное место SSP проводит аукцион
- Для этого она отправляет запросы ставок (Bid Request) на партнерские DSP. В состав Bid Request могут входить
- контекстные данные об издателе: сайте или приложении, формат рекламного места, допустимый формат креатива (banner, native, video), наличие ограничений по brand-safety
- данные о пользователе, полученные из cookie
- настройки аукциона (время таймаута, floor price etc.)
- Несмотря на то, что различных издателей, SSP и DSP достаточно много, общение между ними происходит по стандартному протоколу OpenRTB
- DSP-участники аукциона оценивают запрос, чтобы понять, соответсвует ли он критериям рекламных кампаний клиентов, и если да, то какова его ценность для рекламодателя
- После этого участники отправляют ответ (Bid Response) со ставкой обратно на SSP. Победивший в аукционе DSP выставляет креатив своего клиента на купленное рекламное мести для показа.


3️⃣ Auction Price
Как разрешается аукцион, и сколько платит победитель? Ранее RTB аукционы работали по модели 2й цены (second-price auctions), при котором победитель платит цену (цена, выплаченная в аукционе называется Clearing Price), второго по величине участника. Издатели также могут выставлять цену, ниже которой ставки не принимаются (Floor Price).

В настоящее время чаще всего проводятся аукционы первой цены (first-price auctions), в которой победитель платит свою собственную ставку. Это помогает сделать аукцион более прозрачным для издателя и аудита.

#adtech
👍3🔥2
Adversarial Validation

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

Часто бывает, что отправляем в платформу предсказания, а скор сильно ниже чем на локальной валидации. Одной из причин может быть несоответствие распредлений между трейном и тестом.

Проверяем соответствие распредлений фич на трейне и тесте. Для этого прибегают к методу Adversarial Validation. Суть его проста - научить модель отличать трейн от теста.

Как работает алгоритм?
- объединяем фичи трейна и теста в новом датафрейме
- формируем бинарный таргет: строки из трейна помечаем как 0, из теста - как 1.
- обучаем модель бинарной классификации
- считаем скор (проще всего взять ROC AUC) и формируем при небходимости Feature Importance
- далее смотрим на две вещи
- высокий скор, например, ROC AUC > 85% - это означает, что модель хорошо отличает трейн от теста, значит есть фичи, которые нужно удалять
- чтобы эти фичи найти, смотрим Feature Importance. Фичи с аномально высокой важностью удаляем из датасета
- обучаем модель заново и смотрим ROC AUC. Если он снизился, значит мы на правильном пути и трейн и тест начинают соответствовать друг другу

На каггле есть отличный ноутбук, описывающий и применяющий на практике Adversarial Validation

#mltips
👍5🔥31
👍1
ML Advertising
Photo
Header Bidding

Сегодня речь пойдет о том, что такое Header Bidding (HB) и зачем он нужен паблишерам.

1️⃣ Publisher Waterfall
Почти все платформы-посредники в ad tech (и SSP, и DSP) работают по принципу каскада, т.е. монетизируют продаваемый рекламный инвентарь в порядке важности. Традиционно издатели назначают уровни приоритета в каскадах для разных DSP и разного спроса (например Programmatic или Direct Sold), исходя из исторической доходности с каждого DSP. Хотя с одной стороны это может показаться логичным, то что спрос искусственно ограничивается в длительной перспективе может привести к упущенной выгоде. Поэтому, чтобы выровнять каскад и повысить выручку паблишеров и был придуман механизм Header Bidding

2️⃣ Как работает Header Bidding?
Header Bidding позволяет паблишерам выбирать, какой канал спроса позволяет наилучшим образом монетизировать показы их инвентаря. Чтобы это сделать паблишер отправляет запросы через Header Bidding адаптеры (Prebid, Index, Publica, Google Authorized Buyers, Freewheel, Spring Serve) которые пробоводят аукцион между SSP. Таким образом вдобавок к RTB аукциону между DSP добавляется еще один внешний аукцион, в котором уже SSP конкурируют за покупку рекламного места. Это и помогает выровнять каскад спроса так, чтобы у рекламодателей разного уровня (с разными условиями рекламного контракта) были равные шансы на покупку инвентаря.

3️⃣ Преимущества и недостатки Header Bidding
После проведения дополнительного HB аукцион между SSP, издателям получают максимальную выручку за показ рекламного места. Но с добавлением нового аукциона увеличивается и время доставки рекламы до пользователя. Это может приводить к задержкам, которые плохо влияют на KPI, например по кликам или полноте просмотра (пользователь может уходить, не дождавшись загрузки креатива)

#adtech
👍41
Сегодня очень простой #mltips

Как избавиться от выбросов в данных?

С помощью стандартного отклонения. Задаем X - множитель для стандартного отклонения; обычно в пределах 2-4

col = 'col_name'
x = 2 # множитель

upper_lim = df[col].mean() + df[col].std() * x
lower_lim = df[col].mean() - df[col].std() * x

df = df[(df[col] > lower_lim) & (df[col] < upper_lim)]


С помощью перцентилей. Чаще всего задают 5/95 или 1/99 персентили

col = 'col_name'

upper_lim = df[col].quantile(.99) # .95
lower_lim = df[col].quantile(.01) # .05

df = df[(df[col] > lower_lim) & (df[col] < upper_lim)]


Частным случае этого метода является фильтрация по межквартильному размаху IQR. Исключаем все значения, выходящие за пределы 1.5 * IQR от 25-го и 75-го перцентиля

col = 'col_name'

q1 = df[col].quantile(0.25)
q3 = df[col].quantile(0.75)
iqr = q3 - q1

df = df[~((df[col] < (q1 - 1.5 * iqr)) | (df[col] > (q3 + 1.5 * iqr)))]


Также еще можно не удалять строчки с выбросами, а заменять их значения на медиану в колонке

median = df[col].median()
df['col_name_replaced'] = np.where(((df[col] < (q1 - 1.5 * iqr)) | (df[col] > (q3 + 1.5 * iqr))), median, df[col])
👍3🔥1
Pseudo Labeling

В условиях, когда у вас мало размеченных данных на помощь может прийти метод псевдо-лейблинга. Это метод обучения на не размеченных данных.

Он может использоваться следующим образом
- обучаете модель на трейне
- делаете предсказания на тесте. В частном случае для классификации можно отфильтровать только те пример, где предсказанная вероятность >0.9
- объединяете трейн + тест и заново обучаете модель. Здесь важно валидироваться только на данных из трейна, поскольку в тесте будут и ошибочно размеченные данные
- заново предсказать на тест

При таком подходе модель увидит больше данных и закономерностей. А чем больше данных, тем точнее модель. Здесь в качестве примере наглядный ноутбук с каггла с демонстрацией метода

#mltips
🔥5👍2
Pycaret

Прежде чем строить сложную модель рекомендуется построить простой бейзлайн, чтобы былл с чем сравнивать повышение качества. Чтобы не изобретать колесо с выбором модели и параметров в пайплайн, можно использовать пакеты, которые строят сразу множество моделей.

Для этих целей есть Pycaret. Это враппер над основными библиотеками в том числе и для подбора параметров sklearn, CatBoost, Optuna, Hyperopt etc.

#mltips
👍4🔥2
⚡️ Большая шпаргалка-учебник по ML

Здесь и основная теория по Machine Learning, и примеры реализации конкретных ML-алгоритмов — в общем, самое то, чтобы освежить базу перед собеседованием
👍8🔥1
Learning rate scheduler в классических моделях

Планировщик, scheduler, когда learning rate уменьшается с каждой эпохой. В сетках это вполне обыденная вещь. В классических модель такая вещь чаще всего не встречается. Но в LGBM есть возможность настроить динамический learning rate


model = lgb.train(
params,
train_df,
learning_rates = lambda iter: 0.5 * (0.85 ** iter),
valid_sets = eval_df)


#mltips
👍4🔥3
Кросс-валидация временных рядов

Существует известный способ разбиения временных данных для кросс-валидации из sklearn TimeSeriesSplit

На практике могут применяют более разнообразные способы разбиения временных рядов, например:
- Expanding Window
- Sliding Window

Дальше можно экспериментировать по усмотрению
- Добавить нахлесты между периодами
- Добавить пробелы между трейном/ валидацией
- Если данные партиционированы по часам, можно в качестве фолдов могут выбирать часы целиком

В Sklearn не все кастомные методы доступны, поэтому нужно либо писать свой код со сплитами, либо пользоваться open-source обертками под sklearn, например TSCV

#mltips
👍52🔥1