← Назад к вопросам

Что такое ансамбль методов?

2.3 Middle🔥 261 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое ансамбль методов?

Ансамбль методов (Ensemble Methods) — это техника машинного обучения, которая объединяет предсказания нескольких базовых моделей для получения лучшего финального результата. Основная идея: группа слабых или средних моделей вместе может дать более сильное и надёжное предсказание, чем любая отдельная модель.

Основной принцип

Мудрость толпы (Wisdom of Crowds):

Если модели делают ошибки независимо друг от друга, то их объединение уменьшит общую ошибку. Это работает, когда модели:

  1. Достаточно точны (лучше случайного выбора)
  2. Делают разные ошибки (разнообразны)
# Пример: бросание монеты 100 раз
# Одна монета может дать неправильный результат
# Но сотня монет даст результат, близкий к 50/50

import numpy as np

# Одна модель
model1_accuracy = 0.6  # 60% точность

# Ансамбль из 5 независимых моделей (болшинство голосов)
votes = np.random.binomial(1, model1_accuracy, (1000, 5))
ensemble_preds = (votes.sum(axis=1) > 2.5).astype(int)
ensemble_accuracy = np.mean(ensemble_preds)
print(f"Ансамбль точность: {ensemble_accuracy}")

Основные типы ансамблей

1. Bagging (Bootstrap Aggregating)

Создаёт несколько моделей на случайных подмножествах данных, а затем объединяет их предсказания:

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

# Создание Bagging ансамбля
bag_clf = BaggingClassifier(
    estimator=DecisionTreeClassifier(),
    n_estimators=10,
    random_state=42,
    max_samples=0.8,  # 80% данных для каждой модели
    max_features=0.8  # 80% признаков для каждой модели
)

bag_clf.fit(X_train, y_train)
accuracy = bag_clf.score(X_test, y_test)

Особенность: каждая модель обучается на случайной выборке (с повторениями) из исходного набора данных.

2. Boosting (Усиление)

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

from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier

# AdaBoost
ada_clf = AdaBoostClassifier(
    estimator=DecisionTreeClassifier(max_depth=1),
    n_estimators=50,
    learning_rate=0.1
)

ada_clf.fit(X_train, y_train)

# Gradient Boosting
gb_clf = GradientBoostingClassifier(
    n_estimators=100,
    learning_rate=0.1,
    max_depth=3
)

gb_clf.fit(X_train, y_train)

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

3. Random Forest

Особый случай Bagging для деревьев решений с дополнительной рандомизацией признаков:

from sklearn.ensemble import RandomForestClassifier

rf_clf = RandomForestClassifier(
    n_estimators=100,
    max_depth=10,
    random_state=42,
    n_jobs=-1  # Параллельное обучение
)

rf_clf.fit(X_train, y_train)
accuracy = rf_clf.score(X_test, y_test)

# Важность признаков
feature_importance = rf_clf.feature_importances_

4. Stacking (Укладка)

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

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

# Базовые модели
estimators = [
    ('rf', RandomForestClassifier(n_estimators=50)),
    ('dt', DecisionTreeClassifier(max_depth=10)),
    ('lr', LogisticRegression())
]

# Мета-модель
stacking_clf = StackingClassifier(
    estimators=estimators,
    final_estimator=LogisticRegression()
)

stacking_clf.fit(X_train, y_train)
accuracy = stacking_clf.score(X_test, y_test)

5. Voting (Голосование)

Объединяет предсказания нескольких независимых моделей простым голосованием:

from sklearn.ensemble import VotingClassifier

voting_clf = VotingClassifier(
    estimators=[
        ('rf', RandomForestClassifier(n_estimators=50)),
        ('svc', SVC(probability=True)),
        ('lr', LogisticRegression())
    ],
    voting='soft'  # 'hard' для классификации, 'soft' для усреднения вероятностей
)

voting_clf.fit(X_train, y_train)
accuracy = voting_clf.score(X_test, y_test)

Сравнение методов

МетодПараллелизмСкоростьТочностьИспользование
BaggingДаБыстроСредняяБазовое улучшение
BoostingНетМедленнееОчень высокаяМаксимальная точность
Random ForestДаБыстроВысокаяУниверсальный выбор
StackingНетМедленнееОчень высокаяСоревнования Kaggle
VotingДаСреднеХорошаяПростое объединение

Практический пример: Kaggle Competition

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

# Готовим pipeline для каждой модели
pipe_rf = Pipeline([
    ('scaler', StandardScaler()),
    ('rf', RandomForestClassifier(n_estimators=200, random_state=42))
])

pipe_gb = Pipeline([
    ('scaler', StandardScaler()),
    ('gb', GradientBoostingClassifier(n_estimators=200, random_state=42))
])

pipe_lr = Pipeline([
    ('scaler', StandardScaler()),
    ('lr', LogisticRegression(max_iter=1000))
])

# Ансамбль
from sklearn.ensemble import VotingClassifier

ensemble = VotingClassifier(
    estimators=[
        ('rf_pipe', pipe_rf),
        ('gb_pipe', pipe_gb),
        ('lr_pipe', pipe_lr)
    ],
    voting='soft'
)

ensemble.fit(X_train, y_train)
y_pred = ensemble.predict(X_test)

Когда использовать каждый метод

Bagging/Random Forest:

  • Много данных
  • Нужна скорость
  • Хочешь интерпретируемость (feature importance)

Boosting/Gradient Boosting:

  • Критична максимальная точность
  • Данные предварительно очищены
  • Есть время на обучение

Stacking:

  • Участие в соревнованиях
  • Нужна абсолютная максимальная точность
  • Есть достаточно вычислительных ресурсов

Voting:

  • Быстрое решение
  • Объединение разнородных моделей
  • Простота кода

Важные понятия

Разнообразие (Diversity):

Ансамбль работает лучше, если модели достаточно разные:

# Плохо: все модели — это деревья решений с одинаковыми параметрами
bag = BaggingClassifier(
    estimator=DecisionTreeClassifier(max_depth=5),
    n_estimators=10
)

# Хорошо: разные алгоритмы
voting = VotingClassifier([
    ('dt', DecisionTreeClassifier()),
    ('svc', SVC()),
    ('lr', LogisticRegression()),
    ('knn', KNeighborsClassifier())
])

Смещение-Дисперсия (Bias-Variance):

  • Bagging уменьшает дисперсию (переобучение)
  • Boosting уменьшает смещение (недообучение)

Ансамбли — это мощный инструмент в арсенале Data Scientist'а, часто используемый на финальных этапах проектов и соревнованиях для максимального улучшения точности.

Что такое ансамбль методов? | PrepBro