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

Этот пример показывает использование леса деревьев для оценки важности признаков на искусственной задаче классификации. Синие столбцы представляют важность признаков леса, а их изменчивость между деревьями показана полосами ошибок.

Как и ожидалось, график показывает, что 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.



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

Важность признаков предоставляется обученным атрибутом 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.018 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: 1.203 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

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

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

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

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

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

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

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

Градиентный бустинг для регрессии

Градиентный бустинг для регрессии

Основные нововведения в выпуске scikit-learn 0.22

Основные нововведения в выпуске scikit-learn 0.22

Галерея, созданная Sphinx-Gallery