scikit-learnMiddleAlgorithms

В чём разница между bagging и boosting? Назовите реализации каждого из них в scikit-learn.

Bagging обучает модели параллельно на бутстрап-выборках и усредняет результат (снижает дисперсию). Boosting обучает последовательно, каждая следующая модель исправляет ошибки предыдущей (снижает смещение). В sklearn: BaggingClassifier, RandomForestClassifier; GradientBoostingClassifier, AdaBoostClassifier.

Bagging и Boosting: ключевое различие

Bagging (Bootstrap Aggregating) обучает базовые модели независимо и параллельно на случайных подвыборках с возвращением. Итоговый прогноз — среднее (регрессия) или голосование (классификация). Главный эффект — снижение дисперсии при сохранении уровня смещения.

Boosting обучает базовые модели последовательно: каждая новая модель фокусируется на объектах, где предыдущие ошиблись. Итоговый прогноз — взвешенная сумма. Главный эффект — снижение смещения, но риск переобучения при большом числе итераций.

Реализации в scikit-learn

  • Bagging: BaggingClassifier / BaggingRegressor — универсальная обёртка для любого estimator; RandomForestClassifier / RandomForestRegressor — bagging деревьев с дополнительной рандомизацией признаков (Extra-Trees: ExtraTreesClassifier).
  • Boosting: AdaBoostClassifier — обновляет веса объектов; GradientBoostingClassifier / GradientBoostingRegressor — градиентный бустинг на деревьях; HistGradientBoostingClassifier — быстрая версия на гистограммах (аналог LightGBM).

Пример: сравнение на одном датасете

from sklearn.datasets import make_classification
from sklearn.ensemble import (
    RandomForestClassifier,
    GradientBoostingClassifier,
    BaggingClassifier,
    AdaBoostClassifier,
)
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

X, y = make_classification(n_samples=1000, n_features=20,
                            n_informative=10, random_state=42)

models = {
    "Bagging(DT)": BaggingClassifier(
        estimator=DecisionTreeClassifier(), n_estimators=100, random_state=42
    ),
    "RandomForest": RandomForestClassifier(n_estimators=100, random_state=42),
    "AdaBoost": AdaBoostClassifier(n_estimators=100, random_state=42),
    "GradientBoosting": GradientBoostingClassifier(n_estimators=100, random_state=42),
}

for name, model in models.items():
    scores = cross_val_score(model, X, y, cv=5, scoring="roc_auc")
    print(f"{name:25s}: {scores.mean():.4f} ± {scores.std():.4f}")

Когда что выбирать

  • Модель переобучается (высокая дисперсия) → Bagging / RandomForest.
  • Модель недообучается (высокое смещение) → Boosting.
  • Нужна скорость обучения на большом датасете → HistGradientBoostingClassifier.
  • Интерпретируемость важна → RandomForest (feature importances, легче объяснить).

Подводные камни

  • Утечка данных в бустинге: если подбирать n_estimators на test-выборке, метрика будет завышена — используйте early_stopping или отдельный validation set.
  • Параллелизм bagging vs boosting: RandomForest поддерживает n_jobs=-1 (параллельное обучение), GradientBoosting — нет (деревья строятся последовательно); HistGradientBoosting поддерживает.
  • Чувствительность бустинга к выбросам: AdaBoost значительно усиливает вес аномальных объектов; GradientBoosting менее чувствителен при использовании устойчивых функций потерь (loss="huber").
  • Переобучение бустинга: большое n_estimators без регуляризации (learning_rate, max_depth, subsample) приводит к переобучению; для bagging этот риск значительно ниже.
  • RandomForest и несбалансированные классы: параметр class_weight="balanced" корректирует выборку, иначе лес смещается в сторону большинства.
  • Воспроизводимость: обязательно фиксируйте random_state — иначе результаты кросс-валидации будут отличаться между запусками.
  • Память при большом числе деревьев: каждое дерево хранится в RAM; 1000 деревьев на глубоком датасете могут занять несколько GB — контролируйте max_depth и max_leaf_nodes.

Common mistakes

  • Объяснять bagging vs boosting только синтаксисом без shape, dtype, состояния или режима выполнения.
  • Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
  • Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.

What the interviewer is testing

  • Может ли связать bagging vs boosting с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.

Sources

Related topics