БустингиAdaBoost

AdaBoost

Адаптивный бустинг: неправильно классифицированные точки получают больший вес на следующей итерации. Каждый слабый классификатор фокусируется на «трудных» примерах.

Интерактивная визуализация

Наблюдайте как веса точек меняются на каждом шаге AdaBoost

Задача
РегрессияКлассиф.

Датасет

Классификатор
ПеньДерево

Классификаторов10
Learning rate1.0
Глубина дерева1
Вычисляю...
Шаг 0 / 0
Класс 1 (размер = вес)
×Класс 0 (размер = вес)
Граница ансамбля
Граница h_m

Числовой пример

Первые 6 точек датасета — как меняются веса на каждом шаге.

Нет данных для отображения.

Идея алгоритма

Почему это работает и в чём отличие от других методов бустинга

🎓

Аналогия: Учитель, фокусирующийся на ошибках

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

В AdaBoost каждый слабый классификатор «видит» датасет через призму весов: точки, которые предыдущий классификатор неверно распознал, получают больший вес. Итоговый ответ — взвешенное голосование всех слабых классификаторов, где более точные классификаторы имеют больший голос (α_m).

Ключевая идея

AdaBoost строит ансамбль из слабых классификаторов (обычно деревьев глубиной 1 — «пней»), последовательно добавляя их по одному. После каждого шага веса точек пересчитываются: неправильно классифицированные точки получают больший вес, правильно классифицированные — меньший. Следующий классификатор вынужден сосредоточиться на «трудных» примерах.

Финальное предсказание — взвешенное голосование всех классификаторов: H(x) = sign(Σ α_m · h_m(x)), где α_m — «голос» m-го классификатора, определяемый его точностью.

AdaBoost vs Gradient Boosting

АспектAdaBoostGradient Boosting
Как учитсяПерераспределяет веса точекОбучается на псевдо-остатках (градиентах)
Слабый классификаторПень глубиной 1 (классически)Дерево любой глубины
Функция потерьЭкспоненциальная (фиксированная)Любая дифференцируемая
Веса классификаторовα_m = 0.5·ln((1−ε)/ε)Одинаковые (η) или оптимизированные
Чувствительность к шумуВысокая (выбросы раздуваются)Умеренная

Bias и Variance

AdaBoost — это прежде всего алгоритм снижения bias (смещения): каждый новый пень фокусируется именно на точках, где ансамбль ошибается. При этом variance (дисперсия) растёт значительно медленнее, чем у обычного бустинга — именно поэтому AdaBoost редко переобучается даже с большим числом итераций.

Причина устойчивости: теоретически доказано, что «отступы» (margins) — отдалённость предсказания от границы решения — продолжают расти даже после того, как ансамбль достиг нулевой ошибки на обучении. Это и сдерживает рост variance. Заметь: всё это верно только если базовый классификатор прост (пень глубиной 1–2). Глубокие деревья нарушают этот баланс.

ОшибкаЧисло итераций (n_estimators) →variance ≈ constBias²VarianceTotal Error

Variance у AdaBoost (пурпурная линия) почти не растёт с числом итераций — в отличие от GBM. Total Error продолжает снижаться.

ПараметрBiasVarianceРекомендация
n_estimators ↑↓ снижает↑ медленноСмело увеличивай — риск мал
learning_rate ↑↓ быстрее↑ умеренно0.1–1.0 стандартный диапазон
depth = 1 (пень)↑ выше↓ минимумКлассика AdaBoost — пень оптимален
depth ↑ (дерево)↓ снижает↑↑ резкоГлубже 3–4 — теряешь устойчивость
Особенность AdaBoost: variance растёт медленно → можно смело добавлять итерации без страха переобучения. Но только с простыми классификаторами. Глубокое дерево как базовый классификатор полностью ломает эту гарантию.

Плюсы

  • +Прост в понимании: концепция весов и голосования интуитивна
  • +Теоретические гарантии: при слабом классификаторе ошибка экспоненциально снижается
  • +Быстро работает со стампами (depth=1) — низкие вычислительные затраты
  • +Не требует явной настройки learning_rate в классическом варианте

Минусы

  • Очень чувствителен к шуму и выбросам — они получают огромные веса
  • Только бинарная классификация в базовом варианте SAMME
  • Может переобучиться при большом числе итераций на зашумлённых данных
  • Менее гибкий, чем GBM: нельзя менять функцию потерь

Математика

Как это работает под капотом — с формулами и разбором на конкретных числах

Ключевая формула

