Баннер мобильный (3) Пройти тест

XGBoost как альтернатива CatBoost для работы с категориальными данными

Что изменилось в версии 3.1.0

Разбор

30 января 2026

Поделиться

Скопировано
XGBoost как альтернатива CatBoost для работы с категориальными данными

Содержание

    Рассказываем про инструмент для работы с категориальными данными XGBoost, сравниваем его с CatBoost и разбираемся, что полезнее для дата-сайентиста. 

    Для чего нужен XGBoost

    Представьте, что вы работаете с датасетом, содержащим категориальные признаки: product_category, user_city, payment_method. Это не числовые фичи, а дискретные категории, часто в виде строк. Большинство реализаций градиентного бустинга требуют, чтобы все входные признаки были представлены в числовой форме. До недавнего времени это означало необходимость внешней предобработки: применения OrdinalEncoder, OneHotEncoder или более сложных схем кодирования.

    Проблема такого подхода — нарушение согласованности данных (data consistency) между этапами обучения и инференса. Если схема кодировки не сохраняется вместе с моделью, то при предсказании на новых данных легко столкнуться с ошибками: неизвестная категория вызовет исключение, а несовпадение порядка меток приведет к семантически некорректным предсказаниям.

    В XGBoost до версии 3.1.0 поддержка категориальных признаков существовала, но была экспериментальной и не включала механизм сохранения схемы кодировки. Пользователю приходилось вручную обеспечивать одинаковую обработку на всех этапах жизненного цикла модели.

    Как работает новый категориальный ре-кодер XGBoost 3.1.0

    Все изменилось с релизом XGBoost 3.1.0 от 22 сентября 2025 года. В нем появился встроенный категориальный ре-кодер (categorical re-coder) — механизм, который автоматически:

    • извлекает уникальные категории из обучающих данных;
    • преобразует их в целочисленные индексы;
    • сохраняет эту схему кодировки внутри самой модели;
    • применяет ее при инференсе, даже если входные данные поступают в «сыром» виде.

    Как отмечают в официальной документации:

    «Начиная с версии XGBoost 3.1, Python-интерфейс может автоматически выполнять перекодирование новых входных данных. <…> Преобразование обычно происходит в пайплайне предобработки данных пользователя. Чтобы гарантировать корректный результат от XGBoost, пользователь должен поддерживать согласованность этого пайплайна при обработке обучающих и тестовых данных. Начиная с версии 3.1, Python-интерфейс может запоминать схему кодирования и автоматически применять ее во время инференса».

    Чтобы этого достичь, нужно явно указать тип признаков — либо через dtype=»category» в Pandas DataFrame, либо через параметр feature_types при создании DMatrix. Например, в интерфейсе scikit-learn:

    import xgboost as xgb
    model = xgb.XGBClassifier(    enable_categorical=True,    tree_method='hist',    device="cuda" # опционально
    ) model.fit(X_train, y_train)

    Или при использовании нативного API:

    Xy = xgb.DMatrix(X, y, enable_categorical=True, feature_types=["q", "c", "c"]) booster = xgb.train({"tree_method": "hist"}, Xy)

    Здесь «c» обозначает категориальный признак, а «q» — количественный (quantitative). Как уточняется в документации: «Для числовых данных тип признака может быть “q” или “float”, а для категориальных признаков он указывается как “c”».

    После вызова model.save_model(‘model.json’) схема кодировки сохраняется вместе с весами деревьев. При загрузке модели через load_model() она готова к работе с теми же категориальными значениями без дополнительной обработки. 

    Важно: для сохранения информации о категориях необходимо использовать формат JSON или UBJSON — бинарный формат сериализации больше не поддерживает сохранение информации о категориях, начиная с версии 3.1.

    Такая функциональность делает XGBoost более конкурентоспособным в задачах с категориальными данными. Однако важно понимать различия между XGBoost и CatBoost.

    Архитектурные различия между XGBoost и CatBoost

    CatBoost, разработанный с нуля для эффективной работы с категориями, использует специализированные методы обработки: например, ordered target statistics и встроенную защиту от переобучения при кодировке. Он не требует предварительного преобразования категорий и стабильно работает даже при высокой кардинальности (миллионы уникальных значений в одной фиче).

    XGBoost, напротив, реализует категориальную поддержку поверх своего гистограммного движка (tree_method=’hist’). Это накладывает ограничения: число уникальных категорий в одном признаке рекомендуют держать в разумных пределах (обычно до нескольких тысяч). При очень высокой кардинальности объем памяти, необходимый для построения гистограмм, может стать критическим, а время обучения — расти нелинейно.

    Кроме того, XGBoost по умолчанию применяет one-hot encoding для категорий с малым числом уникальных значений (до max_cat_to_onehot, по умолчанию 4), а для остальных — оптимальное партиционирование (optimal partitioning), при котором категории группируются по схожести градиентов. Это отличается от подхода CatBoost, который использует статистическую кодировку на основе целевой переменной, что часто дает лучшее качество на разреженных или шумных данных.

    Для наглядности сравним ключевые характеристики:

    Характеристика
    XGBoost 3.1.x
    CatBoost
    Метод обработки категорий
    One-hot (при малой кардинальности) или оптимальное партиционирование (v ∈ {categories})
    Ordered Target Encoding с защитой от утечки целевой переменной
    Автоматизация
    Требует enable_categorical=True и явного указания dtype=»category»
    Полностью автоматическая обработка «из коробки»
    Защита от переобучения
    Регуляризация L1/L2, гиперпараметры
    Архитектурное решение: Ordered Boosting
    Скорость обучения
    Часто быстрее на больших выборках благодаря оптимизации гистограмм
    Может быть медленнее из-за вычисления статистик по категориям
    Поддержка строк
    Да, нативно
    Да, нативно
    Сохранение схемы кодировки
    Да, только в Python-интерфейсе (начиная с 3.1)
    Да, всегда

    Что выбрать: XGBoost и CatBoost?

    Когда лучше использовать XGBoost? Если вы запускаете MVP или работаете в стартапе, где критически важны скорость и простота, то смело используйте XGBoost. Вы сможете передать «сырые» данные с текстовыми категориями, получить рабочую модель за минуты и не тратить время на настройку пайплайнов кодирования. Особенно это ценно, когда вы быстро проверяете гипотезы или строите прототип для демоверсии продукта.

    Если вы разрабатываете production-систему для долгосрочной эксплуатации — например, скоринговую модель для банка, рекомендательную систему или прогноз спроса в ритейле, — то отдайте предпочтение CatBoost. Его архитектура изначально ориентирована на устойчивость к переобучению и работу с «грязными», высококардинальными категориями. Даже если данные со временем изменятся (появятся новые города, товары, статусы), CatBoost будет стабильнее вести себя на инференсе.

    Если вы уже используете XGBoost в продакшене и хотите упростить пайплайн — попробуйте миграцию на enable_categorical=True. Это снизит количество ошибок, связанных с несогласованной предобработкой, и упростит деплой. Но обязательно проведите A/B-тестирование, особенно если в ваших данных есть признаки с тысячами уникальных значений.

    Коротко о XGBoost 3.1.0

    XGBoost 3.1.0 — полноценная альтернатива CatBoost для задач с умеренной кардинальностью категорий, где важны скорость и простота развертывания. Однако CatBoost по-прежнему считается лидером по точности на «тяжелых» категориальных данных и смешанных датасетах благодаря своим уникальным алгоритмам кодирования, которые предотвращают утечку целевой переменной.

    Разбор

    Поделиться

    Скопировано
    0 комментариев
    Комментарии