Ответ
Дисперсия предсказаний ансамбля обратно пропорциональна количеству независимых базовых моделей. Это ключевая причина, почему ансамбли (бэггинг, случайный лес) работают лучше отдельных моделей с высокой дисперсией, таких как глубокие деревья.
Теоретическое обоснование:
Если у нас есть N независимых и одинаково распределенных моделей с дисперсией предсказаний σ², то дисперсия среднего их предсказаний (ансамбля) равна:
[ text{Var}(hat{f}_{text{ens}}) = frac{sigma^2}{N} ]
Что это значит на практике:
- Увеличение числа моделей
Nуменьшает разброс (дисперсию) итогового предсказания ансамбля, делая его более стабильным и надежным. - Важное допущение: модели должны быть максимально независимы. На практике полной независимости нет, поэтому выигрыш в снижении дисперсии хоть и значительный, но меньше теоретического.
Пример с RandomForest (бэггингом деревьев):
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
import numpy as np
# Генерируем данные
X, y = make_regression(n_samples=1000, n_features=20, noise=0.5)
# Оценим дисперсию предсказаний для разного числа деревьев
variances = []
n_estimators_range = [1, 5, 10, 50, 100, 200]
for n in n_estimators_range:
model = RandomForestRegressor(n_estimators=n, random_state=42)
model.fit(X, y)
# Соберем предсказания каждого дерева
predictions = np.array([tree.predict(X) for tree in model.estimators_])
# Дисперсия среднего предсказания по ансамблю
ensemble_variance = np.var(predictions.mean(axis=0))
variances.append(ensemble_variance)
# График variances от n_estimators_range покажет спад дисперсии с ростом числа деревьев.
Вывод: Добавление большего количества моделей в ансамбль снижает дисперсию ошибки, что напрямую ведет к повышению обобщающей способности и стабильности модели, особенно для шумных данных.
Ответ 18+ 🔞
А, ну вот, смотри, объясняю на пальцах, как для дебила. Представь, что у тебя есть один чувак, который пытается угадать, сколько будет стоить биток завтра. Он может наорать «сто тыщ!», а на следующий день — «пятьсот!». Пиздец какой разброс, доверия к нему — ноль ебать. Это модель с высокой дисперсией, типа глубокого дерева.
А теперь представь, что таких чудаков у тебя не один, а целая толпа — ансамбль. И ты спрашиваешь у всех, а потом берёшь среднюю температуру по больнице. Один кричит «сто», другой — «сто двадцать», третий — «девяносто». Когда ты всё это усредняешь, получается какая-то более-менее адекватная цифра. Разброс-то, эта самая дисперсия, уменьшается. И чем больше в этой толпе независимых друг от друга мудаков, тем стабильнее будет средний ответ.
Теоретическая хуйня (но важная):
Если эти N чуваков реально независимы и ошибаются в среднем одинаково (дисперсия σ²), то дисперсия их общего, усреднённого ответа будет:
[ text{Разброс итога} = frac{sigma^2}{N} ]
Что это на практике, ёпта?
- Чем больше чуваков в толпе (
N), тем меньше итоговый разброс. Модель перестаёт дрочить случайные выбросы и становится стабильнее. Это, блядь, основная фишка бэггинга и случайного леса. - Но есть нюанс, хитрая жопа: чуваки должны быть по-настоящему независимыми. На практике они всё равно друг на друга как-то влияют (используют одни и те же данные), поэтому выигрыш хоть и овердохуищный, но чуть меньше идеального.
Пример на коде (RandomForest): Вот смотри, как это выглядит в деле. Мы будем смотреть, как падает дисперсия, когда деревьев становится больше.
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
import numpy as np
# Нагенерируем данных, с шумом, как в жизни
X, y = make_regression(n_samples=1000, n_features=20, noise=0.5)
# Померим дисперсию предсказаний для разного числа деревьев
variances = []
n_estimators_range = [1, 5, 10, 50, 100, 200]
for n in n_estimators_range:
model = RandomForestRegressor(n_estimators=n, random_state=42)
model.fit(X, y)
# Соберём предсказания каждого дерева по отдельности
predictions = np.array([tree.predict(X) for tree in model.estimators_])
# Посчитаем дисперсию от среднего предсказания всего леса
ensemble_variance = np.var(predictions.mean(axis=0))
variances.append(ensemble_variance)
# Если построить график, то увидишь — с ростом n_estimators дисперсия (variances) худеет на глазах.
Итог, бля: Кидать в ансамбль больше моделей — это как нанимать больше независимых экспертов. Их среднее мнение будет надёжнее и не будет скакать, как у одного ебанько. Особенно спасает на зашумленных данных, где каждая отдельная модель — это просто пиздопроебина.