Как отбираются признаки в дереве решений?

«Как отбираются признаки в дереве решений?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В дереве решений отбор признаков происходит на этапе построения — алгоритм жадно выбирает один признак на каждом узле для наилучшего разделения данных. Критерий выбора зависит от задачи:

  • Классификация: Минимизация индекса Джини (Gini Impurity) или энтропии (Information Gain).
  • Регрессия: Минимизация среднеквадратичной ошибки (MSE) или средней абсолютной ошибки (MAE).

Как это работает на практике:

  1. Для каждого признака в текущем узле алгоритм ищет оптимальное значение порога разделения.
  2. Выбирается тот признак и порог, которые дают максимальное улучшение выбранного критерия (максимальный прирост информации для классификации, максимальное снижение дисперсии для регрессии).
  3. Процесс рекурсивно повторяется для дочерних узлов.

Пример с интерпретацией важности признаков:

from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

# Загрузка данных
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучение модели
model = DecisionTreeClassifier(max_depth=3, random_state=42) # Ограничиваем глубину для наглядности
model.fit(X_train, y_train)

# Важность признаков (сумма нормализована до 1)
importances = model.feature_importances_
feature_names = data.feature_names

# Вывод топ-5 самых важных признаков
for idx in np.argsort(importances)[-5:][::-1]:
    print(f"{feature_names[idx]}: {importances[idx]:.3f}")

# Визуализация дерева (опционально)
plt.figure(figsize=(15,8))
plot_tree(model, feature_names=feature_names, filled=True, rounded=True)
plt.show()

Ключевой момент: Признак, использованный для разделения в корневом или верхних узлах дерева, обычно имеет наибольшую важность, так как он разделяет данные на наиболее однородные подмножества на раннем этапе.