Как работает решающее дерево для регрессии (Decision Tree Regressor)?

Ответ

Decision Tree Regressor — это модель, которая предсказывает непрерывную целевую переменную, рекурсивно разбивая пространство признаков на прямоугольные области (листья) и присваивая каждому листу постоянное значение — среднее значение целевой переменной обучающих выборок, попавших в этот лист.

Алгоритм построения (жадный):

  1. Начало: Весь набор данных считается корневым узлом.
  2. Выбор лучшего разделения: Для каждого признака и каждого возможного порогового значения (например, средние между соседними значениями) алгоритм вычисляет, насколько разделение уменьшит неоднородность в дочерних узлах.
    • Критерий для регрессии: Чаще всего используется дисперсия (или эквивалентно, среднеквадратичная ошибка (MSE) внутри узла). Алгоритм ищет разделение (признак, порог), которое максимизирует уменьшение дисперсии (или MSE).
    • Прирост информации (снижение MSE): MSE_parent - (weight_left * MSE_left + weight_right * MSE_right).
  3. Рекурсия: Шаг 2 рекурсивно повторяется для каждого дочернего узла, используя только данные, попавшие в этот узел.
  4. Критерии остановки: Рекурсия прекращается, когда выполняется одно из условий:
    • Достигнута max_depth (максимальная глубина).
    • В узле меньше min_samples_split образцов.
    • Снижение MSE меньше min_impurity_decrease.
    • В листе меньше min_samples_leaf образцов.
  5. Присвоение значения листу: Значением листа становится среднее арифметическое y всех обучающих образцов, попавших в этот лист.

Пример использования и визуализации в sklearn:

from sklearn.tree import DecisionTreeRegressor, plot_tree
import matplotlib.pyplot as plt

# Создание и обучение модели
regressor = DecisionTreeRegressor(max_depth=3, min_samples_leaf=5, random_state=42)
regressor.fit(X_train, y_train)

# Предсказание
y_pred = regressor.predict(X_test)

# Визуализация дерева (ключевое преимущество — интерпретируемость)
plt.figure(figsize=(12,8))
plot_tree(regressor, feature_names=X.columns, filled=True, rounded=True)
plt.show()

Сильные и слабые стороны:

  • Плюсы:

    • Высокая интерпретируемость. Можно проследить логику предсказания.
    • Не требует масштабирования/нормализации признаков.
    • Может моделировать нелинейные зависимости.
    • Работает с категориальными и числовыми признаками.
  • Минусы:

    • Высокая склонность к переобучению, особенно без ограничений глубины. Всегда требуется тщательная настройка гиперпараметров или использование в ансамблях (Random Forest, Gradient Boosting).
    • Нестабильность: Небольшие изменения в данных могут привести к построению совершенно другого дерева.
    • Плохая экстраполяция: Не может делать предсказания за пределами диапазона обучающих данных.

Ответ 18+ 🔞

Да ты посмотри, какая хитрая жопа этот Decision Tree Regressor! Это же просто дерево решений, только для чисел, а не для классов. Представь себе — алгоритм берёт твои данные и начинает их пилить на прямоугольники, как сумасшедший плотник, пока не получит кучу коробочек. А потом в каждую такую коробочку смотрит и говорит: «Ага, тут у вас все цифры в среднем вот такие, значит и предсказывать буду это среднее». Всё, приехали.

Как он это делает, этот полупидор:

  1. Стартуем: Берём всю нашу тренировочную толпу и объявляем её корнем дерева. Всё в одной куче.
  2. Ищем, где бы впендюрить: Алгоритм начинает перебирать все признаки и все возможные пороги между значениями. Его цель — найти такую отсечку, чтобы после неё данные в получившихся двух кучках стали как можно более «похожими» внутри себя. Для регрессии это значит — с минимальной дисперсией. Считает он прирост информации через снижение MSE. Короче, ищет способ развалить родительский узел так, чтобы детишки меньше шумели.
  3. Повторяем до посинения: Нашли лучшее разделение — сделали два новых узла. И теперь для каждого из этих узлов запускаем ту же самую песню снова, но только на данных, которые в этот узел попали. Рекурсия, ёпта!
  4. Когда пора остановиться, пока не накрылся медным тазом: Дерево не будет расти вечно. Оно упрётся в ограничения:
    • Достигли max_depth — максимальной глубины. Всё, дальше нельзя, иди на хуй.
    • В узле осталось меньше min_samples_split образцов — делить уже нечего, одни слезы.
    • Снижение MSE стало меньше min_impurity_decrease — игра не стоит свеч, овердохуища усилий, а выхлоп — ноль.
    • В листе окажется меньше min_samples_leaf образцов — такой лист будет слишком уж чахлым, стыдно такой показывать.
  5. Финал — вердикт для листа: Когда рекурсия закончилась, каждый лист (конечная коробочка) получает своё значение. Какое? Да просто среднее арифметическое всех y, которые в эту коробочку свалились. И всё, предсказание готово.

Как этим пользоваться, не облажавшись:

from sklearn.tree import DecisionTreeRegressor, plot_tree
import matplotlib.pyplot as plt

# Создаём и обучаем нашу мудя-модель
regressor = DecisionTreeRegressor(max_depth=3, min_samples_leaf=5, random_state=42)
regressor.fit(X_train, y_train)

# Просим её предсказать что-то
y_pred = regressor.predict(X_test)

# А вот это главный кайф — можно посмотреть, что она понастроила!
plt.figure(figsize=(12,8))
plot_tree(regressor, feature_names=X.columns, filled=True, rounded=True)
plt.show()

А теперь трезво посмотрим на его сильные и слабые стороны:

  • Плюсы (почему его иногда любят):

    • Прозрачность, как у слезы. Можно пройти по дереву и понять, бля, почему оно выдало именно такой прогноз. Не чёрный ящик, а почти что инструкция.
    • Ему похуй на масштабы. Можешь не париться с нормализацией — ему всё равно.
    • Нелинейности ловит за жопу. Не ограничен какими-то там линейными зависимостями.
    • И с числами, и с категориями работает. Универсальный солдат, хуле.
  • Минусы (почему его часто посылают на хуй):

    • Склонность к переобучению — просто пиздец. Если дать ему волю, он построит такое дерево, где в каждом листе будет по одному наблюдению, и на тренировочных данных будет бог, а на новых — хуй с горы. Гиперпараметры настраивать — это святое.
    • Нестабильный, как психика у поэта. Чуть данные качнулись — и всё дерево уже другое. Доверия ебать ноль.
    • За пределы данных думать не умеет. Если спросить его про значение, которого он в тренировке не видел, он тебе такую хуйню сморозит... Экстраполяция — это не его.