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

Что такое метод случайного леса?

1.7 Middle🔥 262 комментариев
#Машинное обучение

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

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

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

Random Forest (Метод случайного леса)

Random Forest — это ансамблевый алгоритм машинного обучения, который строит множество решающих деревьев на случайных подвыборках данных и объединяет их предсказания для получения более точного и стабильного результата.

Основной принцип

Random Forest использует бэггинг (bootstrap aggregating) и случайность признаков:

  1. Создание подвыборок (Bootstrap): Из исходного датасета размером N случайно с возвратом выбираются B подвыборок размером N. В среднем каждый пример участвует в ~63% подвыборок.

  2. Построение деревьев: На каждой подвыборке строится полное решающее дерево без ограничения глубины.

  3. Случайность признаков: На каждом узле дерева рассматривается не все признаки, а только случайная подвыборка (обычно √m или log₂m, где m — число признаков).

  4. Агрегация: Результаты всех деревьев объединяются через голосование (классификация) или усреднение (регрессия).

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Загрузка данных
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Создание и обучение Random Forest
rf = RandomForestClassifier(
    n_estimators=100,        # Количество деревьев
    max_depth=10,            # Максимальная глубина
    min_samples_split=2,     # Минимум примеров для разбиения узла
    min_samples_leaf=1,      # Минимум примеров в листе
    max_features="sqrt",     # Количество признаков на узел
    random_state=42,
    n_jobs=-1                # Использовать все процессоры
)

rf.fit(X_train, y_train)

# Оценка
score = rf.score(X_test, y_test)
print(f"Accuracy: {score}")  # ~0.93

# Предсказание вероятностей (для вероятностных моделей)
proba = rf.predict_proba(X_test)

Преимущества Random Forest

1. Высокая точность:

  • Обычно получает лучший результат, чем одиночные деревья
  • Минимизирует overfitting благодаря усреднению

2. Обработка нелинейности:

# Random Forest автоматически находит нелинейные взаимосвязи
# Не требует нормализации признаков
import numpy as np

X = np.random.randn(1000, 10)
y = (X[:, 0] > 0) & (X[:, 1]**2 > 1)  # Нелинейная зависимость

rf = RandomForestClassifier()
rf.fit(X, y)
# Получит хороший результат без специальной подготовки

3. Устойчивость к выбросам:

# Random Forest меньше страдает от выбросов, чем регрессия
from sklearn.ensemble import RandomForestRegressor

X = np.random.randn(100, 1)
y = X[:, 0] + np.random.randn(100) * 0.1
y[0] = 1000  # Выброс

rf = RandomForestRegressor()
rf.fit(X, y)
# Предсказания будут разумными несмотря на выброс

4. Важность признаков:

# Можно оценить важность каждого признака
importances = rf.feature_importances_

for i, importance in enumerate(importances):
    print(f"Признак {i}: {importance:.4f}")

# Визуализация
import matplotlib.pyplot as plt
plt.barh(range(len(importances)), importances)
plt.show()

Недостатки

1. Медленная инференция:

import time

# Обучение быстро, инференция медленнее чем линейная модель
start = time.time()
predictions = rf.predict(X_test)
inference_time = time.time() - start

# На больших датасетах и с большим числом деревьев может быть медленным

2. Интерпретируемость:

# Сложно объяснить, почему модель сделала конкретное предсказание
# В отличие от одиночного дерева, где можно проследить путь

# Решение: использовать SHAP values
import shap

explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)

3. Требует больше памяти:

# Хранение 100 деревьев требует больше памяти, чем одно дерево
# Обучение занимает больше времени и памяти

Параметры и настройка

rf = RandomForestClassifier(
    n_estimators=100,        # Больше деревьев = лучше, но медленнее
    max_depth=None,          # Глубина (None = до чистых листьев)
    min_samples_split=2,     # Регуляризация: минимум для разбиения
    min_samples_leaf=1,      # Регуляризация: минимум в листе
    max_features="sqrt",     # "sqrt", "log2", float или int
    bootstrap=True,          # Использовать bootstrap выборки
    oob_score=True,          # Оценка на Out-Of-Bag примерах
    random_state=42
)

# Out-of-bag (OOB) ошибка
print(f"OOB Score: {rf.oob_score_}")

Random Forest vs Gradient Boosting

АспектRandom ForestGradient Boosting
ОбучениеПараллельно (независимые деревья)Последовательно (зависимые деревья)
СкоростьБыстрееМедленнее
ТочностьХорошо для большинства задачЧасто лучше на сложных задачах
OverfittingМенее подверженБолее подвержен, требует регуляризации
ИнтерпретируемостьЛегчеСложнее

Практические рекомендации

# Для начала используй Random Forest с параметрами по умолчанию
rf = RandomForestClassifier(random_state=42, n_jobs=-1)
rf.fit(X_train, y_train)

# Если нужна более высокая точность и есть время:
# 1. Попробуй Gradient Boosting (XGBoost, LightGBM)
# 2. Если результат хуже - возвращайся к Random Forest

# Для большого датасета (>100K примеров):
from sklearn.ensemble import ExtraTreesClassifier
et = ExtraTreesClassifier(random_state=42, n_jobs=-1)
# Extremely Randomized Trees - быстрее Random Forest

Random Forest — один из самых популярных и универсальных алгоритмов машинного обучения, часто являющийся отличной стартовой точкой для решения задач классификации и регрессии.

Что такое метод случайного леса? | PrepBro