Сборка предсказаний

В современном машинном обучении сборка предсказаний (англ. prediction aggregation) стала одной из ключевых техник, позволяющих получать более точные и надёжные результаты, чем при использовании одной модели. В статье мы разберём, почему и как объединять предсказания нескольких моделей, какие существуют подходы, их преимущества и недостатки, а также покажем практический пример реализации на Python.


Что такое сборка предсказаний?

Сборка предсказаний — это процесс объединения результатов работы нескольких базовых моделей (классификаторов или регрессоров) в единый итоговый прогноз. Такой подход называют ансамблевым обучением (ensemble learning). По сути, ансамбль представляет собой стратегию, при которой каждый отдельный «слабый» обучающийся вносит свою часть в общий ответ, а итоговый результат получается более стабильным и точным.

1.1 Почему это работает?

  • Уменьшение разброса (variance) — разные модели делают разные ошибки; их усреднение «сглаживает» случайные отклонения.
  • Снижение смещения (bias) — в бустинге модели обучаются последовательно, каждый раз исправляя ошибки предыдущих, что уменьшает систематическую ошибку.
  • Избежание переобучения — комбинирование моделей, обученных на разных подвыборках, делает итоговый прогноз менее подверженным шуму обучающих данных.
  • Работа с разными типами признаков — можно использовать, например, деревья решений для категориальных признаков и линейные модели для числовых, объединяя их в один ансамбль.

Основные методы сборки предсказаний

Существует несколько классических техник, каждая из которых имеет свои особенности.

2.1 Бэггинг (Bagging)

Сокращение от Bootstrap Aggregating. При бэггинге:

  1. Создаётся несколько обучающих подвыборок с возвращением (bootstrap‑samples).
  2. На каждой подвыборке обучается независимая модель (часто одинакового типа, например, решающие деревья).

Наиболее известный пример бэггинга — Random Forest.

2.2 Бустинг (Boosting)

В бустинге модели обучаются последовательно, каждая следующая модель пытается исправить ошибки предыдущих. Ключевые идеи:

  • Веса обучающих объектов меняются: более «трудные» объекты получают больший вес.

Популярные реализации:

  • AdaBoost
  • Gradient Boosting Machines (GBM)
  • XGBoost, LightGBM, CatBoost

2.3 Стекинг (Stacking)

Стекинг отличается тем, что вместо простого усреднения или голосования используется «мета‑модель», обучающаяся на предсказаниях базовых моделей.

  1. Разбиваем обучающую выборку на K‑folds.
  2. На каждом фолде обучаем набор базовых моделей и получаем их предсказания для «выходных» объектов.
  3. Эти предсказания (часто в виде вероятностей) становятся новыми признаками для мета‑модели (часто линейной регрессии или логистической регрессии).
  4. Мета‑модель выдаёт окончательный результат.

Стекинг часто даёт наилучший прирост точности, но требует более сложной инфраструктуры и тщательной кросс‑валидации.

Пошаговый процесс сборки предсказаний

Ниже описан типичный workflow, который можно адаптировать под любую задачу (бинарная классификация, мультиклассовая классификация, регрессия).

3.1 Подготовка данных

  • Разделяем данные на train и test (или используем кросс‑валидацию).
  • Проводим предобработку: очистка, масштабирование, кодирование категориальных признаков.

3.2 Выбор базовых моделей

Для разнообразия часто используют модели разных семейств:

  • Линейные модели (LogisticRegression, LinearRegression).
  • Деревья и их ансамбли (DecisionTree, RandomForest, ExtraTrees).
  • Градиентный бустинг (XGBoost, LightGBM).
  • Нейронные сети (MLP, небольшие CNN для табличных данных).

3.3 Обучение базовых моделей

Каждая модель обучается независимо. При использовании бэггинга/бустинга следует следовать их специфическим схемам (bootstrap‑samples, последовательные итерации и т.д.).

3.4 Генерация предсказаний для мета‑модели

Если применяется стекинг, то:

  1. Для каждого объекта из валидационной части получаем предсказания всех базовых моделей.
  2. Эти предсказания сохраняем в отдельный датасет level‑1.
  3. Для тестовой части также собираем предсказания (обычно усредняя по фолдам).

3.5 Обучение мета‑модели

На датасете level‑1 обучаем простую модель (логистическая регрессия, линейная регрессия, небольшое дерево). Эта модель «учится» комбинировать сигналы базовых моделей.

3.6 Оценка качества

