Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Важность признаков в ансамбле деревьев
В этом примере показано использование ансамбля деревьев для оценки важности признаков в искусственной задаче классификации. Синие столбцы показывают важность признаков для ансамбля, а погрешности отражают вариативность между деревьями.
Как и ожидалось, график показывает, что информативны 3 признака, а остальные — нет.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause import matplotlib.pyplot as plt
Генерация данных и обучение модели
Мы создадим синтетический набор данных, содержащий только 3 информативных признака. Мы намеренно не будем перемешивать набор данных, чтобы информативными оказались три первых столбца X. Кроме того, мы разделим набор данных на обучающую и тестовую подвыборки.
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(
n_samples=1000,
n_features=10,
n_informative=3,
n_redundant=0,
n_repeated=0,
n_classes=2,
random_state=0,
shuffle=False,
)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
Для вычисления важности признаков будет обучен классификатор случайного леса.
from sklearn.ensemble import RandomForestClassifier
feature_names = [f"feature {i}" for i in range(X.shape[1])]
forest = RandomForestClassifier(random_state=0)
forest.fit(X_train, y_train)
Важность признаков на основе среднего уменьшения неоднородности
Важность признаков доступна в обученном атрибуте feature_importances_ и вычисляется как среднее значение и стандартное отклонение накопленного уменьшения неоднородности внутри каждого дерева.
Предупреждение
Важность признаков, основанная на неоднородности, может вводить в заблуждение для признаков с большим количеством уникальных значений. В качестве альтернативы ниже рассмотрена важность признаков на основе перестановок.
import time
import numpy as np
start_time = time.time()
importances = forest.feature_importances_
std = np.std([tree.feature_importances_ for tree in forest.estimators_], axis=0)
elapsed_time = time.time() - start_time
print(f"Elapsed time to compute the importances: {elapsed_time:.3f} seconds")
Elapsed time to compute the importances: 0.019 seconds
Построим график важности на основе неоднородности.
import pandas as pd
forest_importances = pd.Series(importances, index=feature_names)
fig, ax = plt.subplots()
forest_importances.plot.bar(yerr=std, ax=ax)
ax.set_title("Feature importances using MDI")
ax.set_ylabel("Mean decrease in impurity")
fig.tight_layout()

Как и ожидалось, три первых признака оказались важными.
Важность признаков на основе перестановок
Важность признаков на основе перестановок позволяет преодолеть ограничения важности признаков, основанной на неоднородности: она не смещена в пользу признаков с большим количеством уникальных значений и может вычисляться на отложенной тестовой выборке.
from sklearn.inspection import permutation_importance
start_time = time.time()
result = permutation_importance(
forest, X_test, y_test, n_repeats=10, random_state=42, n_jobs=2
)
elapsed_time = time.time() - start_time
print(f"Elapsed time to compute the importances: {elapsed_time:.3f} seconds")
forest_importances = pd.Series(result.importances_mean, index=feature_names)
Elapsed time to compute the importances: 1.760 seconds
Вычисление полной важности на основе перестановок требует больше ресурсов. Каждый признак перемешивается n раз, после чего модель делает предсказания на данных с переставленными признаками, чтобы оценить снижение качества. Подробнее см. раздел Важность признаков на основе перестановок. Теперь построим график ранжирования важности.
fig, ax = plt.subplots()
forest_importances.plot.bar(yerr=result.importances_std, ax=ax)
ax.set_title("Feature importances using permutation on full model")
ax.set_ylabel("Mean accuracy decrease")
fig.tight_layout()
plt.show()

Оба метода определяют одни и те же признаки как наиболее важные, хотя относительная важность различается. Как видно на графиках, MDI реже, чем важность на основе перестановок, полностью исключает признак из рассмотрения.
Общее время выполнения скрипта: (0 минут 2.311 секунды)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/ensemble/plot_forest_importances.html