Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.

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

В этом примере мы сравним важность признаков на основе impurity для RandomForestClassifier с важностью перестановок на наборе данных Titanic с помощью permutation_importance. Мы покажем, что важность признаков на основе impurity может завышать важность числовых признаков.

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

В этом примере показано, как использовать важность перестановок в качестве альтернативы, позволяющей смягчить эти ограничения.

Литература

  • L. Breiman, «Random Forests», Machine Learning, 45(1), 5–32, 2001.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Загрузка данных и конструирование признаков

Загрузим с помощью pandas копию набора данных Titanic. Ниже показано, как выполнять отдельную предварительную обработку числовых и категориальных признаков.

Кроме того, мы добавим две случайные переменные, никак не связанные с целевой переменной (survived):

  • random_num — числовая переменная с высокой кардинальностью (столько же уникальных значений, сколько записей).
  • random_cat — категориальная переменная с низкой кардинальностью (3 возможных значения).
import numpy as np

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split

X, y = fetch_openml("titanic", version=1, as_frame=True, return_X_y=True)
rng = np.random.RandomState(seed=42)
X["random_cat"] = rng.randint(3, size=X.shape[0])
X["random_num"] = rng.randn(X.shape[0])

categorical_columns = ["pclass", "sex", "embarked", "random_cat"]
numerical_columns = ["age", "sibsp", "parch", "fare", "random_num"]

X = X[categorical_columns + numerical_columns]
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)

Определим предиктивную модель на основе случайного леса. Поэтому выполним следующие шаги предварительной обработки:

  • используем OrdinalEncoder для кодирования категориальных признаков;
  • используем SimpleImputer для заполнения пропущенных значений числовых признаков с помощью стратегии среднего значения.
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OrdinalEncoder

categorical_encoder = OrdinalEncoder(
    handle_unknown="use_encoded_value", unknown_value=-1, encoded_missing_value=-1
)
numerical_pipe = SimpleImputer(strategy="mean")

preprocessing = ColumnTransformer(
    [
        ("cat", categorical_encoder, categorical_columns),
        ("num", numerical_pipe, numerical_columns),
    ],
    verbose_feature_names_out=False,
)

rf = Pipeline(
    [
        ("preprocess", preprocessing),
        ("classifier", RandomForestClassifier(random_state=42)),
    ]
)
rf.fit(X_train, y_train)
Pipeline(steps=[('preprocess',
                 ColumnTransformer(transformers=[('cat',
                                                  OrdinalEncoder(encoded_missing_value=-1,
                                                                 handle_unknown='use_encoded_value',
                                                                 unknown_value=-1),
                                                  ['pclass', 'sex', 'embarked',
                                                   'random_cat']),
                                                 ('num', SimpleImputer(),
                                                  ['age', 'sibsp', 'parch',
                                                   'fare', 'random_num'])],
                                   verbose_feature_names_out=False)),
                ('classifier', RandomForestClassifier(random_state=42))])
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте этой записной книжке.
На GitHub HTML-представление не отображается; попробуйте открыть эту страницу с помощью nbviewer.org.
Параметры
steps steps: list of tuples

Список кортежей (имя шага, оценщик), которые объединяются в
последовательном порядке. Для совместимости с API scikit-learn все шаги
должны определять `fit`. Все шаги, кроме последнего, должны также определять `transform`. Подробнее см.
:ref:`Combining Estimators <combining_estimators>`.
[('preprocess', ...), ('classifier', ...)]
transform_input transform_input: list of str, default=None

Имена параметров :term:`metadata`, которые конвейер должен преобразовать
перед передачей шагу, использующему их.

Это позволяет преобразовывать некоторые аргументы входных данных для ``fit`` (кроме ``X``)
с помощью шагов конвейера до шага, которому они требуются.
Требование задается с помощью :ref:`маршрутизации метаданных <metadata_routing>`.
Например, так можно передать проверочный набор через конвейер.

Этот параметр можно задать только при включенной маршрутизации метаданных. Ее
можно включить с помощью ``sklearn.set_config(enable_metadata_routing=True)``.

.. versionadded:: 1.6
None
memory memory: str or object with the joblib.Memory interface, default=None

