Условие
Объясните разницу 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
- Train/holdout split (например 80/20).
- Базовые модели тренируем на train.
- На holdout получаем их predictions → meta-features.
- Meta-learner тренируем на (meta-features, y_holdout).
- На test: base predictions → meta predict.
Прост, но meta-learner обучен только на holdout (мало данных).
Stacking (out-of-fold)
- KFold (5 fold).
- Для каждого fold: train base на other folds, predict на этом fold → собираем out-of-fold (OOF) predictions для всего train.
- Также train base на всём train для получения test predictions.
- 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% — но дорого в поддержке.
Подводные камни
- Stacking без OOF = leakage: meta-learner видит base predictions на train, где они почти идеальны → overfit.
- Meta-learner сложный (тоже boosting) → overfit на base predictions. Обычно простой LR / shallow tree.
- Корреляция base models: если все base — деревья, стакинг ничего не добавит. Нужны разные семейства (linear + tree + neural).
- Stable folds: одни и те же KFold seed для всех base моделей, иначе OOF не выровнены.
- На production: латентность × число моделей. Stacking 5 моделей + meta = 6 inference calls.
Эталонный ответ
Bagging: одинаковые модели на bootstrap, averaging, снижает variance. Blending: разные модели на train, meta на holdout — простой, теряет данные. Stacking: разные модели + OOF predictions → meta-learner, использует все данные, требует осторожности с CV. Stacking лучший для контестов, bagging — для production.