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

Как устроен бустинг?

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

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

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

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

Как устроен бустинг?

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

Основной принцип бустинга

Бустинг работает на основе адаптивного переweighting данных:

  1. Обучаем первый слабый классификатор на всех примерах
  2. Увеличиваем вес примеров, которые модель классифицировала неправильно
  3. Обучаем второй классификатор на переweighted данных
  4. Повторяем процесс N раз, каждый раз фокусируясь на ошибках
  5. Итоговый результат — взвешенная сумма всех классификаторов

AdaBoost (Adaptive Boosting)

Самый популярный и простой алгоритм бустинга:

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Создаём датасет
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# AdaBoost с Decision Tree как базовым классификатором
ada_boost = AdaBoostClassifier(
    estimator=DecisionTreeClassifier(max_depth=1),  # слабый классификатор
    n_estimators=50,  # количество итераций
    learning_rate=1.0,  # коэффициент адаптации
    random_state=42
)

ada_boost.fit(X_train, y_train)
y_pred = ada_boost.predict(X_test)

print(f"Точность: {accuracy_score(y_test, y_pred):.3f}")

Как устроен AdaBoost пошагово

# Математика AdaBoost

# Шаг 1: инициализация
weights = np.ones(n_samples) / n_samples  # равные веса
errors = []

for i in range(n_estimators):
    # Шаг 2: обучение на weighted данных
    estimator = DecisionTreeClassifier(max_depth=1)
    sample_indices = np.random.choice(
        len(X),
        size=len(X),
        p=weights  # вероятность выбора пропорциональна весу
    )
    estimator.fit(X[sample_indices], y[sample_indices])
    
    # Шаг 3: вычисляем ошибку (weighted error rate)
    y_pred = estimator.predict(X_train)
    incorrect = (y_pred != y_train)
    error = np.sum(weights[incorrect])  # weighted error
    
    if error > 0.5 or error == 0:
        break
    
    # Шаг 4: вычисляем alpha (вес классификатора)
    alpha = 0.5 * np.log((1 - error) / error)
    
    # Шаг 5: обновляем веса
    weights *= np.exp(-alpha * y_train * y_pred)  # увеличиваем вес для ошибок
    weights /= np.sum(weights)  # нормализуем
    
    errors.append(error)

Gradient Boosting

Более продвинутый метод, минимизирующий loss-функцию через градиентный спуск:

from sklearn.ensemble import GradientBoostingClassifier

gb = GradientBoostingClassifier(
    n_estimators=100,  # количество деревьев
    learning_rate=0.1,  # темп обучения
    max_depth=3,  # глубина каждого дерева
    subsample=0.8,  # доля примеров для каждого дерева
    random_state=42
)

gb.fit(X_train, y_train)
print(f"Точность: {accuracy_score(y_test, gb.predict(X_test)):.3f}")

XGBoost (eXtreme Gradient Boosting)

Оптимизированная версия gradient boosting с улучшениями производительности:

import xgboost as xgb

xgb_model = xgb.XGBClassifier(
    n_estimators=100,
    max_depth=5,
    learning_rate=0.1,
    subsample=0.8,
    colsample_bytree=0.8,
    random_state=42
)

xgb_model.fit(
    X_train, y_train,
    eval_set=[(X_test, y_test)],
    early_stopping_rounds=10,
    verbose=False
)

y_pred = xgb_model.predict(X_test)
print(f"Точность: {accuracy_score(y_test, y_pred):.3f}")

# Важность признаков
feature_importance = xgb_model.feature_importances_

Сравнение методов бустинга

МетодПлюсыМинусы
AdaBoostПростой, быстрый, хорошо для классификацииМожет переобучиться, чувствителен к выбросам
Gradient BoostingГибкий, можно использовать разные loss-функцииМедленнее, много гиперпараметров
XGBoostОчень быстрый, регуляризация, обработка спарсностиСложнее в настройке
LightGBMСупер быстрый, память-efficient, хорошо для больших данныхМожет переобучиться при маленьких датасетах
CatBoostОтличная работа с категориальными признакамиМедленнее при обучении

Практические советы

  1. Hyperparameter tuning:

    • learning_rate: начните с 0.1, уменьшайте для большего числа итераций
    • n_estimators: обычно 100-1000
    • max_depth: 3-7 для большинства задач
  2. Защита от переобучения:

    • Используйте early_stopping с валидационным набором
    • Регулируйте learning_rate и subsample
  3. Data Science кейсы:

    • Классификация: XGBoost, LightGBM
    • Регрессия: Gradient Boosting, XGBoost
    • Большие датасеты: LightGBM, CatBoost
    • С категориальными признаками: CatBoost
Как устроен бустинг? | PrepBro