Обучение XGBoost, LightGBM, CatBoost на табличных данных

Клиент сменил требования на позднем этапе: вместо бинарной классификации потребовалась мультиклассовая. Пришлось пересобирать пайплайн с нуля. Выручили градиентные бустинги — XGBoost, LightGBM и CatBoost. В проекте по скорингу клиентов банка мы столкнулись с дисбалансом классов и 500+ признаками. Бу

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    997
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

Клиент сменил требования на позднем этапе: вместо бинарной классификации потребовалась мультиклассовая. Пришлось пересобирать пайплайн с нуля. Выручили градиентные бустинги — XGBoost, LightGBM и CatBoost. В проекте по скорингу клиентов банка мы столкнулись с дисбалансом классов и 500+ признаками. Бустинги позволили достичь AUC 0.92 без глубокого обучения. Эти алгоритмы — рабочие лошадки ML для табличных структурированных данных. Они доминируют в Kaggle и production там, где нейронные сети пасуют: мало данных, много категориальных фичей, нужна интерпретируемость. Они эффективны на табличных данных с тысячами признаков, не требуют нормализации и устойчивы к пропускам.

Типичный сценарий: данные — таблица с пропусками, категориальными колонками с высокой кардинальностью и несбалансированным таргетом. Градиентный бустинг с правильной настройкой выигрывает у линейных моделей и случайного леса на 3-5% по AUC. Мы тестировали гипотезы на исторических данных — приросты стабильны.

Какие проблемы решаем

Неоптимальные гиперпараметры снижают AUC на 3-5%. Мы используем Optuna с ранней остановкой: 100 итераций за 10-30 минут на 1M строк.

Категориальные признаки с высокой кардинальностью. One-Hot Encoding плодит разреженность. CatBoost решает это native, для LightGBM применяем bayesian target encoding.

Интерпретируемость для бизнеса. SHAP-анализ раскладывает предсказание на вклады признаков — обязательное требование для кредитного скоринга или медицины. Как отмечает оригинальная статья: XGBoost: A Scalable Tree Boosting System (Chen & Guestrin, 2016).

Дисбаланс классов — ещё одна типичная проблема. Бустинги с взвешенными выборками и early stopping помогают сохранить качество на редких событиях.

Почему именно эти алгоритмы?

LightGBM выигрывает по скорости: он обучается в 2-3 раза быстрее XGBoost на датасетах от 100K строк. XGBoost стабильнее на разреженных данных и даёт более сглаженные предсказания. CatBoost не требует кодирования категорий — просто укажите список cat_features. В ансамбле они перекрывают слабости друг друга: stacking даёт прирост AUC 0.5-2% относительно лучшей одиночной модели. Экономия на вычислительных ресурсах до 40% при использовании LightGBM.

Критерий XGBoost LightGBM CatBoost
Скорость обучения Средняя Высокая Высокая
Категориальные признаки Нужен encoding Нужен encoding Нативная поддержка
Память Высокое потребление Низкое Среднее
GPU поддержка Да Да Да
Пропуски в данных Нативно Нативно Нативно

Как мы это делаем

Стек: Python 3.11, LightGBM 4.0, XGBoost 2.0, CatBoost 1.2, Optuna 3.5. Для больших данных используем Dask или Spark, на которых бустинги работают через distributed API. Типичный кейс: прогноз оттока с 1 млн строк и 200+ признаками. После подбора num_leaves=127, learning_rate=0.03, subsample=0.8 AUC вырос с 0.82 до 0.87. Окупаемость пилотного проекта достигается за счёт роста точности прогнозов.

Как избежать переобучения?

Ранняя остановка и регуляризация — ключевые приёмы. Параметры reg_alpha, reg_lambda, min_child_samples контролируют сложность модели. Мы используем кросс-валидацию с 5 фолдами и мониторингом метрики на валидации.

Сравнение производительности

Параметр LightGBM XGBoost (hist) CatBoost
Время обучения (1M x 100 фич) 12 мин 25 мин 18 мин
AUC (дефолтные параметры) 0.78 0.79 0.80
AUC (Optuna optimised) 0.84 0.84 0.85
SHAP-анализ в деталяхSHAP-анализ раскладывает предсказание на вклады каждого признака, что позволяет понять, какие факторы влияют на результат. Это critical для бизнес-задач с требованиями к прозрачности, например, в кредитном скоринге или медицинской диагностике.

