Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает Decision Tree Regressor (Регрессор на основе решающего дерева)
Решающее дерево для регрессии — это алгоритм, который рекурсивно разбивает пространство признаков на прямоугольные области и предсказывает для каждой области постоянное значение (среднее значение целевой переменной в этой области).
Основной процесс обучения
Алгоритм работает по принципу "жадного" разбиения:
- Начало: все данные в корневом узле
- На каждом узле алгоритм пытается найти лучшее разбиение:
- Проверяет все признаки
- Проверяет все возможные пороги разбиения
- Выбирает разбиение, которое минимизирует функцию ошибки
- Рекурсивно повторяет процесс для левого и правого поддеревьев
- Останавливается, когда:
- Достигнута максимальная глубина
- В узле осталось слишком мало примеров
- Невозможно улучшить ошибку
Критерий качества разбиения
Для регрессии используется Mean Squared Error (MSE) или Mean Absolute Error (MAE):
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(criterion='squared_error', max_depth=5)
model.fit(X_train, y_train)
Для каждого возможного разбиения вычисляется улучшение (gain):
Gain = MSE_parent - (N_left/N_parent * MSE_left + N_right/N_parent * MSE_right)
Пример работы
Предположим, нужно предсказать цену квартиры (y) по площади (x1) и возрасту (x2):
Узел 1 (все данные): средняя цена = 3,000,000
├─ Разбиение: если площадь <= 60 м²
│ ├─ Левый узел (площадь <= 60): средняя цена = 1,500,000
│ └─ Правый узел (площадь > 60): средняя цена = 5,000,000
│ ├─ Разбиение: если возраст <= 10 лет
│ │ ├─ Цена = 5,500,000
│ │ └─ Цена = 4,500,000
Предсказание
Для новой точки алгоритм проходит от корня к листу, следуя условиям разбиения:
X_new = [[65, 8]] # площадь 65 м², возраст 8 лет
y_pred = model.predict(X_new) # возвращает значение листа
Код реализации
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
# Создание модели
dt = DecisionTreeRegressor(
max_depth=5, # максимальная глубина
min_samples_split=5, # минимум примеров для разбиения
min_samples_leaf=2, # минимум примеров в листе
random_state=42
)
# Обучение
dt.fit(X_train, y_train)
# Предсказание
y_pred = dt.predict(X_test)
# Оценка
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
print(f"RMSE: {rmse:.2f}")
print(f"R²: {r2:.3f}")
Визуализация дерева
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(20, 10))
plot_tree(dt, feature_names=['area', 'age'], filled=True)
plt.show()
Преимущества и недостатки
Преимущества:
- Интерпретируемость — можно увидеть, как работает модель
- Не требует нормализации признаков
- Работает с нелинейными зависимостями
- Быстро
Недостатки:
- Склонен к переобучению при большой глубине
- Неустойчив — малые изменения данных приводят к другому дереву
- Может работать хуже на новых данных
Регуляризация
Чтобы избежать переобучения, ограничивайте:
dt = DecisionTreeRegressor(
max_depth=5, # не глубже 5 уровней
min_samples_split=10, # минимум 10 примеров для разбиения
min_samples_leaf=5, # минимум 5 примеров в листе
max_features='sqrt' # проверять только sqrt(n_features) признаков
)
Когда использовать
- Когда нужна интерпретируемость
- Когда есть нелинейные зависимости
- Когда признаки имеют разные масштабы
- Как базовый алгоритм для ансамблей (Random Forest, Gradient Boosting)
Решающие деревья — это основа современного машинного обучения и мощный инструмент для регрессии и классификации.