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.
Параметры
random_state random_state: int, экземпляр RandomState или None, по умолчанию None

Управляет как случайностью при бутстреп-выборке данных для построения деревьев (если ``bootstrap=True``), так и выборкой признаков, рассматриваемых при поиске наилучшего разбиения в каждом узле (если ``max_features < n_features``).
Подробнее см. :term:`Глоссарий <random_state>`.
0
n_estimators n_estimators: int, по умолчанию 100

Количество деревьев в ансамбле.

.. versionchanged:: 0.22
Значение `n_estimators` по умолчанию изменено с 10 на 100
в версии 0.22.
100
criterion criterion: {"gini", "entropy", "log_loss"}, по умолчанию "gini"

Функция для оценки качества разбиения. Поддерживаются критерии "gini" для неоднородности Джини, а также "log_loss" и "entropy" для информационного выигрыша по Шеннону; см. :ref:`tree_mathematical_formulation`.
Примечание: этот параметр относится к отдельному дереву.
'gini'
max_depth max_depth: int, по умолчанию None

Максимальная глубина дерева. Если указано None, узлы расширяются, пока все листья не станут чистыми или пока каждый лист не будет содержать меньше объектов, чем min_samples_split.
None
min_samples_split min_samples_split: int или float, по умолчанию 2

Минимальное количество объектов, необходимое для разбиения внутреннего узла:

- Если задано целое число, `min_samples_split` считается минимальным количеством объектов.
- Если задано вещественное число, `min_samples_split` является долей, а
`ceil(min_samples_split * n_samples)` — минимальным
количеством объектов для каждого разбиения.

.. versionchanged:: 0.18
Добавлена поддержка вещественных значений-долей.
2
min_samples_leaf min_samples_leaf: int или float, по умолчанию 1

Минимальное количество объектов, необходимое в листовом узле. Точка разбиения на любой глубине будет рассматриваться, только если в каждой из левой и правой ветвей останется не менее ``min_samples_leaf`` обучающих объектов. Это может сглаживать модель, особенно в задачах регрессии.

- Если задано целое число, `min_samples_leaf` считается минимальным количеством объектов.
- Если задано вещественное число, `min_samples_leaf` является долей, а
`ceil(min_samples_leaf * n_samples)` — минимальным
количеством объектов в каждом узле.

.. versionchanged:: 0.18
Добавлена поддержка вещественных значений-долей.
1
min_weight_fraction_leaf min_weight_fraction_leaf: float, по умолчанию 0.0

Минимальная взвешенная доля общей суммы весов (всех входных объектов), необходимая в листовом узле. Если sample_weight не задан, все объекты имеют одинаковый вес.
0.0
max_features max_features: {"sqrt", "log2", None}, int или float, по умолчанию "sqrt"

Количество признаков, рассматриваемых при поиске наилучшего разбиения:

- Если задано целое число, при каждом разбиении рассматриваются `max_features` признаков.
- Если задано вещественное число, `max_features` является долей, и при каждом разбиении рассматриваются
`max(1, int(max_features * n_features_in_))` признаков.
- Если задано "sqrt", то `max_features=sqrt(n_features)`.
- Если задано "log2", то `max_features=log2(n_features)`.
- Если задано None, то `max_features=n_features`.

.. versionchanged:: 1.1
Значение `max_features` по умолчанию изменено с `"auto"` на `"sqrt"`.

Примечание: поиск разбиения не прекращается, пока не будет найдено хотя бы одно допустимое разбиение объектов узла, даже если для этого фактически потребуется проверить больше признаков, чем ``max_features``.
'sqrt'
max_leaf_nodes max_leaf_nodes: int, по умолчанию None

Строить деревья в порядке убывания приоритета, ограничивая их ``max_leaf_nodes`` листовыми узлами.
Наилучшие узлы определяются относительным уменьшением неоднородности.
Если задано None, количество листовых узлов не ограничено.
None
min_impurity_decrease min_impurity_decrease: float, по умолчанию 0.0

Узел будет разделён, если это разбиение уменьшает неоднородность не менее чем на заданное значение.

Уравнение для взвешенного уменьшения неоднородности:

N_t / N * (impurity - N_t_R / N_t * right_impurity
- N_t_L / N_t * left_impurity)

где ``N`` — общее количество объектов, ``N_t`` — количество объектов в текущем узле, ``N_t_L`` — количество объектов в левом дочернем узле, а ``N_t_R`` — количество объектов в правом дочернем узле.

Если передан ``sample_weight``, ``N``, ``N_t``, ``N_t_R`` и ``N_t_L`` обозначают взвешенные суммы.

.. versionadded:: 0.19
0.0
bootstrap bootstrap: bool, по умолчанию True

Используются ли при построении деревьев бутстреп-выборки. Если False, для построения каждого дерева используется весь набор данных.
True
oob_score oob_score: bool или вызываемый объект, по умолчанию False

Использовать ли вневыборочные объекты для оценки качества обобщения. По умолчанию применяется :func:`~sklearn.metrics.accuracy_score`.
Чтобы использовать пользовательскую метрику, передайте вызываемый объект с сигнатурой `metric(y_true, y_pred)`. Доступно только при `bootstrap=True`.

Пример оценки вневыборочной ошибки (OOB) см. в разделе
:ref:`sphx_glr_auto_examples_ensemble_plot_ensemble_oob.py`.
False
n_jobs n_jobs: int, по умолчанию None

Количество задач для параллельного выполнения. Методы :meth:`fit`, :meth:`predict`, :meth:`decision_path` и :meth:`apply` распараллеливаются по деревьям. ``None`` означает 1, если только не используется контекст :obj:`joblib.parallel_backend`. ``-1`` означает использование всех процессоров. Подробнее см. :term:`Глоссарий <n_jobs>`.
None
verbose verbose: int, по умолчанию 0

