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

Как происходит предсказание в дереве?

1.0 Junior🔥 161 комментариев
#Машинное обучение

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

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

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

Дерево решений (Decision Tree) — интуитивный алгоритм. Предсказание работает как прохождение по маршруту от корня до листа.

Механизм предсказания

Дерево решений — это иерархическая структура, где каждый узел содержит условие (split), а листья содержат предсказания.

Пошаговый процесс

from sklearn.tree import DecisionTreeClassifier
import numpy as np

X = np.array([[2.5], [3.0], [5.0], [6.0], [7.5]])
y = np.array([0, 0, 1, 1, 1])

tree = DecisionTreeClassifier(max_depth=2)
tree.fit(X, y)

Процесс предсказания для нового значения X=3.2:

  1. Корень: условие X[0] <= 4.5
  2. X=3.2 <= 4.5 → True, идём влево
  3. Левый узел: условие X[0] <= 2.75
  4. X=3.2 <= 2.75 → False, идём вправо
  5. Лист: класс = 0

Простая логика: следуй по условиям вниз до листа.

Как дерево выбирает условия

Каждый split выбирается по критерию примеси данных.

Gini Index

Используется для классификации:

# Gini = 1 - sum(p_i^2)
# где p_i — доля класса i

# Пример: 10 samples, 6 класс A, 4 класс B
gini = 1 - (0.6^2 + 0.4^2) = 0.48

# После split:
# Левый узел: 8 samples (6A, 2B) → gini = 0.375
# Правый узел: 2 samples (0A, 2B) → gini = 0.0

# Weighted Gini = (8/10) * 0.375 + (2/10) * 0.0 = 0.30

Выбирается split с минимальным weighted Gini.

Entropy (Информация)

from math import log2

# Entropy = -sum(p_i * log2(p_i))
entropy = -(0.6 * log2(0.6) + 0.4 * log2(0.4)) ≈ 0.971

# Information Gain = Entropy(parent) - Entropy(children)

Выбирается split с максимальным Information Gain.

Предсказание в Random Forest

В ансамбле (Random Forest) несколько деревьев голосуют:

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100)
rf.fit(X, y)

# Каждое дерево предсказывает
predictions = [tree.predict(X_new) for tree in rf.estimators_]

# Финальное предсказание — большинство голосов
final_prediction = np.bincount(predictions).argmax()

# Или среднее для регрессии
final_prediction = np.mean(predictions)

Вероятности предсказания

# Получить вероятности для каждого класса
probabilities = tree.predict_proba(X_new)
# Например: [[0.2, 0.8]] → 80% вероятность класса 1

# В лесе — средние вероятности от всех деревьев
proba_rf = rf.predict_proba(X_new)

Особенности

  1. Скорость: O(log N) для сбалансированного дерева
  2. Интерпретируемость: видно полный путь решения
  3. Нет экстраполяции: дерево не предсказывает за границами данных
  4. Переобучение: глубокое дерево идеально предсказывает train-данные

Борьба с переобучением

tree = DecisionTreeClassifier(
    max_depth=10,  # Ограничи глубину
    min_samples_split=5,  # Минимум для split
    min_samples_leaf=2,  # Минимум в листе
)

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

  1. max_depth — главный параметр контроля сложности
  2. min_samples_split/leaf — дополнительная защита от переобучения
  3. Random Forest — несколько деревьев дают стабильные предсказания
  4. Проверяй на валидации влияние гиперпараметров

Предсказание в дереве — это просто следование логическим условиям от корня к листу. Прозрачность и скорость делают деревья популярными в production.