Эпоха 2 · Фундамент · 2001

12 Random Forests

Random Forests · Leo Breiman · Machine Learning
🟧 оригинал выборочно~1.5–2 чоригинал ↗
Суть за 20 секунд. Ансамбль деревьев с двойной случайностью — bootstrap-выборки и случайные признаки на сплитах. Декоррелированные деревья усредняются → низкая дисперсия без переобучения, плюс бесплатные OOB-оценка и важность признаков. Дефолтный сильный бейзлайн для табличных данных.

Контекст

Одно решающее дерево интерпретируемо, но переобучается и нестабильно: чуть изменил данные — другое дерево. Брейман (2001) собирает из деревьев мощный устойчивый ансамбль.

Идея и механизм

Двойная случайность. Bagging: каждое дерево учится на bootstrap-выборке (случайная выборка с возвращением). Случайные признаки: на каждом сплите дерево выбирает лучший признак из случайного подмножества фичей. Это декоррелирует деревья — они не копируют друг друга. Предсказание — голосование (классификация) или усреднение (регрессия).

теория вероятностей Почему усреднение снижает дисперсию — и при чём тут декорреляция

Пусть есть B деревьев, у каждого дисперсия предсказания σ², а попарная корреляция между деревьями — ρ. Дисперсия их среднего:

Var(1B Σb Tb) = ρ σ² + 1 − ρB σ²

Отсюда вся стратегия случайного леса:

  • Больше деревьев (B → ∞) гасит второй член → дисперсия упирается в пол ρσ². Поэтому добавление деревьев не переобучает — лишь сходится к пределу.
  • Чтобы опустить сам пол, надо уменьшить корреляцию ρ — это и делает случайный выбор признаков на сплитах. Bagging бьёт по (1−ρ)/B, случайные фичи — по ρ.

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

scikit-learn Случайный лес с OOB-оценкой
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=300, oob_score=True).fit(X, y)
print(rf.oob_score_)            # оценка качества без отдельной валидации
print(rf.feature_importances_)  # важность признаков почти бесплатно
данные bootstrap 1 bootstrap 2 bootstrap 3 дерево дерево дерево голосование/ усреднение
Каждое дерево — на своей bootstrap-выборке и со случайными признаками; их голоса усредняются. Разнообразие деревьев гасит дисперсию.
Аналогия. Чтобы угадать число в банке, спросите не одного эксперта, а толпу разных людей и усредните. Если все смотрят на банку с одной стороны (коррелированы), толпа ошибётся вместе. Заставьте каждого смотреть со своего ракурса (случайные признаки) — их независимые ошибки взаимно погасятся. Это «мудрость толпы», и она тем точнее, чем разнообразнее голоса.

Почему это важно

До сих пор дефолтный сильный бейзлайн для табличных данных (вместе с градиентным бустингом). Брейман доказал, что лес не переобучается с числом деревьев, и подарил два практичных бесплатных инструмента — OOB-оценку и важность признаков. Идеи bagging и декорреляции — общие для всех ансамблей.

Связи

↔ другой классик10. SVM

Два столпа классического ML 2000-х: SVM (выпуклая оптимизация + ядра, силён в высокой размерности) и случайный лес (ансамбль деревьев, силён на разнородных табличных признаках). Оба — крепкие бейзлайны вне deep learning.

↔ контраст с DL16. AlexNet

Лес не учит представление — он комбинирует решения по исходным признакам. На задачах, где признаки надо извлекать из сырых данных (пиксели, звук, текст), его побеждают глубокие сети. Но на структурированных табличных данных деревья-ансамбли до сих пор часто бьют нейросети.

→ родственник31. Mixture-of-Experts

И там, и там — «много специалистов вместо одного». Но лес усредняет все деревья (ансамбль), а MoE через gating активирует лишь немногих экспертов на каждый вход (условные вычисления). Разные ответы на вопрос «как объединять много моделей».

Вопросы пытливого ума

Если лес не переобучается от числа деревьев — можно ставить миллионы?

Качество перестанет расти задолго до этого: дисперсия упирается в пол ρσ², и лишние деревья лишь жгут вычисления. Важно: «не переобучается по числу деревьев» не значит «не переобучается вообще» — слишком глубокие деревья на маленьких данных всё равно подгонят шум. Регуляризуют глубиной и минимальным размером листа, а не числом деревьев.

Чем случайный лес отличается от градиентного бустинга — оба же ансамбли деревьев?

Лес строит деревья параллельно и независимо, борясь с дисперсией усреднением. Бустинг строит деревья последовательно, каждое исправляет ошибки предыдущих, борясь со смещением. Бустинг обычно точнее, но чувствительнее к настройке и переобучению; лес проще и устойчивее «из коробки».

Важности признаков «бесплатны» — можно ли им доверять?

С осторожностью. Стандартная важность по уменьшению impurity смещена в сторону признаков с многими уровнями (например, непрерывных или с высокой кардинальностью) и страдает при коррелированных признаках. Надёжнее permutation importance (на отложенных данных) или SHAP. «Бесплатно» ≠ «безусловно корректно».

Что читать в оригинале

Читать ключевое — bagging + случайные признаки, OOB и важность признаков; доказательство сходимости можно взять на уровне идеи (мат-блок выше).