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

«Может ли CatBoost работать с категориальными признаками без их предварительного кодирования?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, 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 для признаков с высокой кардинальностью.