Используется для кэширования обученных преобразователей конвейера. Последний шаг
никогда не кэшируется, даже если он является преобразователем. По умолчанию кэширование
не выполняется. Если задана строка, она представляет собой путь к каталогу
кэширования. Включение кэширования приводит к клонированию преобразователей
перед обучением. Поэтому экземпляр преобразователя, переданный
конвейеру, нельзя проверить напрямую. Используйте атрибут ``named_steps``
или ``steps`` для проверки оценщиков в конвейере. Кэширование
преобразователей полезно, если обучение занимает много времени. См.
:ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py`
пример включения кэширования.
None
verbose verbose: bool, default=False

Если значение True, по завершении каждого шага будет выводиться
время, затраченное на его обучение.
False
Обученные атрибуты
Имя Тип Значение
classes_ classes_: ndarray of shape (n_classes,)

Метки классов. Существуют только в том случае, если последний шаг конвейера является
классификатором.
ndarray[object](2,) ['0','1']
feature_names_in_ feature_names_in_: ndarray of shape (`n_features_in_`,)

Имена признаков, обнаруженных во время :term:`fit`. Определяется, только если
базовый оценщик при обучении предоставляет такой атрибут.

.. versionadded:: 1.0
ndarray[object](9,) ['pclass','sex','embarked',...,'parch','fare','random_num']
n_features_in_ n_features_in_: int

Количество признаков, обнаруженных во время :term:`fit`. Определяется, только если
базовый первый оценщик в `steps` предоставляет такой атрибут
при обучении.

.. versionadded:: 0.24
int 9
Параметры
transformers transformers: list of tuples

Список кортежей (имя, преобразователь, столбцы), указывающих
объекты-преобразователи, применяемые к подмножествам данных.

name : str
Как и в Pipeline и FeatureUnion, это позволяет задавать преобразователь и
его параметры с помощью ``set_params`` и выполнять поиск при настройке
гиперпараметров.
transformer : {'drop', 'passthrough'} or estimator
Оценщик должен поддерживать :term:`fit` и :term:`transform`.
Также допускаются специальные строки 'drop' и 'passthrough',
указывающие соответственно, что столбцы следует отбросить или передать
без преобразования.
columns : str, array-like of str, int, array-like of int, array-like of bool, slice or callable
Индексирует данные по второй оси. Целые числа интерпретируются как
позиционные столбцы, а строки могут ссылаться на столбцы DataFrame
по имени. Если ``transformer`` ожидает на входе X одномерный массив (вектор),
следует использовать скалярную строку или целое число;
в противном случае преобразователю будет передан двумерный массив.
Вызываемому объекту передаются входные данные `X`, и он может вернуть любое из
указанных выше значений. Для выбора нескольких столбцов по имени или типу данных можно использовать
:obj:`make_column_selector`.
[('cat', ...), ('num', ...)]
verbose_feature_names_out verbose_feature_names_out: bool, str or Callable[[str, str], str], default=True

- Если значение True, :meth:`ColumnTransformer.get_feature_names_out` добавляет в начало
всех имен признаков имя преобразователя, создавшего соответствующий
признак. Это эквивалентно заданию
`verbose_feature_names_out="{transformer_name}__{feature_name}"`.
- Если значение False, :meth:`ColumnTransformer.get_feature_names_out` не добавляет
к именам признаков префикс и вызывает ошибку, если имена признаков
не уникальны.
- Если задано ``Callable[[str, str], str]``,
:meth:`ColumnTransformer.get_feature_names_out` переименовывает все признаки
с использованием имени преобразователя. Первый аргумент вызываемого объекта — имя
преобразователя, а второй — имя признака. Возвращенная
строка станет новым именем признака.
- Если задано ``str``, это должна быть строка, готовая к форматированию. Указанная строка
форматируется с использованием двух имен полей: ``transformer_name`` и ``feature_name``.
например, ``"{feature_name}__{transformer_name}"``. Дополнительную информацию см. в описании метода
стандартной библиотеки :meth:`str.format`.

.. versionadded:: 1.0

.. versionchanged:: 1.6
`verbose_feature_names_out` может быть вызываемым объектом или строкой для форматирования.
False
remainder remainder: {'drop', 'passthrough'} or estimator, default='drop'

По умолчанию преобразуются и объединяются в выходных данных только столбцы, указанные в `transformers`,
а неуказанные столбцы отбрасываются (значение по умолчанию — ``'drop'``).
Если задать ``remainder='passthrough'``, все оставшиеся столбцы, не указанные в `transformers`,
но присутствовавшие в данных, переданных в `fit`, будут автоматически переданы без изменений. Это подмножество столбцов
объединяется с результатами преобразователей. Для фреймов данных
дополнительные столбцы, отсутствовавшие при `fit`, не включаются в выходные данные
`transform`.
Если в качестве ``remainder`` задан оценщик, для оставшихся
неуказанных столбцов будет использоваться этот оценщик. Он
должен поддерживать :term:`fit` и :term:`transform`.
Обратите внимание: для использования этой функции необходимо, чтобы порядок столбцов DataFrame,
передаваемых в :term:`fit` и :term:`transform`, был одинаковым.
'drop'
sparse_threshold sparse_threshold: float, default=0.3

Если результаты разных преобразователей содержат разреженные матрицы,
они объединяются в разреженную матрицу, если общая плотность
ниже этого значения. Используйте ``sparse_threshold=0``, чтобы всегда возвращать
плотную матрицу. Если преобразованные выходные данные содержат только плотные данные,
объединенный результат будет плотным, а этот параметр будет проигнорирован.
0.3
n_jobs n_jobs: int, default=None

Количество задач для параллельного выполнения.
``None`` означает 1, кроме случаев использования контекста :obj:`joblib.parallel_backend`.
``-1`` означает использование всех процессоров. Подробнее см. :term:`Глоссарий <n_jobs>`.
None
transformer_weights transformer_weights: dict, default=None

Множители весов признаков для каждого преобразователя. Результат
преобразователя умножается на эти веса. Ключи — имена преобразователей,
значения — веса.
None
verbose verbose: bool, default=False

Если значение True, по завершении каждого преобразователя будет выводиться
время, затраченное на его обучение.
False
Обученные атрибуты
Имя Тип Значение
feature_names_in_ feature_names_in_: ndarray of shape (`n_features_in_`,)

Имена признаков, обнаруженных во время :term:`fit`. Определяется только тогда, когда `X`
содержит имена признаков, состоящие исключительно из строк.

.. versionadded:: 1.0
ndarray[object](9,) ['pclass','sex','embarked',...,'parch','fare','random_num']
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 9
named_transformers_ named_transformers_: :class:`~sklearn.utils.Bunch`

Атрибут только для чтения, позволяющий получить доступ к любому преобразователю по заданному имени.
Ключи — имена преобразователей, значения — обученные объекты-преобразователи.
Bunch {'cat': Ordin...mpleImputer()}
output_indices_ output_indices_: dict

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

.. versionadded:: 1.0
dict {'cat': slice(0, 4, None), 'num': slice(4, 9, None), 're...er': slice(0, 0, None)}
sparse_output_ sparse_output_: bool

Логический флаг, указывающий, является ли результат ``transform``
разреженной матрицей или плотным массивом numpy; это зависит от результатов
отдельных преобразователей и параметра `sparse_threshold`.
bool False
transformers_ transformers_: list

Коллекция обученных преобразователей в виде кортежей (имя,
обученный_преобразователь, столбец). `fitted_transformer` может быть оценщиком
или `'drop'`; значение `'passthrough'` заменяется эквивалентным
:class:`~sklearn.preprocessing.FunctionTransformer`. Если столбцы не были выбраны,
здесь будет необученный преобразователь. Если
остались столбцы, последним элементом будет кортеж вида:
('remainder', transformer, remaining_columns), соответствующий параметру
``remainder``. Если остались столбцы, то
``len(transformers_)==len(transformers)+1``, в противном случае
``len(transformers_)==len(transformers)``.

.. versionadded:: 1.7
Формат оставшихся столбцов теперь старается соответствовать формату других
преобразователей: если все столбцы были указаны как имена столбцов (`str`),
оставшиеся столбцы хранятся как имена столбцов; если все столбцы были указаны
как массивы масок (`bool`), оставшиеся столбцы также хранятся в этом формате; во всех остальных случаях
оставшиеся столбцы хранятся как индексы (`int`).
list [('cat', OrdinalEncode...nown_value=-1), ['pclass', 'sex', 'em...ed', 'ra...at']), ('num', SimpleImputer(), ['age', 'sibsp', 'parch', 'fare', ...])]
['pclass', 'sex', 'embarked', 'random_cat']
Параметры
handle_unknown handle_unknown: {'error', 'use_encoded_value'}, значение по умолчанию='error'

Если задано значение 'error', при наличии неизвестного
категориального признака во время преобразования будет вызвана ошибка. Если задано
'use_encoded_value', закодированное значение неизвестных категорий будет
равно значению, заданному параметром `unknown_value`. В
:meth:`inverse_transform` неизвестная категория будет обозначена как None.

.. versionadded:: 0.24
'use_encoded_value'
unknown_value unknown_value: int или np.nan, значение по умолчанию=None

Если для параметра handle_unknown задано значение 'use_encoded_value', этот
параметр обязателен и задаёт закодированное значение неизвестных
категорий. Оно должно отличаться от значений, используемых для кодирования любых
категорий при вызове `fit`. Если задано np.nan, параметр `dtype` должен
иметь тип float.

.. versionadded:: 0.24
-1
encoded_missing_value encoded_missing_value: int или np.nan, значение по умолчанию=np.nan

Закодированное значение пропущенных категорий. Если задано `np.nan`, параметр `dtype`
должен иметь тип float.

.. versionadded:: 1.1
-1
categories categories: 'auto' или список массивов, значение по умолчанию='auto'

Категории (уникальные значения) для каждого признака:

- 'auto' : Автоматически определять категории по обучающим данным.
- list : ``categories[i]`` содержит категории, ожидаемые для i-го
столбца. Переданные категории не должны сочетать строки и числовые
значения; числовые значения должны быть отсортированы.

Используемые категории доступны в атрибуте ``categories_``.
'auto'
dtype dtype: числовой тип, значение по умолчанию=np.float64

Требуемый тип данных выходных значений.
<class 'numpy.float64'>
min_frequency min_frequency: int или float, значение по умолчанию=None

Задаёт минимальную частоту, ниже которой категория будет
считаться редкой.

- Если задан `int`, редкими считаются категории с меньшим количеством
значений.

- Если задан `float`, редкими считаются категории, количество значений в которых меньше
`min_frequency * n_samples`.

.. versionadded:: 1.3
Подробнее см. в :ref:`Руководстве пользователя <encoder_infrequent_categories>`.
None
max_categories max_categories: int, значение по умолчанию=None

Задаёт верхний предел количества выходных категорий для каждого входного
признака при обработке редких категорий. Если есть редкие
категории, `max_categories` включает категорию, представляющую
редкие категории, наряду с часто встречающимися. Если задано `None`,
количество выходных признаков не ограничено.

Параметр `max_categories` **не** учитывает пропущенные или неизвестные
категории. Если задать для `unknown_value` или `encoded_missing_value` целое
число, количество уникальных целочисленных кодов увеличится на единицу для каждого из них.
В результате может быть до `max_categories + 2` целочисленных кодов.

.. versionadded:: 1.3
Подробнее см. в :ref:`Руководстве пользователя <encoder_infrequent_categories>`.
None
Обученные атрибуты
Имя Тип Значение
categories_ categories_: список массивов

Категории каждого признака, определённые во время ``fit`` (в порядке
признаков в X и соответствующие выходным данным ``transform``).
Не включает категории, которые не встречались во время ``fit``.
list [array([1, 2, 3]), array(['femal... dtype=object), array(['C', '... dtype=object), array([0, 1, 2])]
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

Имена признаков, обнаруженных во время :term:`fit`. Определяется только если `X`
содержит имена признаков, представленные строками.

.. versionadded:: 1.0
ndarray[object](4,) ['pclass','sex','embarked','random_cat']
n_features_in_ n_features_in_: int

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

.. versionadded:: 1.0
int 4
4 признака
pclass
sex
embarked
random_cat
['age', 'sibsp', 'parch', 'fare', 'random_num']
Параметры
missing_values missing_values: int, float, str, np.nan, None или pandas.NA, значение по умолчанию=np.nan

Заполнитель для пропущенных значений. Все вхождения
`missing_values` будут заменены. Для фреймов данных pandas
с допускающими пропуски целочисленными типами `missing_values`
можно задать как `np.nan` или `pd.NA`.
nan
strategy strategy: str или Callable, значение по умолчанию='mean'

Стратегия заполнения пропусков.

- Если задано "mean", пропущенные значения заменяются средним значением
в каждом столбце. Применимо только к числовым данным.
- Если задано "median", пропущенные значения заменяются медианой
в каждом столбце. Применимо только к числовым данным.
- Если задано "most_frequent", пропущенные значения заменяются наиболее часто встречающимся
значением в каждом столбце. Применимо к строковым и числовым данным.
Если таких значений несколько, возвращается наименьшее.
- Если задано "constant", пропущенные значения заменяются значением fill_value. Применимо
к строковым и числовым данным.
- Если задан экземпляр Callable, пропущенные значения заменяются
скалярной статистикой, возвращаемой при применении вызываемого объекта к плотному одномерному
массиву, содержащему непропущенные значения каждого столбца.

.. versionadded:: 0.20
strategy="constant" для заполнения фиксированным значением.

.. versionadded:: 1.5
strategy=callable для заполнения пользовательским значением.
'mean'
fill_value fill_value: str или числовое значение, значение по умолчанию=None

Если strategy == "constant", `fill_value` используется для замены всех
вхождений missing_values. Для строковых или объектных типов данных
`fill_value` должен быть строкой.
Если задано `None`, значение `fill_value` будет равно 0 при заполнении числовых
данных и "missing_value" для строковых или объектных типов данных.
None
copy copy: bool, значение по умолчанию=True

Если задано True, будет создана копия X. Если задано False, по возможности
заполнение будет выполнено на месте. Обратите внимание, что в следующих случаях
новая копия всегда будет создана, даже если задано `copy=False`:

- Если `X` не является массивом чисел с плавающей точкой;
- Если `X` закодирован как матрица CSR;
- Если `add_indicator=True`.
True
add_indicator add_indicator: bool, значение по умолчанию=False

Если задано True, преобразование :class:`MissingIndicator` добавляется к выходным данным
преобразования заполнителя. Это позволяет прогнозной модели
учитывать наличие пропусков, несмотря на их заполнение. Если во время обучения
признак не содержит пропущенных значений, он не появится в индикаторе пропусков,
даже если во время преобразования есть пропущенные значения.
False
keep_empty_features keep_empty_features: bool, значение по умолчанию=False

Если задано True, признаки, состоящие исключительно из пропущенных значений на момент вызова
`fit`, сохраняются в результатах вызова `transform`.
Заполняемое значение всегда равно `0`, кроме случая `strategy="constant"`,
когда вместо него используется `fill_value`.

.. versionadded:: 1.2
False
Обученные атрибуты
Имя Тип Значение
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

Имена признаков, обнаруженных во время :term:`fit`. Определяется только если `X`
содержит имена признаков, представленные строками.

.. versionadded:: 1.0
ndarray[object](5,) ['age','sibsp','parch','fare','random_num']
indicator_ indicator_: :class:`~sklearn.impute.MissingIndicator`

Индикатор, используемый для добавления бинарных индикаторов пропущенных значений.
`None`, если `add_indicator=False`.
NoneType None
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 5
statistics_ statistics_: массив формы (n_features,)

Заполняющее значение для каждого признака.
Вычисление статистик может привести к значениям `np.nan`.
Во время :meth:`transform` признаки, соответствующие статистикам `np.nan`,
будут отброшены.
ndarray[float64](5,) [29.96, 0.48, 0.39,32.54, 0.07]
5 признаков
age
sibsp
parch
fare
random_num
9 признаков
pclass
sex
embarked
random_cat
age
sibsp
parch
fare
random_num
Параметры
random_state random_state: int, экземпляр RandomState или None, по умолчанию=None

Управляет как случайностью при бутстрэп-выборке образцов,
используемых при построении деревьев (если ``bootstrap=True``), так и выборкой
признаков, рассматриваемых при поиске наилучшего разбиения в каждом узле
(если ``max_features < n_features``).
Подробности см. в :term:`Глоссарии <random_state>`.
42
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

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

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

.. versionchanged:: 0.18
Добавлена возможность задавать доли значениями типа float.
2
min_samples_leaf min_samples_leaf: int или float, по умолчанию=1

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

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

.. versionchanged:: 0.18
Добавлена возможность задавать доли значениями типа float.
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"

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

- Если это int, при каждом разбиении рассматриваются `max_features` признаков.
- Если это float, `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"}, dict или список dict, по умолчанию=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: неотрицательное значение float, по умолчанию=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`.
- Если это int, выбирается `max_samples` образцов.
- Если это float, выбирается `max_samples * X.shape[0]` невзвешенных образцов
или `max_samples * sample_weight.sum()` взвешенных образцов.

