Ответ
Байесовское ансамблирование (Bayesian Model Averaging/Ensembling) — это продвинутая техника объединения прогнозов нескольких моделей, где веса моделей не фиксированы, а являются случайными величинами с апостериорным распределением, выведенным из данных. Это позволяет корректно учесть неопределенность как в данных, так и в выборе лучшей модели.
Ключевые компоненты:
- Набор базовых моделей (M1, M2, ..., Mk): Это могут быть модели разной архитектуры (например, линейная регрессия, случайный лес, градиентный бустинг, нейросеть) или одна модель, обученная на разных подвыборках данных (как в Bagging).
- Априорное распределение на веса моделей (Prior): Обычно используется Дирихле распределение (Dirichlet), так как оно определено на симплексе (веса неотрицательны и в сумме дают 1). Параметры Дирихле задают наши априорные ожидания о важности каждой модели.
# Пример: априорное распределение Дирихле с параметром alpha = [1,1,1] # Это означает равновероятный выбор любой из трех моделей до наблюдения данных. - Правдоподобие (Likelihood): Вероятность наблюдаемых данных при заданных весах моделей и их прогнозах. Часто предполагается нормальное распределение ошибки ансамбля. [ P(Data | w, M) propto expleft(-frac{1}{2sigma^2} sum (yi - sum{j=1}^k wj hat{y}{ij})^2 right) ] где ( hat{y}_{ij} ) — прогноз j-й модели для i-го наблюдения.
- Апостериорное распределение весов (Posterior): Распределение весов моделей после учета данных. Вычисляется по теореме Байеса: [ P(w | Data, M) propto P(Data | w, M) cdot P(w) ] Это распределение редко имеет аналитическую форму и оценивается методами Монте-Карло (MCMC) или вариационным выводом.
- Прогноз ансамбля: Финальный прогноз — это среднее прогнозов базовых моделей, взвешенное по апостериорному распределению весов. Это не простое среднее, а среднее, учитывающее неопределенность. [ hat{y}{new} = int left( sum{j=1}^k wj hat{y}{new, j} right) P(w | Data) dw ]
Практическая реализация с PyMC3:
import numpy as np
import pymc3 as pm
import arviz as az
# Допустим, у нас есть прогнозы 3-х моделей (preds1, preds2, preds3) и истинные значения y_true
preds = np.column_stack([preds1, preds2, preds3]) # Массив [n_samples, 3]
with pm.Model() as bayesian_ensemble:
# 1. Априорное распределение для весов (равномерное Дирихле)
weights = pm.Dirichlet('weights', a=np.ones(3))
# 2. Определяем среднее ансамбля как взвешенную сумму прогнозов
mu = pm.math.dot(preds, weights)
# 3. Правдоподобие (предполагаем нормальный шум с неизвестной дисперсией)
sigma = pm.HalfNormal('sigma', sigma=1)
likelihood = pm.Normal('y', mu=mu, sigma=sigma, observed=y_true)
# 4. Получаем апостериорное распределение с помощью MCMC
trace = pm.sample(2000, tune=1000, cores=2, return_inferencedata=True)
# Анализ результатов
print(az.summary(trace, var_names=['weights'])) # Средние апостериорные веса и доверительные интервалы
# Прогноз для новых данных (используем апостериорные средние весов)
posterior_weights_mean = trace.posterior['weights'].mean(dim=('chain', 'draw')).values
new_pred = np.dot(new_preds_from_3_models, posterior_weights_mean)
Преимущества перед простым ансамблированием:
- Учет неопределенности модели: Дает не только точечный прогноз, но и распределение, отражающее уверенность в комбинации моделей.
- Адаптивные веса: Веса могут меняться в зависимости от области входного пространства (если модель параметризована соответствующим образом).
- Защита от переобучения: Байесовский подход естественным образом регулирует сложность ансамбля.