Ответ
Случайный лес (Random Forest) обладает встроенными механизмами регуляризации, которые делают его устойчивым к переобучению по сравнению с одиночным решающим деревом. Ключевых механизма два:
-
Бэггинг (Bootstrap Aggregating): Каждое дерево в ансамбле обучается на своей собственной бутстрап-выборке — случайном наборе данных, полученном из исходной тренировочной выборки с возвращением. Это означает:
- Уменьшение дисперсии: Итоговый прогноз — это среднее (регрессия) или мода (классификация) многих моделей. Ошибки отдельных деревьев, вызванные шумом в данных, усредняются.
- Примерная доля Out-of-Bag (OOB) данных: В каждую бутстрап-выборку в среднем попадает ~63% исходных данных. Оставшиеся ~37% (OOB) не используются для обучения конкретного дерева и могут служить для его внутренней валидации.
-
Случайный выбор признаков (Feature Randomness): При построении каждого узла дерева рассматривается не весь набор признаков, а только случайное подмножество (обычно размером
sqrt(n_features)для классификации). Это:- Декоррелирует деревья: Делает деревья менее похожими друг на друга, так как они строятся на разных подпространствах признаков.
- Повышает обобщающую способность: Ансамбль становится более устойчивым к шуму в отдельных признаках.
Практический пример:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# Генерация синтетических данных
X, y = make_classification(n_samples=1000, n_features=20, n_informative=5, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Одно дерево (склонно к переобучению)
dtree = DecisionTreeClassifier(max_depth=None, random_state=42)
dtree.fit(X_train, y_train)
print(f"Accuracy одного дерева (train/test): {dtree.score(X_train, y_train):.3f} / {dtree.score(X_test, y_test):.3f}")
# Случайный лес (устойчив к переобучению)
rf = RandomForestClassifier(n_estimators=100, max_features='sqrt', random_state=42)
rf.fit(X_train, y_train)
print(f"Accuracy случайного леса (train/test): {rf.score(X_train, y_train):.3f} / {rf.score(X_test, y_test):.3f}")
Важно: Случайный лес все же может переобучиться, если задать слишком большое количество деревьев (n_estimators) без ограничения их глубины (max_depth). Однако порог переобучения у него значительно выше, чем у одиночного дерева.