Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для скачивания полного примера кода. или для запуска этого примера в вашем браузере через 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)
RandomForestClassifier(random_state=0)
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы отобразить HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может быть отображено, пожалуйста, попробуйте загрузить эту страницу с nbviewer.org.
RandomForestClassifier(random_state=0)


Важность признаков на основе среднего уменьшения неоднородности

Важность признаков предоставляется атрибутом 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()
Feature importances using MDI

Мы наблюдаем, что, как ожидалось, три первых признака считаются важными.

Важность признаков на основе перестановки признаков

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

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()
Feature importances using permutation on full model

Те же признаки выявляются как наиболее важные с помощью обоих методов. Хотя относительные значения важности различаются. Как видно на графиках, МДИ менее склонен, чем важность перестановки, полностью исключить признак.

Общее время выполнения скрипта: (0 минут 1,105 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_forest_importances.ipynb

Download Python source code: plot_forest_importances.py

Download zipped: plot_forest_importances.zip

Связанные примеры

Важность перестановки против важности признака случайного леса (MDI)

Важность перестановки с мультиколлинеарными или коррелированными признаками

Регрессия с помощью градиентного бустинга

Основные моменты выпуска для scikit-learn 0.22

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API