Spec-Zone.ru › scikit-learn

Примечание

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

Сравнение Target Encoder с другими кодировщиками

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

Примечание

fit(X, y).transform(X) не совпадает с fit_transform(X, y), поскольку при кодировании в fit_transform используется схема перекрёстного подбора. Подробнее см. в руководстве пользователя.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Загрузка данных из OpenML

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

from sklearn.datasets import fetch_openml

wine_reviews = fetch_openml(data_id=42074, as_frame=True)

df = wine_reviews.frame
df.head()
country description designation points price province region_1 region_2 variety winery
0 US Это потрясающее вино, на 100% изготовленное из одного сорта винограда, родом из ... Martha's Vineyard 96 235.0 California Napa Valley Napa Cabernet Sauvignon Heitz
1 Spain Спелые ароматы инжира, ежевики и чёрной смородины ... Carodorum Selección Especial Reserva 96 110.0 Northern Spain Toro NaN Tinta de Toro Bodega Carmen Rodríguez
2 US Мак Уотсон чтит память вина, которое когда-то производилось ... Special Selected Late Harvest 96 90.0 California Knights Valley Sonoma Sauvignon Blanc Macauley
3 US Это вино выдерживалось 20 месяцев в бочках из французского дуба, 30% которых были новыми, и ... Reserve 96 65.0 Oregon Willamette Valley Willamette Valley Pinot Noir Ponzi
4 France Это лучшее вино хозяйства La Bégude, названное в честь ... La Brûlade 95 66.0 Provence Bandol NaN Provence red blend Domaine de la Bégude


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

numerical_features = ["price"]
categorical_features = [
    "country",
    "province",
    "region_1",
    "region_2",
    "variety",
    "winery",
]
target_name = "points"

X = df[numerical_features + categorical_features]
y = df[target_name]

_ = y.hist()
plot target encoder

Обучение и оценка конвейеров с разными кодировщиками

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

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder, TargetEncoder

categorical_preprocessors = [
    ("drop", "drop"),
    ("ordinal", OrdinalEncoder(handle_unknown="use_encoded_value", unknown_value=-1)),
    (
        "one_hot",
        OneHotEncoder(handle_unknown="ignore", max_categories=20, sparse_output=False),
    ),
    ("target", TargetEncoder(target_type="continuous")),
]

Затем оценим модели с помощью перекрёстной проверки и запишем результаты:

from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.model_selection import cross_validate
from sklearn.pipeline import make_pipeline

n_cv_folds = 3
max_iter = 20
results = []


def evaluate_model_and_store(name, pipe):
    result = cross_validate(
        pipe,
        X,
        y,
        scoring="neg_root_mean_squared_error",
        cv=n_cv_folds,
        return_train_score=True,
    )
    rmse_test_score = -result["test_score"]
    rmse_train_score = -result["train_score"]
    results.append(
        {
            "preprocessor": name,
            "rmse_test_mean": rmse_test_score.mean(),
            "rmse_test_std": rmse_train_score.std(),
            "rmse_train_mean": rmse_train_score.mean(),
            "rmse_train_std": rmse_train_score.std(),
        }
    )


for name, categorical_preprocessor in categorical_preprocessors:
    preprocessor = ColumnTransformer(
        [
            ("numerical", "passthrough", numerical_features),
            ("categorical", categorical_preprocessor, categorical_features),
        ]
    )
    pipe = make_pipeline(
        preprocessor, HistGradientBoostingRegressor(random_state=0, max_iter=max_iter)
    )
    evaluate_model_and_store(name, pipe)

Встроенная поддержка категориальных признаков

В этом разделе мы создадим и оценим конвейер, использующий встроенную поддержку категориальных признаков в HistGradientBoostingRegressor, который поддерживает не более 255 уникальных категорий. В нашем наборе данных большинство категориальных признаков содержит более 255 уникальных категорий:

