Ответ
В машинном обучении я применяю различные методы ансамблирования, каждый из которых решает конкретные задачи:
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 разных алгоритмов.