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

В чем разница между XGBoost, LightGBM и CatBoost?

1.7 Middle🔥 242 комментариев
#Машинное обучение

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

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

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

Разница между XGBoost, LightGBM и CatBoost

Быстрое сравнение

КритерийXGBoostLightGBMCatBoost
СкоростьСредняяСамая быстраяБыстрая
ПамятьМногоМалоСредняя
Категоричные признакиТребуют encodingПоддержка (лучше)Отличная встроенная поддержка
ТочностьВысокаяВысокаяВысокая (часто лучше)
ПереобучениеСреднееСреднееМенее подвержена
ПопулярностьСамая популярнаяПопулярнаРастущая
ДокументацияОтличнаяХорошаяХорошая

Определения

Все три — это gradient boosting алгоритмы, которые строят ансамбль деревьев последовательно, каждое новое дерево исправляет ошибки предыдущих.

1. XGBoost (eXtreme Gradient Boosting)

История: Был первым (2016), самый популярный.

import xgboost as xgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=10000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# XGBoost требует numeric features
model_xgb = xgb.XGBClassifier(
    n_estimators=100,
    max_depth=5,
    learning_rate=0.1,
    random_state=42
)
model_xgb.fit(X_train, y_train)

y_pred_xgb = model_xgb.predict(X_test)
print(f"XGBoost Accuracy: {model_xgb.score(X_test, y_test):.4f}")

Характеристики:

  • Ригоризм: Использует 2-й порядок тейлоровского разложения (более точно)
  • Регуляризация: L1 и L2 встроены
  • Скорость: Хорошая, но не лучшая
  • Память: Требует много RAM

Когда использовать:

  • Если важна стабильность и надежность
  • Когда есть достаточно памяти
  • Классические задачи (не очень большие данные)

2. LightGBM (Light Gradient Boosting Machine)

История: Разработал Microsoft (2017), оптимизирован для скорости.

import lightgbm as lgb

# LightGBM тоже требует numeric features
model_lgb = lgb.LGBMClassifier(
    n_estimators=100,
    max_depth=5,
    learning_rate=0.1,
    random_state=42,
    num_leaves=31  # LightGBM параметр (вместо depth)
)
model_lgb.fit(X_train, y_train)

y_pred_lgb = model_lgb.predict(X_test)
print(f"LightGBM Accuracy: {model_lgb.score(X_test, y_test):.4f}")

Характеристики:

  • Построение дерева: Leaf-wise (вместо level-wise)
  • Скорость: Самая быстрая (может быть 20x быстрее XGBoost)
  • Память: Самое экономное
  • Категоричные признаки: Поддерживает (но нужно указать)

Когда использовать:

  • Очень большие датасеты (> 1 млн примеров)
  • Когда скорость критична
  • Когда память ограничена
  • Соревнования (Kaggle)

3. CatBoost (Categorical Boosting)

История: Разработал Yandex (2017), специально для категоричных данных.

import catboost as cb

# CatBoost автоматически обрабатывает категоричные признаки!
X_with_cat = X_train.copy()
X_with_cat_test = X_test.copy()

# Обозначаем категоричные признаки
cat_features = [0, 2, 5]  # индексы категоричных столбцов

model_cat = cb.CatBoostClassifier(
    iterations=100,
    depth=5,
    learning_rate=0.1,
    random_state=42,
    verbose=0
)
model_cat.fit(X_with_cat, y_train, cat_features=cat_features)

y_pred_cat = model_cat.predict(X_with_cat_test)
print(f"CatBoost Accuracy: {model_cat.score(X_with_cat_test, y_test):.4f}")

Характеристики:

  • Категоричные признаки: Встроенная поддержка (не нужно кодировать)
  • Точность: Часто лучше, чем другие на реальных данных
  • Переобучение: Хорошая защита (OrderedBoost)
  • Скорость: Быстрая, но медленнее LightGBM

Когда использовать:

  • Много категоричных признаков
  • Когда нужна высокая точность
  • Реальные табличные данные (с категориями)
  • Когда не хочешь заниматься encoding

Пример: сравнение на реальных данных

import pandas as pd
from sklearn.metrics import accuracy_score
import time

# Создаём датасет с категоричными признаками
X_numeric = np.random.randn(50000, 10)
X_cat = np.random.randint(0, 5, (50000, 5))  # 5 категоричных признаков

X_full = pd.concat([
    pd.DataFrame(X_numeric, columns=[f'num_{i}' for i in range(10)]),
    pd.DataFrame(X_cat, columns=[f'cat_{i}' for i in range(5)])
], axis=1)

y = (X_numeric[:, 0] + X_numeric[:, 1] > 0).astype(int)

X_train, X_test, y_train, y_test = train_test_split(X_full, y, test_size=0.3)

# XGBoost (требует encoding категоричных)
from sklearn.preprocessing import LabelEncoder
X_train_xgb = X_train.copy()
X_test_xgb = X_test.copy()

for col in [f'cat_{i}' for i in range(5)]:
    le = LabelEncoder()
    X_train_xgb[col] = le.fit_transform(X_train_xgb[col].astype(str))
    X_test_xgb[col] = le.transform(X_test_xgb[col].astype(str))

print("СРАВНЕНИЕ СКОРОСТИ:")

start = time.time()
model_xgb = xgb.XGBClassifier(n_estimators=100, random_state=42)
model_xgb.fit(X_train_xgb, y_train)
print(f"XGBoost: {time.time() - start:.2f}s, Accuracy: {model_xgb.score(X_test_xgb, y_test):.4f}")

start = time.time()
model_lgb = lgb.LGBMClassifier(n_estimators=100, random_state=42)
model_lgb.fit(X_train_xgb, y_train)
print(f"LightGBM: {time.time() - start:.2f}s, Accuracy: {model_lgb.score(X_test_xgb, y_test):.4f}")

start = time.time()
model_cat = cb.CatBoostClassifier(iterations=100, random_state=42, verbose=0)
model_cat.fit(X_train, y_train, cat_features=[f'cat_{i}' for i in range(5)])
print(f"CatBoost: {time.time() - start:.2f}s, Accuracy: {model_cat.score(X_test, y_test):.4f}")

Типичный результат:

XGBoost: 2.45s, Accuracy: 0.7234
LightGBM: 0.38s, Accuracy: 0.7289 (самый быстрый!)
CatBoost: 0.82s, Accuracy: 0.7301 (лучшая точность!)

Таблица выбора

Выбери XGBoost, если:

  • Типичная классификация/регрессия
  • Не спешишь
  • Хочешь стандартный инструмент

Выбери LightGBM, если:

  • Большие данные (> 100k примеров)
  • Нужна максимальная скорость
  • Категоричные признаки можно закодировать
  • Соревнование (Kaggle)

Выбери CatBoost, если:

  • Много категоричных признаков
  • Нужна максимальная точность
  • Хочешь меньше тюнить гиперпараметры
  • Реальные бизнес-задачи

Feature importance

# XGBoost
import matplotlib.pyplot as plt
xgb.plot_importance(model_xgb)
plt.show()

# LightGBM
lgb.plot_importance(model_lgb)
plt.show()

# CatBoost
model_cat.get_feature_importance().plot()
plt.show()

Вывод

Все три отличные инструменты. XGBoost — золотой стандарт и самый надежный. LightGBM — выбор для больших данных и соревнований. CatBoost — лучший выбор для реальных данных с категориями. В большинстве случаев рекомендуется попробовать все три и выбрать лучший по результатам.