Процесс работы

  1. Аналитика. Изучаем распределения, выбросы, корреляции.
  2. Feature engineering. Генерируем признак на основе бизнес-логики (скользящие средние, кросс-таблицы).
  3. Поиск гиперпараметров. Optuna с 100-200 итерациями, кросс-валидация StratifiedKFold.
  4. Обучение и валидация. Оцениваем AUC, precision-recall, калибровку.
  5. Интерпретация. SHAP summary plot и dependence plots для топ-10 фичей.
  6. Деплой. Экспорт в ONNX или PMML, REST API на FastAPI, мониторинг дрейфа.

Реализация

LightGBM: полный pipeline

import lightgbm as lgb from sklearn.model_selection import StratifiedKFold from sklearn.metrics import roc_auc_score import optuna def train_lgbm_with_cv(X: pd.DataFrame, y: pd.Series, n_splits: int = 5) -> lgb.LGBMClassifier: def objective(trial): params = { 'n_estimators': trial.suggest_int('n_estimators', 100, 1000), 'num_leaves': trial.suggest_int('num_leaves', 20, 300), 'max_depth': trial.suggest_int('max_depth', 3, 12), 'learning_rate': trial.suggest_float('learning_rate', 0.005, 0.1, log=True), 'subsample': trial.suggest_float('subsample', 0.6, 1.0), 'colsample_bytree': trial.suggest_float('colsample_bytree', 0.6, 1.0), 'reg_alpha': trial.suggest_float('reg_alpha', 1e-8, 10.0, log=True), 'reg_lambda': trial.suggest_float('reg_lambda', 1e-8, 10.0, log=True), 'min_child_samples': trial.suggest_int('min_child_samples', 5, 100), } cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) scores = [] for train_idx, val_idx in cv.split(X, y): model = lgb.LGBMClassifier(**params, random_state=42, verbose=-1) model.fit( X.iloc[train_idx], y.iloc[train_idx], eval_set=[(X.iloc[val_idx], y.iloc[val_idx])], callbacks=[lgb.early_stopping(50, verbose=False)] ) pred = model.predict_proba(X.iloc[val_idx])[:, 1] scores.append(roc_auc_score(y.iloc[val_idx], pred)) return np.mean(scores) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=100, n_jobs=4) best_model = lgb.LGBMClassifier(**study.best_params, random_state=42) best_model.fit(X, y) return best_model def explain_model(model, X: pd.DataFrame): import shap explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X) shap.summary_plot(shap_values, X, plot_type="bar") top_feature = X.columns[np.abs(shap_values).mean(0).argmax()] shap.dependence_plot(top_feature, shap_values, X) 

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

from catboost import CatBoostClassifier, Pool def train_catboost(X_train: pd.DataFrame, y_train: pd.Series, X_val: pd.DataFrame, y_val: pd.Series, cat_features: list[str]) -> CatBoostClassifier: train_pool = Pool(X_train, y_train, cat_features=cat_features) val_pool = Pool(X_val, y_val, cat_features=cat_features) model = CatBoostClassifier( iterations=1000, learning_rate=0.03, depth=6, l2_leaf_reg=3.0, bootstrap_type='Bayesian', bagging_temperature=1.0, eval_metric='AUC', use_best_model=True, early_stopping_rounds=100, random_seed=42, verbose=100 ) model.fit(train_pool, eval_set=val_pool) return model 

Как настроить стекинг для максимальной точности?

from sklearn.ensemble import StackingClassifier from sklearn.linear_model import LogisticRegression stacking = StackingClassifier( estimators=[ ('lgbm', lgb.LGBMClassifier(**lgbm_best_params)), ('xgb', XGBClassifier(**xgb_best_params)), ('catboost', CatBoostClassifier(**cat_best_params, verbose=0)), ], final_estimator=LogisticRegression(C=0.1), cv=5, stack_method='predict_proba' ) stacking.fit(X_train, y_train) 

Какие ошибки допускают при обучении бустингов?

  • Игнорирование категориальных признаков: используйте CatBoost или правильный encoding.
  • Недостаточная валидация: StratifiedKFold для несбалансированных выборок.
  • Переобучение: ранняя остановка и регуляризация (reg_alpha, reg_lambda).

Что входит в работу (deliverables)

  • Оптимизированная модель с документированными гиперпараметрами.
  • SHAP-отчёт с топ-10 признаками и их влиянием.
  • REST API или ONNX-экспорт.
  • Деплой на production + мониторинг (дрейф данных, падение метрик).
  • Обучение команды заказчика.

Сроки ориентировочно

От 5 рабочих дней на прототип до 3 недель на production-пайплайн. Свяжитесь с нами для консультации по вашему проекту. Закажите пилотный проект, чтобы оценить прирост метрик. Стоимость рассчитывается индивидуально. Получите консультацию по вашему проекту — наши инженеры помогут выбрать оптимальный подход.