Ответ
В дереве решений отбор признаков происходит на этапе построения — алгоритм жадно выбирает один признак на каждом узле для наилучшего разделения данных. Критерий выбора зависит от задачи:
- Классификация: Минимизация индекса Джини (Gini Impurity) или энтропии (Information Gain).
- Регрессия: Минимизация среднеквадратичной ошибки (MSE) или средней абсолютной ошибки (MAE).
Как это работает на практике:
- Для каждого признака в текущем узле алгоритм ищет оптимальное значение порога разделения.
- Выбирается тот признак и порог, которые дают максимальное улучшение выбранного критерия (максимальный прирост информации для классификации, максимальное снижение дисперсии для регрессии).
- Процесс рекурсивно повторяется для дочерних узлов.
Пример с интерпретацией важности признаков:
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()
Ключевой момент: Признак, использованный для разделения в корневом или верхних узлах дерева, обычно имеет наибольшую важность, так как он разделяет данные на наиболее однородные подмножества на раннем этапе.