Собесов

Сценарий ML: stacking vs blending vs bagging

ML / Data ScienceBoosting и ensembleСредняяSenior

Условие

Объясните разницу bagging, blending, stacking. Когда каждый подходит?

Решение

Подход

Bagging Blending Stacking
Базовые модели Одинаковые (RF) Разные Разные
Train base Bootstrap На train На train
Train meta Average На holdout Out-of-fold predictions
Risk Низкий Leakage если совмещать Сложнее, мощнее

Bagging

F(x) = (1/B) Σ f_b(x), где f_b обучен на bootstrap sample. Random Forest = bagging + random feature selection.

Снижает variance, не bias.

Blending

  1. Train/holdout split (например 80/20).
  2. Базовые модели тренируем на train.
  3. На holdout получаем их predictions → meta-features.
  4. Meta-learner тренируем на (meta-features, y_holdout).
  5. На test: base predictions → meta predict.

Прост, но meta-learner обучен только на holdout (мало данных).

Stacking (out-of-fold)

  1. KFold (5 fold).
  2. Для каждого fold: train base на other folds, predict на этом fold → собираем out-of-fold (OOF) predictions для всего train.
  3. Также train base на всём train для получения test predictions.
  4. Meta-learner на (OOF, y) для train, predict (test_base_preds) для test.

Использует все данные, нет leakage.

Реализация stacking

from sklearn.model_selection import KFold
import numpy as np
 
def stacking_predict(base_models, meta_model, X_train, y_train, X_test, n_folds=5):
    oof = np.zeros((len(X_train), len(base_models)))
    test_preds = np.zeros((len(X_test), len(base_models)))
    kf = KFold(n_folds, shuffle=True, random_state=42)
    for i, m in enumerate(base_models):
        for tr, te in kf.split(X_train):
            m_clone = clone(m)
            m_clone.fit(X_train[tr], y_train[tr])
            oof[te, i] = m_clone.predict_proba(X_train[te])[:,1]
        # train на всех train для test prediction
        m.fit(X_train, y_train)
        test_preds[:, i] = m.predict_proba(X_test)[:,1]
    meta_model.fit(oof, y_train)
    return meta_model.predict_proba(test_preds)[:,1]

Когда что

  • Bagging / RF: noisy features, средние выборки, простота. Default безопасный выбор.
  • Blending: быстрый MVP, контест с малым временем.
  • Stacking: kaggle, production где надо выжать +0.5% — но дорого в поддержке.

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

  1. Stacking без OOF = leakage: meta-learner видит base predictions на train, где они почти идеальны → overfit.
  2. Meta-learner сложный (тоже boosting) → overfit на base predictions. Обычно простой LR / shallow tree.
  3. Корреляция base models: если все base — деревья, стакинг ничего не добавит. Нужны разные семейства (linear + tree + neural).
  4. Stable folds: одни и те же KFold seed для всех base моделей, иначе OOF не выровнены.
  5. На production: латентность × число моделей. Stacking 5 моделей + meta = 6 inference calls.

Эталонный ответ

Bagging: одинаковые модели на bootstrap, averaging, снижает variance. Blending: разные модели на train, meta на holdout — простой, теряет данные. Stacking: разные модели + OOF predictions → meta-learner, использует все данные, требует осторожности с CV. Stacking лучший для контестов, bagging — для production.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти