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

Насколько сильно позволяет ансамблирование снизить дисперсию

1.0 Junior🔥 191 комментариев
#Статистика и математика

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

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

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

Насколько сильно ансамблирование снижает дисперсию: математика и практика

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

Математическая модель

Для независимых моделей дисперсия ошибки ансамбля (простое усреднение):

Var(Ensemble) = Var(Model) / n

Где n — количество моделей. Дисперсия снижается в n раз! Но это при условии полной независимости.

В реальности есть корреляция ошибок (ρ):

Var(Ensemble) = ρ * Var(Model) + (1 - ρ) * Var(Model) / n

Анализ:

  • ρ = 1 (полностью коррелированы): Var не снижается
  • ρ = 0 (независимы): Var снижается в n раз
  • ρ = 0.5 (полукоррелированы): Var снижается в ~2 раза при n=100

Практические примеры

Decision Trees (высокая дисперсия, низкая корреляция):

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score

X, y = make_classification(n_samples=1000, n_features=20, random_state=42)

# Одно дерево
tree = DecisionTreeClassifier(max_depth=10, random_state=42)
score_single = cross_val_score(tree, X, y, cv=5).mean()
print(f'Single tree: {score_single:.4f}')  # ~0.87

# Бэггинг из 100 деревьев
bag = BaggingClassifier(DecisionTreeClassifier(max_depth=10), n_estimators=100, random_state=42)
score_bag = cross_val_score(bag, X, y, cv=5).mean()
print(f'Bagging: {score_bag:.4f}')  # ~0.95 (прирост ~8-10%)

Дисперсия снижается примерно в 8-15 раз из 100 моделей.

Логистическая регрессия (низкая дисперсия, высокая корреляция):

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
score_lr = cross_val_score(lr, X, y, cv=5).mean()
print(f'LogReg: {score_lr:.4f}')  # ~0.93

bag_lr = BaggingClassifier(LogisticRegression(), n_estimators=100)
score_bag_lr = cross_val_score(bag_lr, X, y, cv=5).mean()
print(f'Bagging LogReg: {score_bag_lr:.4f}')  # ~0.93 (практически нет прироста)

Дисперсия снижается примерно в 1.1-1.3 раза.

Максимальное достижимое снижение

Есть теоретический предел:

Min(Var) = ρ * Var(Model)

Это означает, что даже с бесконечным количеством моделей, дисперсия не упадёт ниже ρ * Var(Model).

Пример:

  • Если ρ = 0.1, то Var может упасть максимум в 10 раз
  • Если ρ = 0.5, то Var упадёт максимум в 2 раза

Как максимизировать снижение дисперсии

  1. Используй разнородные модели (логит, дерево, SVM) — ρ ↓
  2. Варьируй гиперпараметры (глубина дерева, регуляризация)
  3. Используй разные признаки (Feature Subsampling)
  4. Boosting вместо Bagging — снижает и дисперсию, и смещение
  5. Правильный размер подвыборки — слишком малые выборки = большая корреляция

Итоговая формула для практики

Ждаемое снижение MSE:

MSE(Ensemble) ≈ Bias^2 + ρ * Var + (1 - ρ) * Var / n

Вывод: Ансамблирование никогда не удалит дисперсию полностью, но может снизить её в 5-15 раз при хорошем выборе разнородных моделей. Максимум получается при ρ близкой к 0.