.. versionadded:: 0.22

.. versionchanged:: 1.9
Для взвешенных образцов значение float `max_samples` рассчитывается относительно `sample_weight.sum()`, а не
`X.shape[0]`.
None
monotonic_cst monotonic_cst: массивоподобный объект из int формы (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[object](2,) ['0','1']
estimator_ estimator_: :class:`~sklearn.tree.DecisionTreeClassifier`

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

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

Набор обученных подоценивателей.
list [DecisionTreeC...te=1608637542), DecisionTreeC...te=1273642419), DecisionTreeC...te=1935803228), DecisionTreeC...ate=787846414), ...]
estimators_samples_ estimators_samples_: список массивов

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

.. versionadded:: 1.4
list [array([475, ..., dtype=int32), array([686, 6..., dtype=int32), array([342, 4..., dtype=int32), array([800, 5..., dtype=int32), ...]
feature_importances_ feature_importances_: ndarray формы (n_features,)

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

Предупреждение: важности признаков, основанные на нечистоте, могут вводить в заблуждение для
признаков с высокой кардинальностью (большим количеством уникальных значений). В качестве альтернативы см.
:func:`sklearn.inspection.permutation_importance`.
ndarray[float64](9,) [0.07,0.23,0.03,...,0.03,0.19,0.19]
n_classes_ n_classes_: int или список

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

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

.. versionadded:: 0.24
int 9
n_outputs_ n_outputs_: int

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


Точность модели

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

print(f"RF train accuracy: {rf.score(X_train, y_train):.3f}")
print(f"RF test accuracy: {rf.score(X_test, y_test):.3f}")
RF train accuracy: 1.000
RF test accuracy: 0.814

Здесь видно, что точность на обучающей выборке очень высока (модель случайного леса обладает достаточной ёмкостью, чтобы полностью запомнить обучающую выборку), но при этом она достаточно хорошо обобщает данные тестовой выборки благодаря встроенному бэггингу случайных лесов.

Можно пожертвовать некоторой точностью на обучающей выборке ради немного более высокой точности на тестовой выборке, ограничив ёмкость деревьев (например, задав min_samples_leaf=5 или min_samples_leaf=10), чтобы уменьшить переобучение, не вызывая при этом чрезмерного недообучения.

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

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

Важность признаков на основе неоднородности присваивает числовым признакам самые высокие ранги. В результате непредиктивная переменная random_num оказывается среди самых важных признаков!

Эта проблема связана с двумя ограничениями важности признаков на основе неоднородности:

  • важность на основе неоднородности смещена в сторону признаков с высокой кардинальностью;
  • важность на основе неоднородности вычисляется по статистике обучающей выборки и поэтому не отражает способность признака быть полезным для прогнозирования с обобщением на тестовую выборку (если модель обладает достаточной ёмкостью).

Смещение в сторону признаков с высокой кардинальностью объясняет, почему random_num имеет гораздо большую важность по сравнению с random_cat, хотя мы ожидаем, что важность обоих случайных признаков будет равна нулю.

Использование статистики обучающей выборки объясняет, почему важность признаков random_num и random_cat отлична от нуля.

import pandas as pd

feature_names = rf[:-1].get_feature_names_out()

mdi_importances = pd.Series(
    rf[-1].feature_importances_, index=feature_names
).sort_values(ascending=True)
ax = mdi_importances.plot.barh()
ax.set_title("Random Forest Feature Importances (MDI)")
ax.figure.tight_layout()
Random Forest Feature Importances (MDI)

В качестве альтернативы важность перестановок для rf вычисляется на отложенной тестовой выборке. Это показывает, что категориальный признак с низкой кардинальностью sex и pclass являются наиболее важными признаками. Действительно, перестановка значений этих признаков приводит к наибольшему снижению точности модели на тестовой выборке.

Также обратите внимание, что, как и ожидалось, важность обоих случайных признаков очень мала (близка к 0).

from sklearn.inspection import permutation_importance

result = permutation_importance(
    rf, X_test, y_test, n_repeats=10, random_state=42, n_jobs=2
)

sorted_importances_idx = result.importances_mean.argsort()
importances = pd.DataFrame(
    result.importances[sorted_importances_idx].T,
    columns=X.columns[sorted_importances_idx],
)
ax = importances.plot.box(vert=False, whis=10)
ax.set_title("Permutation Importances (test set)")
ax.axvline(x=0, color="k", linestyle="--")
ax.set_xlabel("Decrease in accuracy score")
ax.figure.tight_layout()
Permutation Importances (test set)

Также можно вычислить важность перестановок на обучающей выборке. Это показывает, что random_num и random_cat получают значительно более высокий ранг важности, чем при вычислении на тестовой выборке. Различие между этими двумя графиками подтверждает, что модель RF обладает достаточной ёмкостью, чтобы использовать эти случайные числовой и категориальный признаки для переобучения.

result = permutation_importance(
    rf, X_train, y_train, n_repeats=10, random_state=42, n_jobs=2
)

sorted_importances_idx = result.importances_mean.argsort()
importances = pd.DataFrame(
    result.importances[sorted_importances_idx].T,
    columns=X.columns[sorted_importances_idx],
)
ax = importances.plot.box(vert=False, whis=10)
ax.set_title("Permutation Importances (train set)")
ax.axvline(x=0, color="k", linestyle="--")
ax.set_xlabel("Decrease in accuracy score")
ax.figure.tight_layout()
Permutation Importances (train set)

Можно повторить эксперимент, ограничив способность деревьев к переобучению и задав min_samples_leaf равным 20 точкам данных.

rf.set_params(classifier__min_samples_leaf=20).fit(X_train, y_train)
Pipeline(steps=[('preprocess',
                 ColumnTransformer(transformers=[('cat',
                                                  OrdinalEncoder(encoded_missing_value=-1,
                                                                 handle_unknown='use_encoded_value',
                                                                 unknown_value=-1),
                                                  ['pclass', 'sex', 'embarked',
                                                   'random_cat']),
                                                 ('num', SimpleImputer(),
                                                  ['age', 'sibsp', 'parch',
                                                   'fare', 'random_num'])],
                                   verbose_feature_names_out=False)),
                ('classifier',
                 RandomForestClassifier(min_samples_leaf=20, random_state=42))])
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте ему выполнение.
На GitHub HTML-представление не отображается; попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
steps steps: список кортежей

Список кортежей (название шага, оцениватель), которые последовательно
объединяются в цепочку. Для совместимости с API scikit-learn все шаги
должны определять `fit`. Все шаги, кроме последнего, также должны
определять `transform`. Подробнее см. в разделе
:ref:`Combining Estimators <combining_estimators>`.
[('preprocess', ...), ('classifier', ...)]
transform_input transform_input: список строк, по умолчанию None

Названия параметров :term:`metadata`, которые конвейер должен преобразовать,
прежде чем передать их шагу, использующему эти параметры.

Это позволяет преобразовывать некоторые входные аргументы ``fit`` (кроме ``X``)
с помощью шагов конвейера вплоть до шага, которому они необходимы.
Требования задаются через :ref:`маршрутизацию метаданных <metadata_routing>`.
Например, это можно использовать для передачи проверочной выборки через конвейер.

Этот параметр можно задавать, только если включена маршрутизация метаданных.
Её можно включить с помощью ``sklearn.set_config(enable_metadata_routing=True)``.

.. versionadded:: 1.6
None
memory memory: строка или объект с интерфейсом joblib.Memory, по умолчанию None

Используется для кэширования обученных преобразователей конвейера. Последний шаг
никогда не кэшируется, даже если он является преобразователем. По умолчанию
кэширование не выполняется. Если задана строка, она указывает путь к
каталогу кэширования. При включении кэширования перед обучением создаются
копии преобразователей. Поэтому экземпляр преобразователя, переданный
конвейеру, нельзя проверить напрямую. Для проверки оценивателей в конвейере
используйте атрибут ``named_steps`` или ``steps``. Кэширование преобразователей
полезно, если обучение занимает много времени. См. пример
:ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py`,
в котором показано, как включить кэширование.
None
verbose verbose: bool, по умолчанию False

Если True, по завершении обучения каждого шага будет выводиться
затраченное на него время.
False
Обученные атрибуты
Название Тип Значение
classes_ classes_: ndarray формы (n_classes,)

Метки классов. Существует только в том случае, если последний шаг конвейера —
классификатор.
ndarray[object](2,) ['0','1']
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

Названия признаков, обнаруженные во время :term:`fit`. Определяется, только если
базовый оцениватель предоставляет такой атрибут после обучения.

.. versionadded:: 1.0
ndarray[object](9,) ['pclass','sex','embarked',...,'parch','fare','random_num']
n_features_in_ n_features_in_: int

Количество признаков, обнаруженных во время :term:`fit`. Определяется, только если
первый базовый оцениватель в `steps` предоставляет такой атрибут
после обучения.

.. versionadded:: 0.24
int 9
Параметры
transformers transformers: список кортежей

Список кортежей (название, преобразователь, столбцы), задающих
объекты-преобразователи, применяемые к подмножествам данных.

name : str
Как и в Pipeline и FeatureUnion, это позволяет задавать преобразователь и
его параметры с помощью ``set_params`` и искать их при поиске по сетке.
transformer : {'drop', 'passthrough'} или оцениватель
Оцениватель должен поддерживать :term:`fit` и :term:`transform`.
Также допускаются специальные строки 'drop' и 'passthrough',
обозначающие соответственно удаление столбцов и передачу их без
преобразования.
columns : str, массивоподобный объект из str, int, массивоподобный объект из int, массивоподобный объект из bool, срез или вызываемый объект
Выбирает данные по второй оси. Целые числа интерпретируются как
позиционные номера столбцов, а строки могут указывать на столбцы
DataFrame по имени. Если ``transformer`` ожидает на входе X одномерный
массивоподобный объект (вектор), следует использовать скалярную строку или int;
в противном случае преобразователю будет передан двумерный массив.
Вызываемому объекту передаются входные данные `X`, и он может возвращать
любой из перечисленных выше вариантов. Для выбора нескольких столбцов по имени
или типу данных можно использовать :obj:`make_column_selector`.
[('cat', ...), ('num', ...)]
verbose_feature_names_out verbose_feature_names_out: bool, str или Callable[[str, str], str], по умолчанию True

- Если True, :meth:`ColumnTransformer.get_feature_names_out` добавляет к
каждому названию признака префикс с именем преобразователя, создавшего этот
признак. Это эквивалентно настройке
`verbose_feature_names_out="{transformer_name}__{feature_name}"`.
- Если False, :meth:`ColumnTransformer.get_feature_names_out` не будет
добавлять префиксы к названиям признаков и выдаст ошибку, если названия
признаков не уникальны.
- Если задан ``Callable[[str, str], str]``,
:meth:`ColumnTransformer.get_feature_names_out` переименует все признаки
с помощью имени преобразователя. Первый аргумент вызываемого объекта — имя
преобразователя, а второй — название признака. Возвращённая
строка станет новым названием признака.
- Если задан ``str``, это должна быть строка, готовая к форматированию. Указанная строка
будет отформатирована с использованием двух имён полей: ``transformer_name`` и ``feature_name``.
например, ``"{feature_name}__{transformer_name}"``. Подробнее см. описание метода
стандартной библиотеки :meth:`str.format`.

.. versionadded:: 1.0

.. versionchanged:: 1.6
`verbose_feature_names_out` может быть вызываемым объектом или форматируемой строкой.
False
remainder remainder: {'drop', 'passthrough'} или оцениватель, по умолчанию 'drop'

По умолчанию преобразуются и объединяются в выходных данных только столбцы,
указанные в `transformers`, а остальные столбцы удаляются (значение по умолчанию — ``'drop'``).
Если задать ``remainder='passthrough'``, все остальные столбцы, не указанные в `transformers`,
но присутствующие в данных, переданных в `fit`, будут автоматически переданы без изменений.
Это подмножество столбцов объединяется с выходными данными преобразователей. Для фреймов данных
дополнительные столбцы, не встречавшиеся во время `fit`, не будут включены в результат
`transform`.
Если задать для ``remainder`` оцениватель, к оставшимся
неуказанным столбцам будет применяться оцениватель ``remainder``. Оцениватель
должен поддерживать :term:`fit` и :term:`transform`.
Обратите внимание: для использования этой возможности порядок столбцов DataFrame,
передаваемого в :term:`fit` и :term:`transform`, должен совпадать.
'drop'
sparse_threshold sparse_threshold: float, по умолчанию 0.3

Если выходные данные разных преобразователей содержат разреженные матрицы,
они объединяются в разреженную матрицу, когда общая плотность
ниже этого значения. Используйте ``sparse_threshold=0``, чтобы всегда возвращать
плотную матрицу. Если преобразованные выходные данные состоят только из плотных данных,
результат объединения будет плотным, а этот параметр будет проигнорирован.
0.3
n_jobs n_jobs: int, по умолчанию None

Количество параллельно выполняемых задач.
``None`` означает 1, если только не используется контекст :obj:`joblib.parallel_backend`.
``-1`` означает использовать все процессоры. Подробнее см. в :term:`глоссарии <n_jobs>`.
None
transformer_weights transformer_weights: dict, по умолчанию None

Множители для признаков, задаваемые для каждого преобразователя. Выходные данные
преобразователя умножаются на эти веса. Ключи — названия преобразователей,
значения — веса.
None
verbose verbose: bool, по умолчанию False

Если True, по завершении обучения каждого преобразователя будет
выводиться затраченное на него время.
False
Обученные атрибуты
Название Тип Значение
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

Названия признаков, обнаруженные во время :term:`fit`. Определяется только тогда, когда `X`
содержит названия признаков, каждое из которых является строкой.

.. versionadded:: 1.0
ndarray[object](9,) ['pclass','sex','embarked',...,'parch','fare','random_num']
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 9
named_transformers_ named_transformers_: :class:`~sklearn.utils.Bunch`

Атрибут только для чтения, предоставляющий доступ к любому преобразователю по его имени.
Ключи — названия преобразователей, а значения — обученные объекты-преобразователи.
Bunch {'cat': Ordin...mpleImputer()}
output_indices_ output_indices_: dict

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

.. versionadded:: 1.0
dict {'cat': slice(0, 4, None), 'num': slice(4, 9, None), 're...er': slice(0, 0, None)}
sparse_output_ sparse_output_: bool

Логический флаг, указывающий, являются ли выходные данные ``transform``
разреженной матрицей или плотным массивом numpy. Это зависит от выходных данных
отдельных преобразователей и параметра `sparse_threshold`.
bool False
transformers_ transformers_: list

Коллекция обученных преобразователей в виде кортежей (название,
обученный_преобразователь, столбец). `fitted_transformer` может быть оценивателем
или `'drop'`; значение `'passthrough'` заменяется эквивалентным
:class:`~sklearn.preprocessing.FunctionTransformer`. Если столбцы не были выбраны,
здесь будет находиться необученный преобразователь. Если остаются столбцы,
последний элемент представляет собой кортеж вида:
('remainder', transformer, remaining_columns), соответствующий параметру
``remainder``. Если остаются столбцы, то
``len(transformers_)==len(transformers)+1``, в противном случае
``len(transformers_)==len(transformers)``.

.. versionadded:: 1.7
Теперь формат оставшихся столбцов по возможности совпадает с форматом остальных
преобразователей: если все столбцы были заданы как названия столбцов (`str`),
оставшиеся столбцы сохраняются как названия; если все столбцы были заданы
как массивы-маски (`bool`), оставшиеся столбцы также задаются как массивы-маски;
во всех остальных случаях оставшиеся столбцы сохраняются как индексы (`int`).
list [('cat', OrdinalEncode...nown_value=-1), ['pclass', 'sex', 'em...ed', 'ra...at']), ('num', SimpleImputer(), ['age', 'sibsp', 'parch', 'fare', ...])]
['pclass', 'sex', 'embarked', 'random_cat']
Параметры
handle_unknown handle_unknown: {'error', 'use_encoded_value'}, по умолчанию='error'

Если задано значение 'error', при наличии неизвестного категориального
признака во время преобразования будет вызвана ошибка. Если задано значение
'use_encoded_value', неизвестным категориям будет присвоено закодированное
значение, заданное параметром `unknown_value`. В
:meth:`inverse_transform` неизвестная категория будет обозначена как None.

.. versionadded:: 0.24
'use_encoded_value'
unknown_value unknown_value: int или np.nan, по умолчанию=None

Если для параметра handle_unknown задано значение 'use_encoded_value', этот
параметр обязателен и определяет закодированное значение неизвестных
категорий. Оно должно отличаться от значений, использованных для кодирования
категорий при вызове `fit`. Если задано np.nan, параметр `dtype` должен
иметь тип float.

.. versionadded:: 0.24
-1
encoded_missing_value encoded_missing_value: int или np.nan, по умолчанию=np.nan

Закодированное значение пропущенных категорий. Если задано `np.nan`, параметр `dtype`
должен иметь тип float.

.. versionadded:: 1.1
-1
categories categories: 'auto' или список массивов, по умолчанию='auto'

Категории (уникальные значения) для каждого признака:

- 'auto' : автоматически определять категории по обучающим данным.
- list : ``categories[i]`` содержит категории, ожидаемые для i-го
столбца. Переданные категории не должны содержать одновременно строки и числовые
значения; числовые значения должны быть отсортированы.

Используемые категории доступны в атрибуте ``categories_``.
'auto'
dtype dtype: числовой тип, по умолчанию=np.float64

Требуемый тип данных выходных значений.
<class 'numpy.float64'>
min_frequency min_frequency: int или float, по умолчанию=None

Задает минимальную частоту, ниже которой категория считается
редкой.

- Если задано `int`, редкими считаются категории с меньшей
кардинальностью.

- Если задано `float`, редкими считаются категории с кардинальностью меньше
`min_frequency * n_samples`.

.. versionadded:: 1.3
Подробнее см. :ref:`Руководство пользователя <encoder_infrequent_categories>`.
None
max_categories max_categories: int, по умолчанию=None

Задает верхний предел количества выходных категорий для каждого входного
признака при обработке редких категорий. Если есть редкие
категории, `max_categories` включает категорию, представляющую
редкие категории, наряду с часто встречающимися категориями. Если задано `None`,
количество выходных признаков не ограничено.

`max_categories` **не** учитывает пропущенные или неизвестные
категории. Если задать для `unknown_value` или `encoded_missing_value` целое число,
количество уникальных целочисленных кодов увеличится на единицу для каждого из них.
В результате может быть до `max_categories + 2` целочисленных кодов.

.. versionadded:: 1.3
Подробнее см. :ref:`Руководство пользователя <encoder_infrequent_categories>`.
None
Обученные атрибуты
Имя Тип Значение
categories_ categories_: список массивов

Категории каждого признака, определенные во время ``fit`` (в порядке
признаков в X и соответствующие результату ``transform``).
Сюда не входят категории, которые не встречались во время ``fit``.
list [array([1, 2, 3]), array(['femal... dtype=object), array(['C', '... dtype=object), array([0, 1, 2])]
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

Имена признаков, встречавшихся во время :term:`fit`. Определяется только если `X`
имеет имена признаков, представленные строками.

.. versionadded:: 1.0
ndarray[object](4,) ['pclass','sex','embarked','random_cat']
n_features_in_ n_features_in_: int

Количество признаков, встречавшихся во время :term:`fit`.

.. versionadded:: 1.0
int 4
4 признака
pclass
sex
embarked
random_cat
['age', 'sibsp', 'parch', 'fare', 'random_num']
Параметры
missing_values missing_values: int, float, str, np.nan, None или pandas.NA, по умолчанию=np.nan

Значение-заполнитель для пропущенных данных. Все вхождения
`missing_values` будут заменены. Для фреймов данных pandas с
целочисленными типами, допускающими пропуски, параметру `missing_values`
можно присвоить `np.nan` или `pd.NA`.
nan
strategy strategy: str или Callable, по умолчанию='mean'

Стратегия заполнения пропусков.

- Если задано "mean", пропущенные значения заменяются средним значением
в каждом столбце. Применимо только к числовым данным.
- Если задано "median", пропущенные значения заменяются медианой
в каждом столбце. Применимо только к числовым данным.
- Если задано "most_frequent", пропуски заменяются наиболее часто встречающимся
значением в каждом столбце. Можно использовать со строковыми и числовыми данными.
Если таких значений несколько, возвращается наименьшее.
- Если задано "constant", пропущенные значения заменяются значением fill_value. Можно
использовать со строковыми и числовыми данными.
- Если задан экземпляр Callable, пропущенные значения заменяются скалярной
статистикой, возвращаемой функцией, примененной к плотному одномерному
массиву непропущенных значений каждого столбца.

.. versionadded:: 0.20
strategy="constant" для заполнения фиксированным значением.

.. versionadded:: 1.5
strategy=callable для заполнения пользовательским значением.
'mean'
fill_value fill_value: str или числовое значение, по умолчанию=None

Если strategy == "constant", значение `fill_value` используется для замены всех
вхождений missing_values. Для строковых типов данных или типа object
значение `fill_value` должно быть строкой.
Если задано `None`, при заполнении числовых данных
значение `fill_value` будет равно 0, а для строковых данных или типа object — "missing_value".
None
copy copy: bool, по умолчанию=True

Если True, будет создана копия X. Если False, по возможности заполнение
выполняется на месте. Обратите внимание: в следующих случаях всегда
создается новая копия, даже если задано `copy=False`:

- Если `X` не является массивом значений с плавающей точкой;
- Если `X` закодирован как матрица CSR;
- Если `add_indicator=True`.
True
add_indicator add_indicator: bool, по умолчанию=False

Если True, преобразование :class:`MissingIndicator` добавляется к результату
преобразования imputer. Это позволяет прогнозирующей оценке
учитывать наличие пропусков, несмотря на заполнение. Если во время fit/train у признака
не было пропущенных значений, он не появится в индикаторе пропусков, даже если во время
transform/test пропущенные значения есть.
False
keep_empty_features keep_empty_features: bool, по умолчанию=False

Если True, признаки, состоящие исключительно из пропущенных значений на момент вызова
`fit`, включаются в результат вызова `transform`.
Заполняемое значение всегда равно `0`, за исключением случая `strategy="constant"`,
когда вместо него используется `fill_value`.

.. versionadded:: 1.2
False
Обученные атрибуты
Имя Тип Значение
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

Имена признаков, встречавшихся во время :term:`fit`. Определяется только если `X`
имеет имена признаков, представленные строками.

.. versionadded:: 1.0
ndarray[object](5,) ['age','sibsp','parch','fare','random_num']
indicator_ indicator_: :class:`~sklearn.impute.MissingIndicator`

Индикатор, используемый для добавления двоичных признаков пропущенных значений.
`None`, если `add_indicator=False`.
NoneType None
n_features_in_ n_features_in_: int

Количество признаков, встречавшихся во время :term:`fit`.

.. versionadded:: 0.24
int 5
statistics_ statistics_: массив формы (n_features,)

Значение для заполнения пропусков в каждом признаке.
Вычисление статистик может приводить к значениям `np.nan`.
Во время :meth:`transform` признаки, соответствующие статистикам `np.nan`,
будут отброшены.
ndarray[float64](5,) [29.96, 0.48, 0.39,32.54, 0.07]
5 признаков
age
sibsp
parch
fare
random_num
9 признаков
pclass
sex
embarked
random_cat
age
sibsp
parch
fare
random_num
Параметры
min_samples_leaf min_samples_leaf: int or float, default=1

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

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

.. versionchanged:: 0.18
Добавлена поддержка значений с плавающей точкой для долей.
20
random_state random_state: int, RandomState instance or None, default=None

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

Количество деревьев в лесу.

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

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

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

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

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

.. versionchanged:: 0.18
Добавлена поддержка значений с плавающей точкой для долей.
2
min_weight_fraction_leaf min_weight_fraction_leaf: float, default=0.0

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

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

- Если значение имеет тип int, при каждом разделении рассматривается `max_features` признаков.
- Если значение имеет тип float, `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, default=None

Выращивать деревья с ``max_leaf_nodes`` в порядке убывания приоритета.
Наилучшие узлы определяются по относительному уменьшению нечистоты.
Если указано None, количество листовых узлов не ограничено.
None
min_impurity_decrease min_impurity_decrease: float, default=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`` — количество образцов в правом дочернем узле.

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

.. versionadded:: 0.19
0.0
bootstrap bootstrap: bool, default=True

Используются ли при построении деревьев бутстреп-выборки. Если False, для построения каждого дерева используется
весь набор данных.
True
oob_score oob_score: bool or callable, default=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, default=None

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

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

Если задано ``True``, используется решение предыдущего вызова fit
и в ансамбль добавляются новые оцениватели; в противном случае обучается совершенно
новый лес. Подробнее см. в :term:`Глоссарии <warm_start>` и
:ref:`tree_ensemble_warm_start`.
False
class_weight class_weight: {"balanced", "balanced_subsample"}, dict or list of dicts, default=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: non-negative float, default=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 or float, default=None

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

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

.. versionadded:: 0.22

.. versionchanged:: 1.9
Для взвешенных образцов значение `max_samples` типа float рассчитывается относительно `sample_weight.sum()`, а не
`X.shape[0]`.
None
monotonic_cst monotonic_cst: array-like of int of shape (n_features), default=None

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

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

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

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

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

.. versionadded:: 1.4
None
Атрибуты после обучения
Имя Тип Значение
classes_ classes_: ndarray of shape (n_classes,) or a list of such arrays

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

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

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

Набор обученных подоценивателей.
list [DecisionTreeC...te=1608637542), DecisionTreeC...te=1273642419), DecisionTreeC...te=1935803228), DecisionTreeC...ate=787846414), ...]
estimators_samples_ estimators_samples_: list of arrays

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