n_unique_categories = df[categorical_features].nunique().sort_values(ascending=False)
n_unique_categories
winery      14810
region_1     1236
variety       632
province      455
country        48
region_2       18
dtype: int64

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

high_cardinality_features = n_unique_categories[n_unique_categories > 255].index
low_cardinality_features = n_unique_categories[n_unique_categories <= 255].index
mixed_encoded_preprocessor = ColumnTransformer(
    [
        ("numerical", "passthrough", numerical_features),
        (
            "high_cardinality",
            TargetEncoder(target_type="continuous"),
            high_cardinality_features,
        ),
        (
            "low_cardinality",
            OrdinalEncoder(handle_unknown="use_encoded_value", unknown_value=-1),
            low_cardinality_features,
        ),
    ],
    verbose_feature_names_out=False,
)

# The output of the of the preprocessor must be set to pandas so the
# gradient boosting model can detect the low cardinality features.
mixed_encoded_preprocessor.set_output(transform="pandas")
mixed_pipe = make_pipeline(
    mixed_encoded_preprocessor,
    HistGradientBoostingRegressor(
        random_state=0, max_iter=max_iter, categorical_features=low_cardinality_features
    ),
)
mixed_pipe
Pipeline(steps=[('columntransformer',
                 ColumnTransformer(transformers=[('numerical', 'passthrough',
                                                  ['price']),
                                                 ('high_cardinality',
                                                  TargetEncoder(target_type='continuous'),
                                                  Index(['winery', 'region_1', 'variety', 'province'], dtype='str')),
                                                 ('low_cardinality',
                                                  OrdinalEncoder(handle_unknown='use_encoded_value',
                                                                 unknown_value=-1),
                                                  Index(['country', 'region_2'], dtype='str'))],
                                   verbose_feature_names_out=False)),
                ('histgradientboostingregressor',
                 HistGradientBoostingRegressor(categorical_features=Index(['country', 'region_2'], dtype='str'),
                                               max_iter=20, random_state=0))])
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте ему работу.
На GitHub HTML-представление невозможно отобразить; попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
steps steps: список кортежей

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

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

Это позволяет преобразовывать некоторые аргументы, передаваемые в ``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
Параметры
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 будет одномерным массивоподобным объектом (вектором),
следует использовать скалярную строку или целое число;
в противном случае преобразователю будет передан двумерный массив.
Вызываемому объекту передаются входные данные `X`, и он может вернуть любое из
перечисленного выше. Чтобы выбрать несколько столбцов по имени или типу данных, можно использовать
:obj:`make_column_selector`.
[('numerical', ...), ('high_cardinality', ...), ...]
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
['price']
Index(['winery', 'region_1', 'variety', 'province'], dtype='str')
Параметры
target_type target_type: {"auto", "continuous", "binary", "multiclass"}, по умолчанию="auto"

Тип целевой переменной.

- `"auto"` : Тип целевой переменной определяется с помощью
:func:`~sklearn.utils.multiclass.type_of_target`.
- `"continuous"` : Непрерывная целевая переменная
- `"binary"` : Бинарная целевая переменная
- `"multiclass"` : Многоклассовая целевая переменная

.. note::
Тип целевой переменной, определённый с помощью `"auto"`, может отличаться от желаемого типа,
используемого при построении модели. Например, если целевая переменная состоит из целых чисел
от 0 до 100, то :func:`~sklearn.utils.multiclass.type_of_target`
определит её тип как `"multiclass"`. В этом случае установка
`target_type="continuous"` укажет, что решается задача регрессии.
Атрибут `target_type_` содержит тип целевой переменной, используемый
кодировщиком.

.. versionchanged:: 1.4
Добавлена опция 'multiclass'.
'continuous'
categories categories: "auto" или список массивоподобных объектов формы (n_features,), по умолчанию="auto"

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

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

Используемые категории хранятся в обученном атрибуте `categories_`.
'auto'
smooth smooth: "auto" или float, по умолчанию="auto"

