Примечание
Перейти к концу для скачивания полного примера кода. или для запуска этого примера в вашем браузере через 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)
Важность признаков на основе среднего уменьшения неоднородности
Важность признаков предоставляется атрибутом fitted 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.009 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: 0.575 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()

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