← Назад к вопросам
Можно ли использовать 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
- Экономия памяти — не нужно One-Hot Encoding, который может сильно увеличить размер данных
- Лучшее качество — Target Encoding часто лучше чем простой Label Encoding
- Меньше кода — не нужно писать preprocessing pipeline
- Обработка пропусков — CatBoost автоматически обрабатывает пропуски в категориях
- Защита от 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.