Управляет подробностью сообщений при обучении и предсказании.
0
warm_start warm_start: bool, по умолчанию False

Если задано ``True``, используется решение предыдущего вызова fit и в ансамбль добавляются новые оцениватели; иначе строится совершенно новый ансамбль. Подробнее см. :term:`Глоссарий <warm_start>` и :ref:`tree_ensemble_warm_start`.
False
class_weight class_weight: {"balanced", "balanced_subsample"}, словарь или список словарей, по умолчанию None

Веса классов в формате ``{class_label: weight}``. Если не задано, вес каждого класса считается равным единице. Для задач с несколькими выходами можно передать список словарей в том же порядке, что и столбцы y.

Для задач с несколькими выходами (включая многометочную классификацию) веса необходимо указывать для каждого класса каждого столбца в отдельном словаре. Например, для многометочной классификации с четырьмя классами веса следует задать как [{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}], а не как [{1:1}, {2:5}, {3:1}, {4:1}].

Режим "balanced" использует значения y для автоматической настройки весов, обратно пропорциональных частотам классов во входных данных, по формуле ``n_samples / (n_classes * np.bincount(y))``.

Режим "balanced_subsample" аналогичен "balanced", но веса вычисляются на основе бутстреп-выборки для каждого построенного дерева.

Для нескольких выходов веса каждого столбца y перемножаются.

Если указан sample_weight, эти веса будут перемножены с ним (переданным через метод fit).
None
ccp_alpha ccp_alpha: неотрицательное вещественное число, по умолчанию 0.0

Параметр сложности, используемый для обрезки по минимальной стоимости-сложности. Будет выбрано поддерево с наибольшей стоимостью-сложностью, меньшей ``ccp_alpha``. По умолчанию обрезка не выполняется. Подробнее см. :ref:`minimal_cost_complexity_pruning`. Пример такой обрезки приведён в разделе :ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`.

.. versionadded:: 0.22
0.0
max_samples max_samples: int или float, по умолчанию None

Если bootstrap имеет значение True, количество объектов, выбираемых из X для обучения каждого базового оценивателя.

- Если указано None (по умолчанию), выбираются `X.shape[0]` объектов независимо от `sample_weight`.
- Если задано целое число, выбирается `max_samples` объектов.
- Если задано вещественное число, выбираются `max_samples * X.shape[0]` объектов без весов или `max_samples * sample_weight.sum()` объектов с весами.

.. versionadded:: 0.22

.. versionchanged:: 1.9
Для выборок с весами вещественное значение `max_samples` рассчитывается относительно `sample_weight.sum()`, а не `X.shape[0]`.
None
monotonic_cst monotonic_cst: массив целых чисел формы (n_features), по умолчанию None

Задаёт ограничение монотонности для каждого признака.
- 1: монотонное возрастание
- 0: без ограничений
- -1: монотонное убывание

Если monotonic_cst равен None, ограничения не применяются.

Ограничения монотонности не поддерживаются для:
- классификации с несколькими классами (то есть когда `n_classes > 2`),
- классификации с несколькими выходами (то есть когда `n_outputs_ > 1`).

Ограничения применяются к вероятности положительного класса.

Подробнее см. :ref:`Руководство пользователя <monotonic_cst_gbdt>`.

.. versionadded:: 1.4
None
Обученные атрибуты
Имя Тип Значение
classes_ classes_: ndarray формы (n_classes,) или список таких массивов

Метки классов (для задачи с одним выходом) или список массивов меток классов (для задачи с несколькими выходами).
ndarray[int64](2,) [0,1]
estimator_ estimator_: :class:`~sklearn.tree.DecisionTreeClassifier`

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

.. versionadded:: 1.2
`base_estimator_` переименован в `estimator_`.
DecisionTreeClassifier DecisionTreeClassifier()
estimators_ estimators_: список DecisionTreeClassifier

Коллекция обученных дочерних оценивателей.
list [DecisionTreeC...ate=209652396), DecisionTreeC...ate=398764591), DecisionTreeC...ate=924231285), DecisionTreeC...te=1478610112), ...]
estimators_samples_ estimators_samples_: список массивов

Подмножество выбранных объектов (то есть объектов, попавших в выборку) для каждого базового оценивателя. Каждое подмножество задано массивом выбранных индексов.

.. versionadded:: 1.4
list [array([236, 2..., dtype=int32), array([107, 1..., dtype=int32), array([301, 5..., dtype=int32), array([357, 1..., dtype=int32), ...]
feature_importances_ feature_importances_: ndarray формы (n_features,)

Важность признаков, основанная на неоднородности.
Чем выше значение, тем важнее признак.
Важность признака вычисляется как общее (нормализованное) уменьшение критерия, обусловленное этим признаком. Также известна как важность Джини.

Предупреждение: важность признаков, основанная на неоднородности, может вводить в заблуждение для признаков с большим количеством уникальных значений. В качестве альтернативы см. :func:`sklearn.inspection.permutation_importance`.
ndarray[float64](10,) [0.21,0.32,0.2 ,...,0.04,0.04,0.04]
n_classes_ n_classes_: int или список

Количество классов (для задачи с одним выходом) или список, содержащий количество классов для каждого выхода (для задачи с несколькими выходами).
int 2
n_features_in_ n_features_in_: int

Количество признаков, использованных при :term:`обучении`.

.. versionadded:: 0.24
int 10
n_outputs_ n_outputs_: int

Количество выходов при выполнении ``fit``.
int 1


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

Важность признаков доступна в обученном атрибуте 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()
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.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()
Feature importances using permutation on full model

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

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

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–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

Spec-Zone.ru

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