Степень смешивания среднего целевого значения, условного на значении
категории, с глобальным средним целевого значения. Чем больше значение `smooth`, тем
больший вес придаётся глобальному среднему целевого значения.
Если задано `"auto"`, для `smooth` используется эмпирическая оценка Байеса.
'auto'
cv cv: int, генератор перекрёстной проверки или итерируемый объект, по умолчанию=None

Определяет стратегию разбиения, используемую при внутреннем :term:`кросс-фиттинге`
во время :meth:`fit_transform`. Разделители, в которых индекс каждого образца не встречается
в проверочной выборке ровно один раз, вызывают `ValueError`.
Для cv возможны следующие значения:

- `None` — использовать внутреннюю перекрёстную проверку с 5 блоками, выбранную на основе
`target_type`,
- целое число — задать число блоков перекрёстной проверки, выбранной
внутри на основе `target_type`,
- :term:`разделитель CV`, не допускающий повторения образцов в проверочных блоках,
- итерируемый объект, возвращающий разбиения (train, test) в виде массивов индексов.

Для целочисленных значений и None, если `target_type` равен `"continuous"`, используется :class:`KFold`,
в противном случае используется :class:`StratifiedKFold`.

Дополнительные сведения о стратегиях перекрёстной проверки см. в :ref:`Руководстве пользователя <cross_validation>`.

.. versionchanged:: 1.9
В качестве `cv` также можно передавать генераторы перекрёстной проверки и итерируемые объекты.
5
shuffle shuffle: bool, по умолчанию=True

Следует ли перемешивать данные в :meth:`fit_transform` перед разбиением на
блоки. Обратите внимание, что образцы внутри каждого разбиения перемешиваться не будут. Параметр
применяется, только если `cv` — целое число или `None`. Если `cv` — генератор перекрёстной проверки или
итерируемый объект, параметр `shuffle` игнорируется.

.. deprecated:: 1.9
Параметр `shuffle` устарел и будет удалён в версии 1.11. Передайте генератор перекрёстной проверки
в аргументе `cv`, чтобы задать перемешивание.
'deprecated'
random_state random_state: int, экземпляр RandomState или None, по умолчанию=None

Если `shuffle` имеет значение True, `random_state` влияет на порядок
индексов, определяющий случайность каждого блока. В противном случае этот
параметр не влияет на результат.
Передайте целое число, чтобы получать воспроизводимые результаты при нескольких вызовах функции.
См. :term:`Глоссарий <random_state>`.

.. deprecated:: 1.9
Параметр `random_state` устарел и будет удалён в версии 1.11. Передайте
генератор перекрёстной проверки в аргументе `cv`, чтобы задать состояние генератора случайных чисел
для перемешивания.
'deprecated'
Index(['country', 'region_2'], dtype='str')
Параметры
handle_unknown handle_unknown: {'error', 'use_encoded_value'}, по умолчанию='error'

Если задано значение 'error', при наличии неизвестного
категориального признака во время transform будет вызвана ошибка. Если задано
'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` должен
иметь вещественный тип данных.

.. versionadded:: 0.24
-1
categories categories: 'auto' или список массивоподобных объектов, по умолчанию='auto'

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

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

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

Желаемый тип данных выходных значений.
<class 'numpy.float64'>
encoded_missing_value encoded_missing_value: int или np.nan, по умолчанию=np.nan

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

.. versionadded:: 1.1
nan
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
Параметры
max_iter max_iter: int, по умолчанию=100

Максимальное число итераций процесса бустинга, то есть
максимальное число деревьев.
20
categorical_features categorical_features: array-like из {bool, int, str} формы (n_features) или формы (n_categorical_features,), по умолчанию='from_dtype'

Указывает категориальные признаки.

- None: ни один признак не будет считаться категориальным.
- array-like булева типа: булева маска, указывающая категориальные признаки.
- array-like целочисленного типа: целочисленные индексы, указывающие категориальные
признаки.
- array-like строкового типа: имена категориальных признаков (предполагается, что обучающие
данные содержат имена признаков).
- `"from_dtype"`: столбцы датафрейма с dtype "Categorical" и "Enum"
считаются категориальными признаками. Входные данные должны быть датафреймом,
поддерживаемым narwhals (или поддерживать его): должна работать :func:`narwhals.from_native`.
Например, это относится к DataFrame из pandas и polars.

