Может ли CatBoost работать с категориальными признаками без их предварительного кодирования?

Ответ

Да, CatBoost — это градиентный бустинг, который изначально и эффективно работает с категориальными признаками. Одна из его ключевых особенностей — встроенная обработка таких признаков без необходимости в ручном One-Hot, Label или Target Encoding.

Как это работает:

  1. Вы указываете индексы категориальных столбцов при создании модели через параметр cat_features.
  2. CatBoost применяет упорядоченное кодирование (Ordered Target Encoding), которое вычисляет статистику на основе порядка объектов в датасете. Это помогает избежать target leakage (утечки целевой переменной) — частой проблемы при стандартном Target Encoding.
  3. Алгоритм эффективно обрабатывает редкие категории и новые значения, которые могли не встретиться в обучающей выборке.

Практический пример:

import pandas as pd
from catboost import CatBoostClassifier, Pool

# Данные с категориальным признаком 'city' и числовым 'age'
df = pd.DataFrame({
    'city': ['London', 'Paris', 'London', 'Berlin', 'Paris'],  # Категориальный
    'age': [25, 30, 35, 28, 40],
    'target': [1, 0, 1, 0, 1]
})

X = df[['city', 'age']]
y = df['target']

# Указываем, что первый признак (индекс 0) — категориальный
model = CatBoostClassifier(
    cat_features=[0],  # Индекс столбца 'city'
    iterations=100,
    verbose=False
)
model.fit(X, y)

# Предсказание для новых данных, включая новую категорию 'Madrid'
new_data = pd.DataFrame({'city': ['Paris', 'Madrid'], 'age': [33, 27]})
predictions = model.predict(new_data)
print(predictions)

Преимущества подхода CatBoost:

  • Экономия времени: Нет этапа предобработки и кодирования.
  • Качество: Специальные методы кодирования снижают риск переобучения.
  • Удобство: Автоматическая обработка новых и редких категорий в тестовых данных.
  • Производительность: Более эффективно по памяти, чем One-Hot Encoding для признаков с высокой кардинальностью.

Ответ 18+ 🔞

Ну вот, смотри, классическая история: сидит очередной дата-саентист, весь такой умный, и начинает городить огород вокруг категориальных признаков. One-Hot тут, Label Encoder там, Target Encoding с подвохом. А потом приходит CatBoost и говорит: «Э, сабака сука, расслабься, чувак, я сам всё сделаю».

Вот в чём прикол, ёпта. У CatBoost'а прямо встроена хитрая жопа, которая с категориями работает на раз-два. Ты ему просто пальцем показываешь: «Вот эти колонки — категориальные, мудила». Он кивает и делает своё волшебство под названием упорядоченное кодирование. Суть в том, что он не тупо среднее по таргету считает, а делает это с умом, учитывая порядок объектов, чтобы не было утечки данных. Это, блядь, гениально просто. Ты сам от себя офигеваешь, насколько это удобно.

Как это на практике выглядит, бля буду:

import pandas as pd
from catboost import CatBoostClassifier, Pool

# Допустим, у нас данные про каких-то людей
df = pd.DataFrame({
    'city': ['London', 'Paris', 'London', 'Berlin', 'Paris'],  # Город — вот он, наш категориальный мучитель
    'age': [25, 30, 35, 28, 40], # Возраст, тут всё понятно
    'target': [1, 0, 1, 0, 1] # Целевая переменная
})

X = df[['city', 'age']]
y = df['target']

# Всё, магия начинается тут. Говорим модели: "Слушай, чувак, нулевой столбец — это категория"
model = CatBoostClassifier(
    cat_features=[0],  # Вот этот самый 'city'. Всё, больше ничего не надо!
    iterations=100,
    verbose=False # Чтобы в консоль не плевался лишней хуйней
)
model.fit(X, y)

# А теперь давай предскажем для новых данных, где может быть даже город, которого он раньше не видел!
new_data = pd.DataFrame({'city': ['Paris', 'Madrid'], 'age': [33, 27]})
predictions = model.predict(new_data)
print(predictions)  # И он не сломается! Не будет орать "Unknown category!", а спокойно обработает.

И в чём же, блядь, кайф-то?

  • Время — наше всё. Забудь про этот пиздец с предобработкой. Не надо городить отдельные пайплайны для кодирования. Указал cat_features и поехал дальше пить кофе.
  • Качество не страдает. Его метод кодирования — не тупой, он умный, поэтому переобучиться сложнее. Доверия к нему, в отличие от ручного Target Encoding, — овердохуища.
  • Новые категории — не проблема. Подкинул ему в тесте город «Урюпинск», которого в трейне не было, и он не начнёт истерить, а как-нибудь да обработает. Это пиздец как важно в продакшене.
  • Память не жрёт. One-Hot Encoding для какого-нибудь признака с тысячей уникальных значений — это просто ядрёна вошь, получается матрица размером с Сибирь. CatBoost же работает с этим эффективно.

Короче, если в твоих данных есть категории, и ты не хочешь тратить полдня на их преобразование с риском всё запороть — CatBoost твой выбор. Просто указал и забыл. Ёперный театр, вот это инженерная мысль!