Вопрос с собеса ВТБ на 360к - как CatBoost кодирует категории под капотом?🦔Зачастую на интервью 300к+ собеседующий не будет полчаса расспрашивать, как обучается бустинг - на таких собесах любят копать в детали, поэтому сегодня разбираем вопрос как CatBoost кодирует категории под капотом?
То, что CatBoost на спокойнычах хавает категориальные фичи из коробки, знают все, а вот на вопросе «а как именно?» посыпаться легко
Главная фишка - Ordered Target Statistics 🤨
Классический Target Encoding code ("Москва") = mean(y | city=="Москва") утекает: в код объекта зашит его собственный таргет, но CatBoost решает это перестановкой.
Формула из доки:
avg_target = (countInClass + prior) / (totalCount + 1)
- countInClass - сколько раз таргет превысил порог среди объектов с той же категорией, обработанных до текущего
- totalCount - сколько таких объектов встретилось до текущего
- prior - сглаживание, спасает редкие категории от вырождения в само значение (0, 1, 2, 3 и т.д.)
Допустим, таргет принимает значения 0 и 1 (бинарная классификация). Порог тут один: y == 1. Тогда:
- countInClass = сколько объектов с той же категорией до текущего имели y == 1
- totalCount = сколько объектов с той же категорией до текущего было всего
- avg_target = (countInClass + prior) / (totalCount + 1) — это просто доля единиц, но сглаженная и посчитанная без текущего объекта
CatBoost делает случайную перестановку выборки (вообще несколько перестановок) и для каждого объекта считает avg_target. Свой таргет в своё кодирование не попадает, а значит утечки нет по построению, несколько перестановок усредняют шум первых объектов.
Ещё есть параметр one_hot_max_size: если уникальных значений в категории мало, включается One-Hot, и avg_target не считается.
Вторая киллер-фича - CatBoost во время обучения сам строит комбинации признаков. Пара city и device склеивается в новый признак city|device, который кодируется тем же Ordered TS
Итог: По категориям считается avg_target по предшественникам на нескольких перестановках, если значений мало - One-Hot, плюс модель сама собирает комбинации категорий.
Наебеньте огней если нравится такой технически-анальный контент 🔥