Для каждого категориального признака должно быть не более `max_bins` уникальных
категорий. Отрицательные значения категориальных признаков, закодированные числовыми
типами данных, считаются пропущенными. Все категориальные значения
преобразуются в числа с плавающей точкой. Это означает, что категориальные значения
1.0 и 1 считаются одной и той же категорией.

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

.. добавлено в версии:: 0.24

.. изменено в версии:: 1.2
Добавлена поддержка имён признаков.

.. изменено в версии:: 1.4
Добавлена опция `"from_dtype"`.

.. изменено в версии:: 1.6
Значение по умолчанию изменено с `None` на `"from_dtype"`.
Index(['count..., dtype='str')
random_state random_state: int, экземпляр RandomState или None, по умолчанию=None

Генератор псевдослучайных чисел для управления подвыборкой в процессе
разбиения на интервалы, а также разделением данных на обучающую и проверочную выборки, если включена ранняя остановка.
Передайте целое число, чтобы получать воспроизводимые результаты при нескольких вызовах функции.
См. :term:`глоссарий <random_state>`.
0
loss loss: {'squared_error', 'absolute_error', 'gamma', 'poisson', 'quantile'}, по умолчанию='squared_error'

Функция потерь, используемая в процессе бустинга. Обратите внимание, что
функции потерь "squared error", "gamma" и "poisson" фактически реализуют
"половину суммы квадратов ошибок", "половину девианса гамма-распределения" и "половину
девианса распределения Пуассона" для упрощения вычисления градиента. Кроме того,
функции потерь "gamma" и "poisson" внутри используют логарифмическую связь; "gamma"
требует ``y > 0``, а "poisson" требует ``y >= 0``.
В "quantile" используется функция потерь pinball.

.. изменено в версии:: 0.23
Добавлена опция 'poisson'.

.. изменено в версии:: 1.1
Добавлена опция 'quantile'.

.. изменено в версии:: 1.3
Добавлена опция 'gamma'.
'squared_error'
quantile quantile: float, по умолчанию=None

Если loss равен "quantile", этот параметр задаёт квантиль, который необходимо оценить,
и должен находиться в диапазоне от 0 до 1.
None
learning_rate learning_rate: float, по умолчанию=0.1

Скорость обучения, также известная как *сжатие*. Используется как
мультипликативный коэффициент для значений листьев. Используйте ``1``, чтобы не применять
сжатие.
0.1
max_leaf_nodes max_leaf_nodes: int или None, по умолчанию=31

Максимальное число листьев для каждого дерева. Должно быть строго
больше 1. Если None, максимальное ограничение не задаётся.
31
max_depth max_depth: int или None, по умолчанию=None

Максимальная глубина каждого дерева. Глубина дерева — это число
рёбер от корня до самого глубокого листа.
По умолчанию глубина не ограничивается.
None
min_samples_leaf min_samples_leaf: int, по умолчанию=20

Минимальное число образцов в каждом листе. Для небольших наборов данных, содержащих менее
нескольких сотен образцов, рекомендуется уменьшить это значение,
поскольку в противном случае будут строиться только очень неглубокие деревья.
20
l2_regularization l2_regularization: float, по умолчанию=0

Параметр регуляризации L2, штрафующий листья с малыми значениями гессиана.
Используйте ``0``, чтобы отключить регуляризацию (значение по умолчанию).
0.0
max_features max_features: float, по умолчанию=1.0

Доля случайно выбранных признаков в каждом разбиении узла.
Это один из видов регуляризации: меньшие значения делают деревья более слабыми моделями
и могут помочь предотвратить переобучение.
Если заданы ограничения на взаимодействие из `interaction_cst`, при подвыборке учитываются только
разрешённые признаки.

.. добавлено в версии:: 1.4
1.0
max_bins max_bins: int, по умолчанию=255

Максимальное число интервалов для непропущенных значений. Перед
обучением каждый признак входного массива `X` разбивается на интервалы
с целочисленными значениями, что значительно ускоряет этап обучения.
Для признаков с небольшим числом уникальных значений может использоваться меньше
интервалов, чем ``max_bins``. Помимо ``max_bins`` интервалов,
для пропущенных значений всегда резервируется ещё один интервал. Значение не должно превышать 255.
255
monotonic_cst monotonic_cst: array-like целых чисел формы (n_features) или dict, по умолчанию=None

Монотонные ограничения, накладываемые на каждый признак, задаются следующими
целочисленными значениями:

- 1: монотонное возрастание
- 0: без ограничений
- -1: монотонное убывание

Если задан словарь с ключами типа str, он сопоставляет признаки и монотонные ограничения по имени.
Если задан массив, признаки сопоставляются с ограничениями по позиции. Пример использования см.
в :ref:`monotonic_cst_features_names`.

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

.. добавлено в версии:: 0.23

.. изменено в версии:: 1.2
Добавлена поддержка словаря ограничений, в котором ключами служат имена признаков.
None
interaction_cst interaction_cst: {"pairwise", "no_interactions"} или последовательность списков/кортежей/множеств целых чисел, по умолчанию=None

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

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

Строки "pairwise" и "no_interactions" — это сокращённые обозначения,
соответственно разрешающие только попарные взаимодействия или запрещающие взаимодействия.

Например, для 5 признаков в целом `interaction_cst=[{0, 1}]`
эквивалентно `interaction_cst=[{0, 1}, {2, 3, 4}]`
и задаёт, что каждая ветвь дерева будет разбиваться только
по признакам 0 и 1 либо только по признакам 2, 3 и 4.

Пример использования `interaction_cst` см. в :ref:`этом примере<ice-vs-pdp>`.

.. добавлено в версии:: 1.2
None
warm_start warm_start: bool, по умолчанию=False

Если задано ``True``, повторно использовать результат предыдущего вызова fit
и добавить в ансамбль дополнительные оценщики. Чтобы результаты были корректными,
оценщик следует повторно обучать только на тех же данных.
См. :term:`глоссарий <warm_start>`.
False
early_stopping early_stopping: 'auto' или bool, по умолчанию='auto'

Если задано 'auto', ранняя остановка включается, когда размер выборки превышает
10000 или когда в `fit` передаются `X_val` и `y_val`. Если задано True, ранняя остановка
включена, в противном случае она отключена.

.. добавлено в версии:: 0.23
'auto'
scoring scoring: str, вызываемый объект или None, по умолчанию='loss'

Метод оценки, используемый для ранней остановки. Используется только при включённом
`early_stopping`. Доступные варианты:

- str: варианты см. в :ref:`scoring_string_names`.
- вызываемый объект: вызываемый объект-оценщик (например, функция) с сигнатурой
``scorer(estimator, X, y)``. Подробнее см. в :ref:`scoring_callable`.
- `None`: используется :ref:`коэффициент детерминации <r2_score>`
(:math:`R^2`).
- 'loss': ранняя остановка проверяется относительно значения функции потерь.
'loss'
validation_fraction validation_fraction: int, float или None, по умолчанию=0.1

Доля (или абсолютный размер) обучающих данных, отводимая
для проверочных данных при ранней остановке. Если задано None, ранняя остановка выполняется на
обучающих данных.
Значение игнорируется, если ранняя остановка не выполняется, например,
при `early_stopping=False`, или если в fit передаются `X_val` и `y_val`.
0.1
n_iter_no_change n_iter_no_change: int, по умолчанию=10

Используется для определения момента «ранней остановки». Процесс обучения
останавливается, если ни одна из последних ``n_iter_no_change`` оценок не лучше,
чем оценка на ``n_iter_no_change - 1``-м шаге с конца, с учётом
некоторого допуска. Используется только при выполнении ранней остановки.
10
tol tol: float, по умолчанию=1e-7

Абсолютный допуск, используемый при сравнении оценок во время ранней
остановки. Чем выше допуск, тем вероятнее ранняя остановка: при большем допуске последующим
итерациям сложнее считаться улучшением относительно исходной оценки.
1e-07
verbose verbose: int, по умолчанию=0

Уровень подробности вывода. Если значение не равно нулю, выводится информация о
процессе обучения. ``1`` выводит только сводную информацию, ``2`` выводит информацию для каждой
итерации.
0


Наконец, оцениваем конвейер с помощью перекрёстной проверки и записываем результаты:

evaluate_model_and_store("mixed_target", mixed_pipe)

Построение графиков результатов

В этом разделе мы представим результаты, построив графики оценок на тестовой и обучающей выборках:

import matplotlib.pyplot as plt
import pandas as pd

results_df = (
    pd.DataFrame(results).set_index("preprocessor").sort_values("rmse_test_mean")
)

fig, (ax1, ax2) = plt.subplots(
    1, 2, figsize=(12, 8), sharey=True, constrained_layout=True
)
xticks = range(len(results_df))
name_to_color = dict(
    zip((r["preprocessor"] for r in results), ["C0", "C1", "C2", "C3", "C4"])
)

for subset, ax in zip(["test", "train"], [ax1, ax2]):
    mean, std = f"rmse_{subset}_mean", f"rmse_{subset}_std"
    data = results_df[[mean, std]].sort_values(mean)
    ax.bar(
        x=xticks,
        height=data[mean],
        yerr=data[std],
        width=0.9,
        color=[name_to_color[name] for name in data.index],
    )
    ax.set(
        title=f"RMSE ({subset.title()})",
        xlabel="Encoding Scheme",
        xticks=xticks,
        xticklabels=data.index,
    )
RMSE (Test), RMSE (Train)

При оценке прогностической эффективности на тестовой выборке удаление категорий даёт наихудший результат, а кодирование целевой переменной — наилучший. Это можно объяснить следующим образом:

  • Удаление категориальных признаков снижает выразительность конвейера и, как следствие, приводит к недообучению;
  • Из-за высокой кардинальности и необходимости сократить время обучения при схеме one-hot-кодирования используется max_categories=20, что не позволяет признакам чрезмерно разрастаться и может привести к недообучению.
  • Если бы мы не задали max_categories=20, схема one-hot-кодирования, скорее всего, привела бы к переобучению конвейера: число признаков резко увеличилось бы из-за редких категорий, которые случайно коррелируют с целевой переменной (только в обучающей выборке);
  • Порядковое кодирование задаёт произвольный порядок признаков, которые затем обрабатываются как числовые значения моделью HistGradientBoostingRegressor. Поскольку эта модель группирует числовые признаки в 256 интервалов для каждого признака, многие несвязанные категории могут оказаться в одной группе, что в результате может привести к недообучению всего конвейера;
  • При использовании кодировщика целевой переменной происходит такое же разбиение на интервалы, но поскольку закодированные значения упорядочены статистически по маргинальной связи с целевой переменной, разбиение на интервалы, используемое моделью HistGradientBoostingRegressor, оказывается осмысленным и даёт хорошие результаты: сочетание сглаженного кодирования целевой переменной и разбиения на интервалы хорошо регуляризует модель против переобучения, не слишком ограничивая выразительность конвейера.

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_target_encoder.ipynb

Download Python source code: plot_target_encoder.py

Download zipped: plot_target_encoder.zip

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

Поддержка категориальных признаков в градиентном бустинге

Внутреннее перекрёстное кодирование в TargetEncoder

ColumnTransformer для данных смешанных типов

Основные изменения в scikit-learn 1.4

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/preprocessing/plot_target_encoder.html

Spec-Zone.ru

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