Обязательно

Random Forest

Учимся объединять много деревьев в ансамбль — баггинг, случайные подпространства и почему это работает.

Время изучения: 15 мин

Идея: много деревьев лучше одного

Одно решающее дерево — нестабильное и склонно к переобучению. Но что, если обучить сотню деревьев и усреднить их ответы? Каждое дерево ошибается по-своему, но их коллективное решение оказывается намного точнее и стабильнее.

Это и есть Random Forest — ансамбль деревьев решений, который использует два источника случайности для «разнообразия» деревьев: bagging и random subspace.

Bagging: обучаем на подвыборках

Bagging (Bootstrap AGGregatING) — первый источник случайности:

  • Из исходного датасета размером N делаем T случайных выборок (с возвращением) тоже размером N
  • Каждая выборка немного отличается — в среднем содержит ~63% уникальных объектов
  • На каждой выборке обучаем отдельное дерево
  • Финальный ответ — голосование (классификация) или среднее (регрессия)

Почему 63%? Вероятность НЕ попасть в выборку для одного объекта = (1 − 1/N)^N ≈ 1/e ≈ 0.37. Значит, попадёт с вероятностью ≈ 0.63.

Random Subspace: случайные признаки

Второй источник случайности: при каждом разбиении узла дерево рассматривает не ВСЕ признаки, а случайное подмножество. Обычно:

  • Для классификации: √m признаков (где m — общее число признаков)
  • Для регрессии: m/3 признаков
  • Это делает деревья ещё более разнообразными

Без этого трюка все деревья были бы похожи — они бы начинали с одного и того же «лучшего» признака. С random subspace разные деревья используют разные признаки → ошибки не коррелируют → ансамбль работает лучше.

Почему RF стабильнее одного дерева

Математически: дисперсия среднего N независимых случайных величин в N раз меньше дисперсии каждой. Чем менее коррелированы деревья — тем сильнее эффект усреднения.

  • Bagging уменьшает дисперсию (variance) за счёт усреднения
  • Random subspace уменьшает корреляцию между деревьями
  • В итоге: RF почти не переобучается при добавлении деревьев (в отличие от бустинга)
  • Одно дерево может сильно измениться от +1 объекта в данных. RF — почти нет

🎤 Random Forest — хороший baseline для почти любой задачи

Если вы не знаете, с чего начать — начните с RF. Он работает «из коробки», не требует нормализации, устойчив к выбросам, и почти всегда даёт приемлемый результат. Это не лучшая модель, но отличная стартовая точка.

Out-of-Bag Score

Помнишь, что каждое дерево обучается на ~63% данных? Оставшиеся ~37% не участвовали в обучении этого дерева. Их можно использовать как бесплатную валидацию!

  • Для каждого объекта собираем предсказания только тех деревьев, которые НЕ видели этот объект при обучении
  • Усредняем эти предсказания → получаем OOB-предсказание
  • OOB Score ≈ качество на валидационной выборке, но без необходимости выделять отдельный val set
  • В sklearn: `RandomForestClassifier(oob_score=True)`

Feature Importance

Random Forest умеет оценивать важность признаков — это одна из его суперсил.

MDI (Mean Decrease in Impurity)

Для каждого признака суммируем, насколько он уменьшил Gini/Entropy во всех узлах всех деревьев. Чем больше вклад — тем важнее признак. Быстро, но может переоценивать категориальные признаки с большим числом значений.

Permutation Importance

Берём обученную модель, перемешиваем значения одного признака случайным образом и смотрим, насколько упало качество. Если сильно упало — признак важный. Медленнее, но честнее.

Осторожно с важностью при коррелированных признаках

Если два признака сильно коррелируют — важность «размазывается» между ними. Каждый по отдельности кажется менее важным, чем есть на самом деле.

Ключевые гиперпараметры

  • n_estimators — количество деревьев (100–500 обычно достаточно, больше = лучше, но медленнее)
  • max_depth — глубина деревьев (None = без ограничений, но для RF это ок — bagging борется с переобучением)
  • max_features — сколько признаков рассматривать при разбиении (√m для классификации)
  • min_samples_leaf — минимум объектов в листе (чем больше — тем проще деревья)
  • n_jobs=-1 — параллелизация! Деревья независимы → можно обучать на всех ядрах

Итого

  • Random Forest = bagging + random subspace → ансамбль разнообразных деревьев
  • Уменьшает дисперсию за счёт усреднения
  • OOB Score — бесплатная оценка качества
  • Feature Importance — понимаем, какие признаки важны
  • Почти не переобучается при увеличении числа деревьев
  • Идеальный baseline: работает из коробки, быстро, надёжно