H(x)=sign ⁣(m=1Mαmhm(x))H(x) = \mathrm{sign}\!\left(\sum_{m=1}^{M} \alpha_m h_m(x)\right)
H(x)H(x)Итоговый ответ ансамбля — знак взвешенной суммы голосов всех пней
αm\alpha_mДоверие к пню m: чем точнее пень, тем больше α и тем громче его «голос»
hm(x)h_m(x)Слабый классификатор на шаге m — пень или небольшое дерево, предсказывает +1 или −1
εm\varepsilon_mДоля «веса» датасета, на которой пень ошибся. При 0.5 — пень не лучше монетки

Каждый пень h_m обучается на той же задаче, но с разными весами точек — те, на которых предыдущий пень ошибся, становятся важнее. Вес пня в ансамбле α_m зависит от его точности: чем меньше ошибок (ε_m), тем громче «голос» этого пня. Финальный ответ — знак взвешенной суммы всех голосов.

Разбор вручную: как AdaBoost работает шаг за шагом

5 студентов, задача: предсказать, сдаст ли студент экзамен по количеству часов учёбы.

Датасет — 5 студентов

iЧасов учёбыИтогy
11провалил−1
22сдал+1
33провалил−1
44сдал+1
55сдал+1

Заметь: данные противоречивые — студент с 2 часами сдал, с 3 провалил. Ни один пень не разделит всё идеально.

Начальное состояние — все точки равноправны

AdaBoost принципиально отличается от GBM: здесь нет «остатков» и нет суммирования предсказаний. Вместо этого алгоритм работает с весами точек — числами, которые говорят пню, насколько важна каждая точка при обучении.

В начале мы не знаем ничего — все студенты одинаково важны. Поэтому каждой точке присваивается одинаковый вес: wi=1n=15=0.2w_i = \frac{1}{n} = \frac{1}{5} = 0.2. Сумма всех весов всегда равна 1 — это принципиально, это «бюджет внимания», который перераспределяется между точками по мере обучения.

Посмотри на датасет: студент 2 (2 часа) сдал, студент 3 (3 часа) провалил. Это противоречие — по одному признаку «часы учёбы» их невозможно правильно разделить одним правилом. Именно поэтому никакой одиночный пень не справится с задачей идеально, и нам понадобится ансамбль.

iЧасов учёбыРезультатyНачальный вес w_i
11провалил−10.2000
22сдал+10.2000
33провалил−10.2000
44сдал+10.2000
55сдал+10.2000

На каждом раунде пень будет обучаться с учётом этих весов: точки с большим весом влияют на выбор порога сильнее. Пока все веса одинаковые — пень просто смотрит на большинство. Но после каждого раунда веса перераспределяются так, что ошибочно классифицированные точки становятся важнее — следующий пень будет вынужден уделить им больше внимания.

Псевдокод

Вход: данные (x, y), n_estimators, learning_rate
y_i ∈ {−1, +1} (конвертируем из {0, 1})
w_i = 1/N для всех i# равные начальные веса
for m = 1 to n_estimators:
hₘ = fit_stump(X, y, weights)# обучаем слабый классификатор
εₘ = Σᵢ wᵢ · I(hₘ(xᵢ) ≠ yᵢ)# взвешенная ошибка
αₘ = 0.5 · learning_rate · ln((1−εₘ) / εₘ)# вес классификатора
wᵢ *= exp(−αₘ · yᵢ · hₘ(xᵢ))# обновляем веса
wᵢ /= Σ wⱼ# нормализуем
return H(x) = sign(Σₘ αₘ · hₘ(x))# финальный ансамбль

Итог

Что важно запомнить

Ключевые выводы

  • 1AdaBoost увеличивает веса неправильно классифицированных точек — каждый следующий классификатор фокусируется на «трудных» примерах
  • 2α_m — мера «голоса» классификатора: чем точнее h_m (меньше ε_m), тем весомее его вклад в финальное решение
  • 3При ε_m ≥ 0.5 классификатор хуже случайного — алгоритм теряет смысл и может быть остановлен
  • 4Экспоненциальная функция потерь делает AdaBoost чувствительным к выбросам: шумные точки получают огромные веса
  • 5AdaBoost — частный случай GBM с экспоненциальным loss и слабыми классификаторами в качестве базовых алгоритмов

Когда использовать

ЗадачаРекомендация
Бинарная классификация (чистые данные)Отличный выбор
Данные с выбросами или шумомGBM / XGBoost лучше
РегрессияAdaBoost.R2 (ограниченно)
Быстрый прототип с интерпретируемостьюХороший выбор
Многоклассовая классификацияSAMME.R или другие