Какие методы ансамблирования моделей вы знаете?

«Какие методы ансамблирования моделей вы знаете?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В машинном обучении я применяю различные методы ансамблирования, каждый из которых решает конкретные задачи:

1. Бэггинг (Bootstrap Aggregating) — параллельное обучение независимых моделей:

from sklearn.ensemble import RandomForestClassifier, BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

# Random Forest - классический пример бэггинга
rf_model = RandomForestClassifier(
    n_estimators=100,
    max_depth=10,
    random_state=42
)

# Или кастомный бэггинг:
bagging_model = BaggingClassifier(
    estimator=DecisionTreeClassifier(),
    n_estimators=50,
    max_samples=0.8,  # 80% данных для каждой модели
    bootstrap=True,
    n_jobs=-1  # параллельное обучение
)

2. Бустинг (Boosting) — последовательное обучение, где каждая модель исправляет ошибки предыдущей:

# Gradient Boosting
from sklearn.ensemble import GradientBoostingClassifier

gb_model = GradientBoostingClassifier(
    n_estimators=100,
    learning_rate=0.1,
    max_depth=3,
    subsample=0.8  # Stochastic Gradient Boosting
)

# XGBoost (в production)
import xgboost as xgb

xgb_model = xgb.XGBClassifier(
    n_estimators=200,
    max_depth=5,
    learning_rate=0.05,
    subsample=0.8,
    colsample_bytree=0.8
)

3. Стекинг (Stacking) — комбинирование предсказаний через метамодель:

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

# Базовые модели
base_models = [
    ('rf', RandomForestClassifier(n_estimators=50)),
    ('svm', SVC(probability=True)),
    ('xgb', xgb.XGBClassifier(n_estimators=100))
]

# Стекинг с логистической регрессией как метамоделью
stacking_model = StackingClassifier(
    estimators=base_models,
    final_estimator=LogisticRegression(),
    cv=5,  # кросс-валидация для обучения метамодели
    n_jobs=-1
)

4. Блендинг (Blending) — упрощенный стекинг с фиксированным разделением данных:

from sklearn.model_selection import train_test_split

# Разделяем данные
X_train, X_blend, y_train, y_blend = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# Обучаем базовые модели на train
rf_model.fit(X_train, y_train)
xgb_model.fit(X_train, y_train)

# Получаем предсказания для blend set
rf_preds = rf_model.predict_proba(X_blend)
xgb_preds = xgb_model.predict_proba(X_blend)

# Конкатенируем предсказания как фичи для метамодели
blend_features = np.hstack([rf_preds, xgb_preds])

# Обучаем метамодель
meta_model = LogisticRegression()
meta_model.fit(blend_features, y_blend)

5. Voting (Голосование) — простое усреднение предсказаний:

from sklearn.ensemble import VotingClassifier

voting_model = VotingClassifier(
    estimators=[
        ('rf', rf_model),
        ('xgb', xgb_model),
        ('svm', SVC(probability=True))
    ],
    voting='soft'  # 'hard' для классов, 'soft' для вероятностей
)

Мой опыт применения:

  • Табличные данные → Gradient Boosting (XGBoost/LightGBM) обычно показывает лучшие результаты
  • Высокая дисперсия → Random Forest (бэггинг) стабилизирует предсказания
  • Kaggle/соревнования → стекинг разнородных моделей
  • Production с ограничениями → выбираю одну лучшую модель или легкий ансамбль

Ключевое правило: ансамбли должны состоять из разнородных моделей, которые ошибаются по-разному. Ансамбль из 100 одинаковых деревьев менее эффективен, чем из 10 разных алгоритмов.