Для оценки используют метрики, соответствующие задаче:

  • Классификация: Accuracy, ROC‑AUC, F1‑score.
  • Регрессия: RMSE, MAE, R².

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

Практический пример на Python

Ниже приведён минимальный рабочий пример, демонстрирующий стеккинг с использованием scikit‑learn и xgboost. Для простоты используется датасет Breast Cancer (бинарная классификация).

# -- coding: utf-8 --
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import StratifiedKFold, train_test_split
from sklearn.metrics import roc_auc_score
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
import xgboost as xgb

data = load_breast_cancer
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
 X, y, test_size=0.2, random_state=42, stratify=y)

base_models = [
 ('rf', RandomForestClassifier(n_estimators=200,
 max_depth=5,
 random_state=42)),
 ('gb', GradientBoostingClassifier(n_estimators=200,
 learning_rate=0.05,
 max_depth=3,
 random_state=42)),
 ('xgb', xgb.XGBClassifier(n_estimators=300,
 max_depth=4,
 learning_rate=0.05,
 subsample=0.8,
 colsample_bytree=0.8,
 eval_metric='logloss',
 use_label_encoder=False,
 random_state=42))
]

n_folds = 5
skf = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=42)

train_meta = np.zeros((X_train.shape[0], len(base_models)))
test_meta = np.zeros((X_test.shape[0], len(base_models)))

for idx, (name, model) in enumerate(base_models):
 test_fold_pred = np.zeros((X_test.shape[0], n_folds))
 for fold, (tr_idx, val_idx) in enumerate(skf.split(X_train, y_train)):
 X_tr, X_val = X_train[tr_idx], X_train[val_idx]
 y_tr, y_val = y_train[tr_idx], y_train[val_idx]

 model.fit(X_tr, y_tr)
 # предсказания для валидационной части
 val_pred = model.predict_proba(X_val)[:, 1]
 train_meta[val_idx, idx] = val_pred

 # предсказания для тестовой части (для усреднения)
 test_fold_pred[:, fold] = model.predict_proba(X_test)[:, 1]

 # усредняем предсказания по фолдам
 test_meta[:, idx] = test_fold_pred.mean(axis=1)

meta_clf = LogisticRegression(solver='lbfgs')
meta_clf.fit(train_meta, y_train)

final_pred = meta_clf.predict_proba(test_meta)[:, 1]
auc = roc_auc_score(y_test, final_pred)
print(f'ROC‑AUC стеккинга: {auc:.4f}')

В результате на нашем небольшом наборе данных получаем ROC‑AUC ≈ 0.99, что обычно лучше, чем отдельные базовые модели.

Лучшие практики и типичные подводные камни

  • Разнообразие базовых моделей. Чем более «разные» алгоритмы (по структуре и гиперпараметрам) вы включите, тем выше шанс, что их ошибки не будут коррелировать.
  • Избегайте утечки данных. При построении уровня‑1 следует строго использовать кросс‑валидацию, иначе мета‑модель получит «подсмотренные» ответы и переобучится.
  • Балансировка вычислительных ресурсов. Бэггинг и бустинг обычно требуют меньше памяти, чем стекинг, где хранится несколько наборов предсказаний.
  • Взвешивание моделей. Иногда полезно задать веса базовым моделям (например, более точные модели дают больший вклад).
  • Проверка на переобучение. Сравните метрики на кросс‑валидации и на отдельном hold‑out наборе; резкое расхождение указывает на переобучение мета‑модели.

Где применяется сборка предсказаний?

Ансамбли стали стандартом в самых разных областях:

  • Финансовый скоринг и кредитный риск.
  • Медицинская диагностика (напр., предсказание рака).
  • Рекомендательные системы.
  • Участие в соревнованиях (Kaggle, DrivenData) — почти все победные решения используют комбинацию моделей.
  • Прогнозирование спроса, временных рядов (через градиентный бустинг и стекинг).

Сборка предсказаний — мощный инструмент, позволяющий извлечь максимум из имеющихся моделей. Благодаря техникам бэггинга, бустинга и стекинга можно существенно повысить точность, снизить риск переобучения и построить устойчивую систему, работающую с разнородными признаками. Главное, правильно подобрать набор базовых моделей, соблюдать строгую валидацию и не забывать о вычислительных ограничениях.

Если вы только начинаете знакомиться с ансамблями, начните с простого Random Forest (бэггинг) и постепенно переходите к более сложным схемам, таким как Gradient Boosting и Stacking. Практика и экспериментальная настройка гиперпараметров помогут вам достичь лучших результатов.


Дата публикации: 28 апреля 2026 г.