← Назад к вопросам

Какая должна быть глубина дерева в Random Forest?

1.7 Middle🔥 172 комментариев
#Машинное обучение#Метрики и оценка моделей

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Глубина дерева в Random Forest — критический гиперпараметр для контроля сложности модели. Она влияет на bias-variance trade-off.

Теория: Bias-Variance Trade-off

  • Глубокие деревья: низкий bias, высокий variance → переобучение
  • Мелкие деревья: высокий bias, низкий variance → недообучение
  • Оптимум: баланс между ними на валидационном наборе

Практические значения

Классификация

from sklearn.ensemble import RandomForestClassifier

# Стандартный подход
rf = RandomForestClassifier(
    max_depth=10,
    min_samples_split=5,
    min_samples_leaf=2,
    n_estimators=100
)

Регрессия

from sklearn.ensemble import RandomForestRegressor

# Регрессия часто требует более глубокие деревья
rf = RandomForestRegressor(
    max_depth=15,
    min_samples_split=5,
    min_samples_leaf=2,
    n_estimators=100
)

Выбор глубины по размеру данных

Маленькие датасеты (<1000 строк)

rf_small = RandomForestClassifier(
    max_depth=5,
    min_samples_split=10,
    min_samples_leaf=5
)

Средние датасеты (1k-100k)

rf_medium = RandomForestClassifier(
    max_depth=12,
    min_samples_split=5,
    min_samples_leaf=2
)

Большие датасеты (>100k)

rf_large = RandomForestClassifier(
    max_depth=20,
    min_samples_split=10,
    min_samples_leaf=5
)

Grid Search для оптимизации

from sklearn.model_selection import GridSearchCV

param_grid = {
    "max_depth": [5, 10, 15, 20],
    "min_samples_split": [2, 5, 10],
    "min_samples_leaf": [1, 2, 4]
}

grid = GridSearchCV(
    RandomForestClassifier(n_estimators=100),
    param_grid,
    cv=5
)

grid.fit(X_train, y_train)
print(f"Best params: {grid.best_params_}")

Проверка переобучения

from sklearn.model_selection import cross_val_score

for depth in [5, 10, 15, 20, None]:
    rf = RandomForestClassifier(max_depth=depth, n_estimators=100)
    scores = cross_val_score(rf, X_train, y_train, cv=5)
    print(f"max_depth={depth}: {scores.mean():.4f}")

Ищи глубину где валидационная метрика максимальна.

Стандартные значения

  • max_depth=10-15 — стандарт
  • max_depth=None — деревья растут полностью (переобучение!)
  • min_samples_split=5 — баланс
  • min_samples_leaf=2 — не слишком жёсто

Связь параметров

При увеличении max_depth:

  • Увеличивай min_samples_split
  • Увеличивай min_samples_leaf
  • Увеличивай n_estimators
rf_deep = RandomForestClassifier(
    max_depth=20,
    min_samples_split=10,  # было 5
    min_samples_leaf=5,    # было 2
    n_estimators=200       # было 100
)

Практические советы

  1. Начни с max_depth=10 как baseline
  2. Проверь на кросс-валидации переобучение
  3. Если gap train/val растёт — уменьшай глубину
  4. Если валидация улучшается — увеличивай глубину
  5. Используй Grid Search для точной настройки
  6. Сравни с одним деревом для понимания baseline
  7. Больше деревьев компенсирует ограничения

Оптимальная глубина находится через cross-validation экспериментально.