Как связана дисперсия предсказаний с количеством базовых моделей в ансамбле?

Ответ

Дисперсия предсказаний ансамбля обратно пропорциональна количеству независимых базовых моделей. Это ключевая причина, почему ансамбли (бэггинг, случайный лес) работают лучше отдельных моделей с высокой дисперсией, таких как глубокие деревья.

Теоретическое обоснование: Если у нас есть N независимых и одинаково распределенных моделей с дисперсией предсказаний σ², то дисперсия среднего их предсказаний (ансамбля) равна:

[ text{Var}(hat{f}_{text{ens}}) = frac{sigma^2}{N} ]

Что это значит на практике:

  1. Увеличение числа моделей N уменьшает разброс (дисперсию) итогового предсказания ансамбля, делая его более стабильным и надежным.
  2. Важное допущение: модели должны быть максимально независимы. На практике полной независимости нет, поэтому выигрыш в снижении дисперсии хоть и значительный, но меньше теоретического.

Пример с 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} ]

Что это на практике, ёпта?

  1. Чем больше чуваков в толпе (N), тем меньше итоговый разброс. Модель перестаёт дрочить случайные выбросы и становится стабильнее. Это, блядь, основная фишка бэггинга и случайного леса.
  2. Но есть нюанс, хитрая жопа: чуваки должны быть по-настоящему независимыми. На практике они всё равно друг на друга как-то влияют (используют одни и те же данные), поэтому выигрыш хоть и овердохуищный, но чуть меньше идеального.

Пример на коде (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) худеет на глазах.

Итог, бля: Кидать в ансамбль больше моделей — это как нанимать больше независимых экспертов. Их среднее мнение будет надёжнее и не будет скакать, как у одного ебанько. Особенно спасает на зашумленных данных, где каждая отдельная модель — это просто пиздопроебина.