Лекция 8. Ансамбли: случайный лес и
бэггинг
Цель лекции. Изучить принцип ансамблевого обучения, механизм
бэггинга и устройство случайного леса. Рассмотреть бутстреп-выборки, случайный
отбор признаков, объединение прогнозов, оценку качества на out-of-bag наблюдениях и практическую реализацию в Python.
Ключевые понятия: ансамбль, базовая модель, бэггинг, бутстреп,
случайный лес, случайный выбор признаков, голосование, усреднение, out-of-bag оценка, важность признаков.
1. Ансамблевое обучение: основная идея
Ансамбль (Ensemble) — модель, которая объединяет прогнозы
нескольких базовых алгоритмов. Основная идея состоит в том, что несколько
достаточно разнообразных моделей могут давать более устойчивый результат, чем
одна модель.
В предыдущей лекции рассматривались
деревья решений. Одиночное дерево легко интерпретировать, но его структура
может сильно изменяться при небольших изменениях обучающих данных. Ансамбли
деревьев помогают уменьшить эту нестабильность.
Для регрессии прогноз ансамбля из
моделей
часто вычисляется усреднением:

где
— прогноз b-й модели, а
— число
моделей.
При классификации распространённый способ
— голосование: выбирается класс, получивший наибольшее число голосов. В других
ансамблях могут усредняться вероятности классов.
Эффективность объединения зависит от
качества отдельных моделей и степени корреляции их ошибок. Если все модели
ошибаются одинаково, выигрыш от ансамбля будет ограниченным.
Бэггинг (Bootstrap Aggregating) — ансамблевый метод, в котором базовые
модели обучаются независимо на разных выборках, сформированных из исходного
обучающего набора.
Для формирования каждой выборки
используется бутстреп (Bootstrap): случайно выбираются
наблюдений
из исходных
с
возвращением. Поэтому одно наблюдение может встретиться несколько раз, а другое
— не попасть в конкретную выборку.
Последовательность работы бэггинга:
1.
Из
обучающих данных формируется несколько бутстреп-выборок.
2.
На
каждой выборке обучается отдельная базовая модель, например дерево решений.
3.
Для
нового объекта каждая модель строит прогноз.
4.
Прогнозы
объединяются голосованием или усреднением.
Вероятность того, что конкретный объект не
попадёт в одну бутстреп-выборку, равна:
![]()
При достаточно большом
эта
величина приближается к:
![]()
Таким образом, около 36,8% исходных
наблюдений в среднем не попадают в отдельную бутстреп-выборку. Они могут
использоваться для дополнительной оценки модели.
Бэггинг прежде всего помогает уменьшать
разброс (variance) нестабильных моделей. При этом он не гарантирует
устранения систематической ошибки (bias).
3. Случайный лес: развитие идеи бэггинга
Случайный лес (Random Forest) — ансамбль деревьев решений, в котором
сочетаются бутстреп-выборки и случайный выбор признаков при построении
разбиений.
Обычный бэггинг деревьев использует разные
обучающие выборки, но сильный признак может регулярно становиться первым
условием во многих деревьях. В результате деревья остаются похожими друг на
друга.
Случайный лес дополнительно ограничивает
набор признаков, рассматриваемых при каждом разбиении узла. Это способствует
разнообразию деревьев и снижению корреляции их ошибок.
Пример. Пусть в данных 16 признаков. Если при каждом
разбиении рассматриваются только 4 случайно выбранных признака, отдельные
деревья могут находить разные правила даже при наличии одного особенно
информативного признака.
В scikit-learn параметр max_features управляет числом признаков, рассматриваемых при
поиске лучшего разбиения. Параметр n_estimators задаёт число деревьев.
Для классификации случайный лес обычно
выбирает класс на основе усреднённых вероятностей деревьев. Для регрессии
используется среднее их числовых прогнозов.
4. Почему ансамбль может быть устойчивее
одного дерева
Предположим, что ошибки
базовых
моделей имеют одинаковую дисперсию
и попарную корреляцию
. Тогда дисперсия их среднего равна:
![]()
Здесь
— средняя
ошибка моделей. Эта формула иллюстрирует два важных эффекта:
•
При
увеличении числа деревьев вклад независимой части ошибок уменьшается.
• Если ошибки сильно коррелированы (
близка к
1), добавление деревьев даёт меньший выигрыш.
Именно поэтому случайный выбор признаков важен: он
помогает сделать деревья менее похожими.
Однако увеличение числа деревьев не обязательно
улучшает качество бесконечно. Обычно после некоторого значения результат
стабилизируется, тогда как время обучения и потребление памяти продолжают
расти.
5. Out-of-bag оценка и важность признаков
Out-of-bag оценка
Out-of-bag (OOB) наблюдения — объекты, не попавшие в бутстреп-выборку
конкретного дерева. Для каждого обучающего объекта можно объединить прогнозы
только тех деревьев, которые не использовали этот объект при обучении.
Так получается OOB-оценка качества без выделения отдельной валидационной выборки. Она полезна как
дополнительная оценка, но не заменяет независимую тестовую выборку для окончательной
проверки модели.
В RandomForestClassifier OOB-оценка доступна при bootstrap=True и oob_score=True.
Случайный лес позволяет оценивать вклад
признаков. Один из встроенных подходов основан на суммарном уменьшении
неоднородности узлов при разбиениях по конкретному признаку.
Однако такая важность может быть смещена в
пользу признаков с большим числом возможных значений. Кроме того, при сильно
коррелированных признаках интерпретация усложняется.
Альтернативой служит перестановочная
важность (Permutation Importance): значения одного признака перемешиваются,
затем измеряется ухудшение качества модели. Если качество заметно падает,
признак, вероятно, важен для прогнозирования. Оценку следует проводить на
подходящих отложенных данных.
6. Практическая реализация на Python
Рассмотрим сравнение одного дерева
решений, бэггинга и случайного леса на задаче классификации.
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier,
RandomForestClassifier
from sklearn.metrics import accuracy_score,
classification_report
X, y = make_classification(
n_samples=1000,
n_features=12,
n_informative=7,
n_redundant=2,
random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42,
stratify=y
)
models = {
"Одно дерево":
DecisionTreeClassifier(random_state=42),
"Бэггинг": BaggingClassifier(
estimator=DecisionTreeClassifier(random_state=42),
n_estimators=100,
random_state=42,
n_jobs=-1
),
"Случайный лес":
RandomForestClassifier(
n_estimators=100,
max_features="sqrt",
oob_score=True,
random_state=42,
n_jobs=-1
)
}
for name, model in models.items():
model.fit(X_train, y_train)
prediction = model.predict(X_test)
print(f"{name}: Accuracy =
{accuracy_score(y_test, prediction):.3f}")
forest = models["Случайный лес"]
print("OOB score:", round(forest.oob_score_, 3))
print(classification_report(y_test, forest.predict(X_test)))
В примере создаётся набор данных для
бинарной классификации. Затем обучаются три модели: отдельное дерево, бэггинг
деревьев и случайный лес. Сравниваются значения Accuracy на одинаковой тестовой выборке.
Обратите внимание: конкретные результаты
зависят от структуры данных и параметров. Ансамбль не обязан превосходить
одиночное дерево на каждом наборе данных.
Эксперимент с количеством деревьев
Для исследования влияния числа деревьев
можно использовать OOB-оценку на обучающей выборке:
for n_trees in [20, 50, 100, 200]:
candidate = RandomForestClassifier(
n_estimators=n_trees,
oob_score=True,
random_state=42,
n_jobs=-1
)
candidate.fit(X_train, y_train)
print(f"Деревьев: {n_trees}; OOB
= {candidate.oob_score_:.3f}")
Сравните, как меняется OOB-оценка при увеличении числа деревьев. Для подбора гиперпараметров можно также
использовать перекрёстную проверку на обучающих данных, оставляя тестовую
выборку для финальной оценки.
7. Практическое значение и выводы
Бэггинг и случайный лес позволяют
объединять несколько деревьев решений и получать более устойчивые прогнозы.
Бэггинг создаёт разнообразие с помощью бутстреп-выборок, а случайный лес
дополнительно случайным образом выбирает признаки при разбиениях.
Эти методы часто дают хорошие результаты
на табличных данных и не требуют обязательной стандартизации числовых
признаков. Их недостатки — повышенные затраты памяти и времени по сравнению с
одиночным деревом, а также меньшая прозрачность итогового решения.
Главный результат лекции: понимание того, как ансамбль уменьшает
нестабильность отдельных деревьев, почему случайный лес использует и бутстреп,
и случайный выбор признаков, а также как оценивать и настраивать такую модель.