.. versionadded:: 1.4
list [array([475, ..., dtype=int32), array([686, 6..., dtype=int32), array([342, 4..., dtype=int32), array([800, 5..., dtype=int32), ...]
feature_importances_ feature_importances_: ndarray of shape (n_features,)

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

Предупреждение: важность признаков на основе нечистоты может вводить в заблуждение для
признаков с большим числом уникальных значений. В качестве альтернативы см.
:func:`sklearn.inspection.permutation_importance`.
ndarray[float64](9,) [0.13,0.5 ,0.03,...,0.03,0.14,0.06]
n_classes_ n_classes_: int or list

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

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

.. versionadded:: 0.24
int 9
n_outputs_ n_outputs_: int

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


Если посмотреть на точность на обучающей и тестовой выборках, видно, что теперь эти две метрики очень похожи. Следовательно, наша модель больше не переобучается. Теперь можно проверить важность перестановок для этой новой модели.

print(f"RF train accuracy: {rf.score(X_train, y_train):.3f}")
print(f"RF test accuracy: {rf.score(X_test, y_test):.3f}")
RF train accuracy: 0.810
RF test accuracy: 0.832
train_result = permutation_importance(
    rf, X_train, y_train, n_repeats=10, random_state=42, n_jobs=2
)
test_results = permutation_importance(
    rf, X_test, y_test, n_repeats=10, random_state=42, n_jobs=2
)
sorted_importances_idx = train_result.importances_mean.argsort()
train_importances = pd.DataFrame(
    train_result.importances[sorted_importances_idx].T,
    columns=X.columns[sorted_importances_idx],
)
test_importances = pd.DataFrame(
    test_results.importances[sorted_importances_idx].T,
    columns=X.columns[sorted_importances_idx],
)
for name, importances in zip(["train", "test"], [train_importances, test_importances]):
    ax = importances.plot.box(vert=False, whis=10)
    ax.set_title(f"Permutation Importances ({name} set)")
    ax.set_xlabel("Decrease in accuracy score")
    ax.axvline(x=0, color="k", linestyle="--")
    ax.figure.tight_layout()
  • Permutation Importances (train set)
  • Permutation Importances (test set)

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

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_permutation_importance.ipynb

Download Python source code: plot_permutation_importance.py

Download zipped: plot_permutation_importance.zip

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

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

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

Основные нововведения 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/inspection/plot_permutation_importance.html

Spec-Zone.ru

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