← Назад к вопросам

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

2.0 Middle🔥 201 комментариев
#Pandas и обработка данных#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Да, CatBoost может работать с категориальными признаками напрямую, без предварительного кодирования (One-Hot Encoding, Label Encoding и т.д.). Это один из главных преимуществ CatBoost перед другими gradient boosting реализациями.

Как CatBoost обрабатывает категориальные признаки

CatBoost использует специальную технику Ordered Target Encoding (OTE) для обработки категорий:

  • Вместо простого label encoding, CatBoost применяет статистические кодирования, основанные на целевой переменной
  • Для каждого значения категории вычисляется среднее значение целевой переменной (для регрессии) или вероятность класса (для классификации)
  • Это называется Target Encoding и помогает модели лучше использовать информацию в категориальных признаках

Пример использования CatBoost с категориальными признаками

from catboost import CatBoostClassifier
import pandas as pd

# Загружаем данные с категориальными признаками
data = pd.read_csv("data.csv")
X = data[["age", "city", "education", "country"]]
y = data["target"]

# Указываем индексы категориальных признаков
categorical_features_indices = [1, 2, 3]

# Создаём модель
model = CatBoostClassifier(
    iterations=100,
    verbose=False,
    cat_features=categorical_features_indices
)

# Обучаем напрямую
model.fit(X, y)

# Предсказание
predictions = model.predict(X)

Преимущества встроенной обработки категорий в CatBoost

  1. Экономия памяти — не нужно One-Hot Encoding, который может сильно увеличить размер данных
  2. Лучшее качество — Target Encoding часто лучше чем простой Label Encoding
  3. Меньше кода — не нужно писать preprocessing pipeline
  4. Обработка пропусков — CatBoost автоматически обрабатывает пропуски в категориях
  5. Защита от overfitting — специальные техники (Ordered TE) снижают риск переобучения на категориях

Сравнение подходов

# Неправильно - забыли указать категориальные признаки
model = CatBoostClassifier()
model.fit(X, y)  # CatBoost будет рассматривать города как числа!

# Неправильно - сначала кодируем, потом CatBoost
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X["city"] = le.fit_transform(X["city"])
model = CatBoostClassifier()
model.fit(X, y)

# Правильно - указываем категориальные признаки напрямую
model = CatBoostClassifier(cat_features=["city", "education", "country"])
model.fit(X, y)

Важные параметры для работы с категориями

model = CatBoostClassifier(
    cat_features=[1, 2, 3],
    one_hot_max_size=2,
    max_cat_to_expand=0,
    has_time=False,
)

Когда всё-таки нужно предварительное кодирование?

  • Если данные содержат новые категории в test-сете, которых не было в train
  • Если используешь другие модели (XGBoost, LightGBM) — они не поддерживают категории напрямую
  • Если нужна кастомная логика обработки категорий

Рекомендация

Для максимального удобства и качества — всегда используй встроенную поддержку категорий в CatBoost. Это сделает код чище, а модель часто качественнее благодаря интеллектуальному Target Encoding.

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