Модель оценивает вероятность конверсии бид реквеста в клик в случае показа. Вероятность используется при определении ставки "на лету" в качестве параметра ctr в одной из ставочных функций.
Данные автоматически парсятся из Я.Метрики, Амплитуды и Redash, далее собирается обучающая выборка.
Этапы обучения модели:
- Признаки бид реквестов хэшируются, что позволяет опустить отдельную обработку наблюдений, отсутствовавших в обучающей выборке, а также вносит дополнительный эффект регуляризации. Таким образом, каждому значению любого признака с помощью хэш-функции определяется индекс OHE-признака из диапазона [0, 2**d - 1], где d - параметр.
- На сформированных на предыдущем этапе признаках обучается логистическая регрессия, параметры которой подбираются через алгоритм ftrl-proximal (описание логики и параметров здесь).
Ниже описаны в соответствующих разделах способы запуска процесса обучения модели и применения результатов ее работы при определении ставки.
Запуск из командной строки производится с помощью команды следующего вида:
python main.py -f ./data -o output.json -n 7 -d 18 -alpha .1 -beta 1. -l1 5. -l2 5.
-f FOLDER — путь к папке, в которой хранится старая обучающая выборка;
-o OUTPUT — путь, куда необходимо записать результат;
-n NUM_EPOCH — количество эпох обучения, т.е. сколько раз алгоритм "увидит" ВСЮ обучающую выборку во время обучения (натуральное число, по умолчанию 5);
-d DIM_HASH — параметр, определяющий размерность пространства признаков как 2**d (натуральное число, по умолчанию 18. Т.к. размерность OHE-признаков должна быть достаточно большой, значения d меньше 15 отвергаются);
-alpha ALPHA — параметр
-beta BETA — параметр
-l1 L1 — параметр
-l2 L2 — параметр
Формат данных по бид реквестам со статистикой за месяц выглядит следующим образом:
ts | device_id | language_id | country_id | region_id | site_id | ssp_id | variant_id | os | browser | weekday | hour | click |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2019-06-24 00:15:00 | 4 | 0 | 181 | 2293 | 7820808 | 9 | 253690 | Android | Chrome_Mobile | 0 | 0 | 0 |
2019-06-24 00:15:00 | 2 | 0 | 122 | 757 | 8273606 | 1 | 252470 | Windows | Firefox | 0 | 0 | 0 |
2019-06-24 00:15:00 | 2 | 0 | 181 | 0 | 8072928 | 14 | 252071 | Windows | Chrome | 0 | 0 | 1 |
2019-06-24 00:15:00 | 2 | 0 | 181 | 2293 | 6935759 | 1 | 254136 | Windows | Firefox | 0 | 0 | 0 |
2019-06-24 00:15:00 | 2 | 0 | 20 | 2563 | 6936550 | 1 | 254054 | Windows | Firefox | 0 | 0 | 0 |
Здесь ts - время добавления соответствующего батча данных о показах. Признак при обучении не используется, нужен для процесса обновления обучающей выборки. Предполагается, что данные обновляются каждые 15 минут (можно использовать и другой период). Соответственно, каждые 15 минут заливаются данные о показах за очередные 15 минут, и удаляются данные, которым больше месяца. При этом бид реквесты должны быть отсортированы по времени показа так, чтобы сверху находились наиболее "свежие".
os, browser определяются из user_agent;
weekday - порядковый номер дня недели (0 - пнд, ..., 6 - вскр);
hour - час суток (0, ..., 23).
На выходе записывается файл в формате json со словарем {значение хэш-индекса значения признака: соответствующий коэффициент линейной логистической регрессии}.
Определение вероятности состоит из трех этапов. Для наглядности далее при описании каждого шага будут приводиться соответствующие результаты применения шага для бид реквеста bid_example с, например, такими значениями фичей:
device_id | language_id | country_id | region_id | site_id | ssp_id | variant_id | os | browser | weekday | hour |
---|---|---|---|---|---|---|---|---|---|---|
2 | 0 | 82 | 5084 | 8320901 | 1 | 254689 | Windows | Firefox | 6 | 0 |
Шаг 1. Хэширование значений признаков бид реквеста.
Для хэширования используется 64-битная версия хэш-функции xxhash (реализация на различных языках программирования здесь).
Для каждого признака бида производится "склейка" названия признака и его значения, т.е. если, например, признак device_id имеет значение 2, то результатом будет являться строка "device_id_2". Для bid_example результатом будет:
device_id | language_id | country_id | region_id | site_id | ssp_id | variant_id | os | browser | weekday | hour |
---|---|---|---|---|---|---|---|---|---|---|
device_id_2 | language_id_0 | country_id_82 | region_id_5084 | site_id_8320901 | ssp_id_1 | variant_id_254689 | os_Windows | browser_Firefox | weekday_6 | hour_0 |
Затем "склееные" значения подаются на вход хэш-функции, и от результата рассчитывается остаток от деления на 2**d. Для bid_example получаем:
device_id | language_id | country_id | region_id | site_id | ssp_id | variant_id | os | browser | weekday | hour |
---|---|---|---|---|---|---|---|---|---|---|
167329 | 44659 | 13009 | 232542 | 150310 | 149569 | 14111 | 44923 | 184725 | 205066 | 245494 |
Шаг 2. Суммирование весов, определяемых по словарю по индексам, полученным на Шаге 1.
С помощью индексов, определенных на предыдущем шаге, по словарю определяются соответствующие веса, далее вычисляется общая сумма весов, в которую также входит вес для нулевого индекса (соответствует константе в линейной модели).
Пусть словарь, сформированный при обучении модели, выглядит следущим образом:
{'0': -0.31944, ...,
'13009': -0.01683, ...,
'14111': -0.02512, ...,
'44659': -0.0284, ...,
'44923': -0.01824, ...,
'149569': -0.03576, ...,
'150310': -0.03167, ...,
'167329': -0.04099, ...,
'184725': -0.00536, ...,
'205066': -0.04627, ...,
'232542': -0.02499, ...,
'245494': -0.00511, ...}.
Тогда для bid_example веса для каждого признака получатся следующими:
device_id | language_id | country_id | region_id | site_id | ssp_id | variant_id | os | browser | weekday | hour |
---|---|---|---|---|---|---|---|---|---|---|
-0.04099 | -0.0284 | -0.01683 | -0.02499 | -0.03167 | -0.03576 | -0.02512 | -0.01824 | -0.00536 | -0.04627 | -0.00511 |
а сумма весов :
Шаг 3. Применение логистической функции к сумме весов, полученных на Шаге 2.
Вероятность конверсии из суммы весов, полученной на предыдущем шаге, получается по формуле:
Для bid_example вероятность конверсии: