Spec-Zone.ru › scikit-learn

Примечание

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

Распространённые ошибки при интерпретации коэффициентов линейных моделей

В линейных моделях целевое значение моделируется как линейная комбинация признаков (описание набора линейных моделей, доступных в scikit-learn, см. в разделе руководства пользователя Линейные модели). Коэффициенты в моделях множественной линейной регрессии отражают взаимосвязь между заданным признаком \(X_i\) и целевой переменной \(y\) при условии, что все остальные признаки остаются неизменными (условная зависимость). Это отличается от построения графика зависимости \(X_i\) от \(y\) и подбора линейной зависимости: в этом случае при оценке учитываются все возможные значения остальных признаков (маргинальная зависимость).

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

Примечание

Помните, что признаки \(X\) и результат \(y\) в общем случае являются результатом процесса генерации данных, который нам неизвестен. Модели машинного обучения обучаются приближать ненаблюдаемую математическую функцию, связывающую \(X\) и \(y\), на основе выборочных данных. Поэтому любая интерпретация модели не обязательно будет применима к истинному процессу генерации данных. Особенно это актуально, если модель имеет низкое качество или выборочные данные не представляют генеральную совокупность.

Мы будем использовать данные из «Current Population Survey» за 1985 год, чтобы предсказывать заработную плату на основе различных признаков, таких как опыт работы, возраст и образование.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy as sp
import seaborn as sns

Набор данных: заработная плата

Мы получаем данные с сайта OpenML. Обратите внимание: если установить параметр as_frame в True, данные будут возвращены в виде фрейма данных pandas.

from sklearn.datasets import fetch_openml

survey = fetch_openml(data_id=534, as_frame=True)

Затем определим признаки X и целевую переменную y: столбец WAGE — это наша целевая переменная (то есть переменная, значение которой мы хотим предсказать).

X = survey.data[survey.feature_names]
X.describe(include="all")
EDUCATION SOUTH SEX EXPERIENCE UNION AGE RACE OCCUPATION SECTOR MARR
count 534.000000 534 534 534.000000 534 534.000000 534 534 534 534
unique NaN 2 2 NaN 2 NaN 3 6 3 2
top NaN no male NaN not_member NaN White Other Other Married
freq NaN 378 289 NaN 438 NaN 440 156 411 350
mean 13.018727 NaN NaN 17.822097 NaN 36.833333 NaN NaN NaN NaN
std 2.615373 NaN NaN 12.379710 NaN 11.726573 NaN NaN NaN NaN
min 2.000000 NaN NaN 0.000000 NaN 18.000000 NaN NaN NaN NaN
25% 12.000000 NaN NaN 8.000000 NaN 28.000000 NaN NaN NaN NaN
50% 12.000000 NaN NaN 15.000000 NaN 35.000000 NaN NaN NaN NaN
75% 15.000000 NaN NaN 26.000000 NaN 44.000000 NaN NaN NaN NaN
max 18.000000 NaN NaN 55.000000 NaN 64.000000 NaN NaN NaN NaN


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

X.head()
EDUCATION SOUTH SEX EXPERIENCE UNION AGE RACE OCCUPATION SECTOR MARR
0 8 no female 21 not_member 35 Hispanic Other Manufacturing Married
1 9 no female 42 not_member 57 White Other Manufacturing Married
2 12 no male 1 not_member 19 White Other Manufacturing Unmarried
3 12 no male 4 not_member 22 White Other Other Unmarried
4 12 no male 17 not_member 35 White Other Other Married


Целевая переменная для предсказания — заработная плата. Она представлена числом с плавающей точкой и измеряется в долларах за час.

y = survey.target.values.ravel()
survey.target.head()
0    5.10
1    4.95
2    6.67
3    4.00
4    7.50
Name: WAGE, dtype: float64

Разделим выборку на обучающий и тестовый наборы. В дальнейшем исследовательском анализе будет использоваться только обучающий набор. Так мы имитируем реальную ситуацию, в которой предсказания строятся для неизвестных целевых значений, и исключаем влияние сведений о тестовых данных на наш анализ и решения.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

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

train_dataset = X_train.copy()
train_dataset.insert(0, "WAGE", y_train)
_ = sns.pairplot(train_dataset, kind="reg", diag_kind="kde")
plot linear model coefficient interpretation

При более внимательном изучении распределения WAGE видно, что у него длинный хвост. Поэтому следует взять логарифм этой переменной, чтобы получить приблизительно нормальное распределение (линейные модели, такие как ridge и lasso, лучше всего работают при нормальном распределении ошибок).

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

Кроме того, EXPERIENCE и AGE имеют сильную линейную корреляцию.

Конвейер машинного обучения

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

survey.data.info()
<class 'pandas.DataFrame'>
RangeIndex: 534 entries, 0 to 533
Data columns (total 10 columns):
 #   Column      Non-Null Count  Dtype
---  ------      --------------  -----
 0   EDUCATION   534 non-null    int64
 1   SOUTH       534 non-null    category
 2   SEX         534 non-null    category
 3   EXPERIENCE  534 non-null    int64
 4   UNION       534 non-null    category
 5   AGE         534 non-null    int64
 6   RACE        534 non-null    category
 7   OCCUPATION  534 non-null    category
 8   SECTOR      534 non-null    category
 9   MARR        534 non-null    category
dtypes: category(7), int64(3)
memory usage: 17.3 KB

Как было показано выше, набор данных содержит столбцы с разными типами данных, и для каждого типа требуется отдельная предварительная обработка. В частности, категориальные переменные нельзя включать в линейную модель, если предварительно не представить их в виде целых чисел. Кроме того, чтобы категориальные признаки не воспринимались как упорядоченные значения, необходимо выполнить их прямое унитарное кодирование (one-hot encoding). Наш предварительный обработчик будет:

  • выполнять прямое унитарное кодирование (то есть создавать столбец для каждой категории) категориальных столбцов, кроме бинарных категориальных переменных;
  • на первом этапе (позже мы рассмотрим, как нормализация числовых значений повлияет на обсуждение) оставлять числовые значения без изменений.
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import OneHotEncoder

categorical_columns = ["RACE", "OCCUPATION", "SECTOR", "MARR", "UNION", "SEX", "SOUTH"]
numerical_columns = ["EDUCATION", "EXPERIENCE", "AGE"]

preprocessor = make_column_transformer(
    (OneHotEncoder(drop="if_binary"), categorical_columns),
    remainder="passthrough",
    verbose_feature_names_out=False,  # avoid to prepend the preprocessor names
)

Для моделирования логарифма WAGE мы используем регрессор Ridge с очень слабой регуляризацией.

from sklearn.compose import TransformedTargetRegressor
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline

model = make_pipeline(
    preprocessor,
    TransformedTargetRegressor(
        regressor=Ridge(alpha=1e-10), func=np.log10, inverse_func=sp.special.exp10
    ),
)

Обработка набора данных

Сначала обучим модель.

model.fit(X_train, y_train)
Pipeline(steps=[('columntransformer',
                 ColumnTransformer(remainder='passthrough',
                                   transformers=[('onehotencoder',
                                                  OneHotEncoder(drop='if_binary'),
                                                  ['RACE', 'OCCUPATION',
                                                   'SECTOR', 'MARR', 'UNION',
                                                   'SEX', 'SOUTH'])],
                                   verbose_feature_names_out=False)),
                ('transformedtargetregressor',
                 TransformedTargetRegressor(func=<ufunc 'log10'>,
                                            inverse_func=<ufunc 'exp10'>,
                                            regressor=Ridge(alpha=1e-10)))])
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте этому блокноту.
На GitHub HTML-представление отобразить невозможно; попробуйте открыть эту страницу на nbviewer.org.
Параметры
steps steps: список кортежей

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

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

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

.. versionadded:: 1.0
ndarray[object](10,) ['EDUCATION','SOUTH','SEX',...,'OCCUPATION','SECTOR','MARR']
n_features_in_ n_features_in_: int

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

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

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

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`.
[('onehotencoder', ...)]
remainder remainder: {'drop', 'passthrough'} или оцениватель, по умолчанию='drop'

По умолчанию преобразуются и объединяются в выходных данных только указанные в `transformers` столбцы,
а неуказанные столбцы удаляются (по умолчанию ``'drop'``).
Если указать ``remainder='passthrough'``, все остальные столбцы, которые
не были указаны в `transformers`, но присутствовали в данных, переданных
в `fit`, будут автоматически переданы без изменений. Это подмножество столбцов
объединяется с результатом преобразователей. Для фреймов данных
дополнительные столбцы, не встречавшиеся при `fit`, будут исключены из результата
`transform`.
Если задать для ``remainder`` оцениватель, к оставшимся
неуказанным столбцам будет применяться этот оцениватель ``remainder``. Оцениватель
должен поддерживать :term:`fit` и :term:`transform`.
Обратите внимание, что для использования этой возможности столбцы DataFrame,
передаваемые в :term:`fit` и :term:`transform`, должны иметь одинаковый порядок.
'passthrough'
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
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:`Glossary <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](10,) ['EDUCATION','SOUTH','SEX',...,'OCCUPATION','SECTOR','MARR']
n_features_in_ n_features_in_: int

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

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

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

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

.. versionadded:: 1.0
dict {'on...er': slice(0, 16, None), 're...er': slice(16, 19, None)}
sparse_output_ sparse_output_: bool

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

Коллекция обученных преобразователей в виде кортежей (name,
fitted_transformer, column). `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 [('on...er', OneHotEncoder...p='if_binary'), ['RACE', 'OC...ON', 'SECTOR', 'MARR', ...]), ('re...er', FunctionTrans...='one-to-one'), ['ED...ON', 'EX...CE', 'AGE'])]
['RACE', 'OCCUPATION', 'SECTOR', 'MARR', 'UNION', 'SEX', 'SOUTH']
Параметры
drop drop: {'first', 'if_binary'} или массивоподобный объект формы (n_features,), по умолчанию=None

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

Однако удаление одной категории нарушает симметрию исходного
представления и поэтому может привести к смещению последующих моделей,
например моделей линейной классификации или регрессии с регуляризацией.

- None : сохранить все признаки (значение по умолчанию).
- 'first' : удалить первую категорию каждого признака. Если присутствует только одна
категория, признак будет удален полностью.
- 'if_binary' : удалить первую категорию каждого признака с двумя
категориями. Признаки с 1 или более чем 2 категориями
останутся без изменений.
- array : ``drop[i]`` — категория признака ``X[:, i]``,
которую следует удалить.

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

.. versionadded:: 0.21
Параметр `drop` добавлен в версии 0.21.

.. versionchanged:: 0.23
В версии 0.23 добавлен вариант `drop='if_binary'`.

.. versionchanged:: 1.1
Добавлена поддержка удаления редко встречающихся категорий.
'if_binary'
categories categories: 'auto' или список массивоподобных объектов, по умолчанию='auto'

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

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

Используемые категории можно найти в атрибуте ``categories_``.

.. versionadded:: 0.20
'auto'
sparse_output sparse_output: bool, по умолчанию=True

Если ``True``, возвращает разреженную матрицу/массив SciPy
в формате "Compressed Sparse Row" (CSR).

.. versionadded:: 1.2
`sparse` переименован в `sparse_output`
True
dtype dtype: числовой тип, по умолчанию=np.float64

Требуемый тип данных результата.
<class 'numpy.float64'>
handle_unknown handle_unknown: {'error', 'ignore', 'infrequent_if_exist', 'warn'}, по умолчанию='error'

Задает способ обработки неизвестных категорий во время :meth:`transform`.

- 'error' : вызывать ошибку, если во время преобразования обнаружена неизвестная категория.
- 'ignore' : если при преобразовании обнаружена неизвестная категория,
результирующие столбцы с унитарным кодированием для этого признака
будут заполнены нулями. При обратном преобразовании неизвестная категория
будет обозначена как None.
- 'infrequent_if_exist' : если при преобразовании обнаружена неизвестная категория,
результирующие столбцы с унитарным кодированием для этого признака
будут сопоставлены с редко встречающейся категорией, если она существует. Редко встречающаяся категория
будет сопоставлена с последней позицией в кодировке. При обратном преобразовании неизвестная категория будет
сопоставлена с категорией, обозначенной как `'infrequent'`, если она существует. Если категория
`'infrequent'` не существует, :meth:`transform` и
:meth:`inverse_transform` будут обрабатывать неизвестную категорию так же, как при
`handle_unknown='ignore'`. Редко встречающиеся категории определяются на основе
`min_frequency` и `max_categories`. Подробнее см. в
:ref:`руководстве пользователя <encoder_infrequent_categories>`.
- 'warn' : если при преобразовании обнаружена неизвестная категория,
выдается предупреждение, после чего кодирование выполняется так, как описано для
`handle_unknown="infrequent_if_exist"`.

.. versionchanged:: 1.1
`'infrequent_if_exist'` добавлен для автоматической обработки неизвестных
и редко встречающихся категорий.

.. versionadded:: 1.6
Вариант `"warn"` добавлен в версии 1.6.
'error'
min_frequency min_frequency: int или float, по умолчанию=None

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

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

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

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

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

.. versionadded:: 1.1
Подробнее см. в :ref:`руководстве пользователя <encoder_infrequent_categories>`.
None
feature_name_combiner feature_name_combiner: "concat" или вызываемый объект, по умолчанию="concat"

Вызываемый объект с сигнатурой `def callable(input_feature, category)`, возвращающий
строку. Он используется для создания имен признаков, возвращаемых методом
:meth:`get_feature_names_out`.

`"concat"` объединяет закодированное имя признака и категорию в строку
`feature + "_" + str(category)`. Например, для признака X со значениями 1, 6, 7 создаются
имена признаков `X_1, X_6, X_7`.

.. versionadded:: 1.3
'concat'
Обученные атрибуты
Имя Тип Значение
categories_ categories_: список массивов

Категории каждого признака, определенные во время обучения
(в порядке признаков в X и в соответствии с результатом
``transform``). Сюда входит категория, указанная в ``drop``
(если она задана).
list [array(['Hispa... dtype=object), array(['Cleri... dtype=object), array(['Const... dtype=object), array(['Marri... dtype=object), ...]
drop_idx_ drop_idx_: массив формы (n_features,)

- ``drop_idx_[i]`` — индекс в ``categories_[i]`` категории,
которую следует удалить для каждого признака.
- ``drop_idx_[i] = None``, если для признака с индексом ``i``
не нужно удалять категорию, например если задано `drop='if_binary'`, а
признак не является бинарным.
- ``drop_idx_ = None``, если нужно сохранить все преобразованные признаки.

Если редко встречающиеся категории включены путем задания для `min_frequency` или
`max_categories` значения, отличного от значения по умолчанию, и `drop_idx[i]` соответствует
редко встречающейся категории, удаляется вся редко встречающаяся категория.

.. versionchanged:: 0.23
Добавлена возможность содержать значения `None`.
ndarray[object](7,) [None,None,None,...,0,0,0]
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

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

.. versionadded:: 1.0
ndarray[object](7,) ['RACE','OCCUPATION','SECTOR',...,'UNION','SEX','SOUTH']
n_features_in_ n_features_in_: int

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

.. versionadded:: 1.0
int 7
16 признаков
RACE_Hispanic
RACE_Other
RACE_White
OCCUPATION_Clerical
OCCUPATION_Management
OCCUPATION_Other
OCCUPATION_Professional
OCCUPATION_Sales
OCCUPATION_Service
SECTOR_Construction
SECTOR_Manufacturing
SECTOR_Other
MARR_Unmarried
UNION_not_member
SEX_male
SOUTH_yes
['EDUCATION', 'EXPERIENCE', 'AGE']
3 признака
EDUCATION
EXPERIENCE
AGE
19 признаков
RACE_Hispanic
RACE_Other
RACE_White
OCCUPATION_Clerical
OCCUPATION_Management
OCCUPATION_Other
OCCUPATION_Professional
OCCUPATION_Sales
OCCUPATION_Service
SECTOR_Construction
SECTOR_Manufacturing
SECTOR_Other
MARR_Unmarried
UNION_not_member
SEX_male
SOUTH_yes
EDUCATION
EXPERIENCE
AGE
Параметры
regressor regressor: object, default=None

Объект регрессора, например производный от
:class:`~sklearn.base.RegressorMixin`. Этот регрессор будет
автоматически клонироваться перед каждым обучением. Если `regressor is
None`, создаётся и используется :class:`~sklearn.linear_model.LinearRegression`.
Ridge(alpha=1e-10)
func func: function, default=None

Функция, применяемая к `y` перед передачей в :meth:`fit`. Нельзя задавать
одновременно с `transformer`. Если `func is None`, используется тождественная функция. Если задана `func`, необходимо также
указать `inverse_func`. Функция должна возвращать двумерный массив.
<ufunc 'log10'>
inverse_func inverse_func: function, default=None

Функция, применяемая к прогнозу регрессора. Нельзя задавать одновременно
с `transformer`. Обратная функция используется для возврата
прогнозов в то же пространство, что и исходные обучающие метки. Если
задана `inverse_func`, необходимо также указать `func`. Обратная
функция должна возвращать двумерный массив.
<ufunc 'exp10'>
transformer transformer: object, default=None

Объект оценщика, например производный от
:class:`~sklearn.base.TransformerMixin`. Нельзя задавать одновременно
с `func` и `inverse_func`. Если `transformer is None`, а также не заданы
`func` и `inverse_func`, преобразователь будет тождественным.
Обратите внимание, что преобразователь будет клонирован при обучении.
Кроме того, преобразователь ограничивает `y` массивом numpy.
None
check_inverse check_inverse: bool, default=True

Проверять ли, что последовательное применение `transform` и `inverse_transform`
или `func` и `inverse_func` возвращает исходные целевые значения.
True
Обученные атрибуты
Имя Тип Значение
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 19
regressor_ regressor_: object

Обученный регрессор.
Ridge Ridge(alpha=1e-10)
transformer_ transformer_: object

Преобразователь, используемый в :meth:`fit` и :meth:`predict`.
FunctionTransformer FunctionTrans...validate=True)
Параметры
alpha alpha: float or array-like of shape (n_targets,), default=1.0

Константа, умножающая член L2 и задающая силу регуляризации.
`alpha` должно быть неотрицательным числом, то есть принадлежать `[0, inf)`.

При `alpha = 0` целевая функция эквивалентна обычному методу наименьших
квадратов, решаемому объектом :class:`LinearRegression`. По численным
соображениям не рекомендуется использовать `alpha = 0` с объектом `Ridge`.
Вместо этого следует использовать объект :class:`LinearRegression`.

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

См. :ref:`sphx_glr_auto_examples_linear_model_plot_ridge_coeffs.py`
для иллюстрации влияния alpha на коэффициенты модели.
1e-10
fit_intercept fit_intercept: bool, default=True

Следует ли обучать свободный член модели. Если задано значение
false, в вычислениях свободный член использоваться не будет
(то есть предполагается, что ``X`` и ``y`` центрированы).
True
copy_X copy_X: bool, default=True

Если True, X будет скопирован; иначе он может быть перезаписан.
True
max_iter max_iter: int, default=None

Максимальное число итераций для решателя на основе метода сопряжённых градиентов.
Для решателей 'sparse_cg' и 'lsqr' значение по умолчанию определяется
scipy.sparse.linalg. Для решателя 'sag' значение по умолчанию — 1000.
Для решателя 'lbfgs' значение по умолчанию — 15000.
None
tol tol: float, default=1e-4

Точность решения (`coef_`) определяется параметром `tol`, который
задаёт разные критерии сходимости для каждого решателя:

- 'svd': `tol` не влияет на результат.

- 'cholesky': `tol` не влияет на результат.

- 'sparse_cg': норма невязки меньше `tol`.

- 'lsqr': `tol` задаётся как atol и btol в scipy.sparse.linalg.lsqr,
которые определяют норму вектора невязки относительно норм матрицы и коэффициентов.

- 'sag' и 'saga': относительное изменение coef меньше `tol`.

- 'lbfgs': максимум абсолютного (проецированного) градиента=max|residuals|
меньше `tol`.

.. versionchanged:: 1.2
Значение по умолчанию изменено с 1e-3 на 1e-4 для согласованности с другими линейными
моделями.
0.0001
solver solver: {'auto', 'svd', 'cholesky', 'lsqr', 'sparse_cg', 'sag', 'saga', 'lbfgs'}, default='auto'

Решатель, используемый в вычислениях:

- 'auto' автоматически выбирает решатель на основе типа данных.

- 'svd' использует сингулярное разложение X для вычисления коэффициентов
Ridge. Это наиболее стабильный решатель; в частности, он стабильнее
'cholesky' для вырожденных матриц, но работает медленнее.

- 'cholesky' использует стандартную функцию :func:`scipy.linalg.solve` для
получения решения в замкнутой форме.

- 'sparse_cg' использует решатель на основе метода сопряжённых градиентов из
:func:`scipy.sparse.linalg.cg`. Поскольку это итерационный алгоритм, данный решатель
лучше подходит, чем 'cholesky', для больших наборов данных
(можно задавать `tol` и `max_iter`).

- 'lsqr' использует специализированную процедуру регуляризованного метода наименьших квадратов
:func:`scipy.sparse.linalg.lsqr`. Это самый быстрый решатель, использующий итерационный
процесс.

- 'sag' использует метод стохастического градиентного спуска со средним градиентом, а 'saga' —
его улучшенную несмещённую версию SAGA. Оба метода также используют итерационный
процесс и часто работают быстрее других решателей, если велики и n_samples, и n_features.
Обратите внимание: быстрая сходимость 'sag' и
'saga' гарантирована только для признаков с примерно одинаковым масштабом.
Данные можно предварительно обработать с помощью средства масштабирования из
:mod:`sklearn.preprocessing`.

- 'lbfgs' использует алгоритм L-BFGS-B, реализованный в
:func:`scipy.optimize.minimize`. Его можно использовать, только если `positive`
имеет значение True.

Все решатели, кроме 'svd', поддерживают как плотные, так и разреженные данные. Однако только
'lsqr', 'sag', 'sparse_cg' и 'lbfgs' поддерживают разреженный ввод, если
`fit_intercept` имеет значение True.

.. versionadded:: 0.17
Решатель стохастического градиентного спуска со средним градиентом.
.. versionadded:: 0.19
Решатель SAGA.
'auto'
positive positive: bool, default=False

Если задано ``True``, коэффициенты принудительно принимают положительные значения.
В этом случае поддерживается только решатель 'lbfgs'.
False
random_state random_state: int, RandomState instance, default=None

Используется для перемешивания данных, когда ``solver`` == 'sag' или 'saga'.
Подробнее см. :term:`Glossary <random_state>`.

.. versionadded:: 0.17
`random_state` добавлен для поддержки стохастического градиентного спуска со средним градиентом.
None
Обученные атрибуты
Имя Тип Значение
coef_ coef_: ndarray формы (n_features,) или (n_targets, n_features)

Вектор(ы) весов.
ndarray[float64](19,) [-0.01,-0.01, 0.02,..., 0.05, 0.04,-0.03]
intercept_ intercept_: float или ndarray формы (n_targets,)

Свободный член функции принятия решения. Равен 0.0, если
``fit_intercept = False``.
float64 0.7665
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 19
n_iter_ n_iter_: None или ndarray формы (n_targets,)

Фактическое количество итераций для каждой целевой переменной. Доступно только для
решателей 'sag' и 'lsqr'. Другие решатели возвращают None.

.. versionadded:: 0.17
NoneType None
solver_ solver_: str

Решатель, использованный вычислительными процедурами при обучении.

.. versionadded:: 1.5
str 'ch...ky'


Затем мы проверим качество полученной модели: построим график её прогнозов в сравнении с фактическими значениями на тестовой выборке и вычислим медианную абсолютную ошибку.

from sklearn.metrics import PredictionErrorDisplay, median_absolute_error

mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
    "MedAE on training set": f"{mae_train:.2f} $/hour",
    "MedAE on testing set": f"{mae_test:.2f} $/hour",
}
_, ax = plt.subplots(figsize=(5, 5))
display = PredictionErrorDisplay.from_predictions(
    y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Ridge model, small regularization")
for name, score in scores.items():
    ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()
Ridge model, small regularization

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

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

Интерпретация коэффициентов: масштаб имеет значение

Для начала рассмотрим значения коэффициентов обученного регрессора.

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

coefs = pd.DataFrame(
    model[-1].regressor_.coef_,
    columns=["Coefficients"],
    index=feature_names,
)

coefs
Коэффициенты
RACE_Hispanic -0.013561
RACE_Other -0.009117
RACE_White 0.022552
OCCUPATION_Clerical 0.000046
OCCUPATION_Management 0.090529
OCCUPATION_Other -0.025101
OCCUPATION_Professional 0.071964
OCCUPATION_Sales -0.046635
OCCUPATION_Service -0.091052
SECTOR_Construction -0.000187
SECTOR_Manufacturing 0.031266
SECTOR_Other -0.031015
MARR_Unmarried -0.032405
UNION_not_member -0.117154
SEX_male 0.090808
SOUTH_yes -0.033823
EDUCATION 0.054699
EXPERIENCE 0.035005
AGE -0.030867


Коэффициент AGE выражен в «долларах в час на год жизни», а коэффициент EDUCATION — в «долларах в час на год обучения». Такое представление коэффициентов помогает понять практические прогнозы модели: увеличение AGE на \(1\) год означает снижение почасовой оплаты на \(0.030867\) доллара, тогда как увеличение EDUCATION на \(1\) год означает увеличение почасовой оплаты на \(0.054699\) доллара. С другой стороны, категориальные переменные (например, UNION или SEX) — безразмерные величины, принимающие значение 0 или 1. Их коэффициенты выражены в долларах в час. Поэтому мы не можем сравнивать величины разных коэффициентов: из-за различий в единицах измерения у признаков разные естественные масштабы и диапазоны значений. Это особенно наглядно при построении графика коэффициентов.

coefs.plot.barh(figsize=(9, 7))
plt.title("Ridge model, small regularization")
plt.axvline(x=0, color=".5")
plt.xlabel("Raw coefficient values")
plt.subplots_adjust(left=0.3)
Ridge model, small regularization

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

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

Это видно при сравнении стандартных отклонений разных признаков.

X_train_preprocessed = pd.DataFrame(
    model[:-1].transform(X_train), columns=feature_names
)

X_train_preprocessed.std(axis=0).plot.barh(figsize=(9, 7))
plt.title("Feature ranges")
plt.xlabel("Std. dev. of feature values")
plt.subplots_adjust(left=0.3)
Feature ranges

Умножение коэффициентов на стандартное отклонение соответствующего признака приведёт все коэффициенты к одной и той же единице измерения. Как мы увидим далее, это эквивалентно нормализации числовых переменных по их стандартному отклонению, поскольку \(y = \sum{coef_i \times X_i} = \sum{(coef_i \times std_i) \times (X_i / std_i)}\).

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

coefs = pd.DataFrame(
    model[-1].regressor_.coef_ * X_train_preprocessed.std(axis=0),
    columns=["Coefficient importance"],
    index=feature_names,
)
coefs.plot(kind="barh", figsize=(9, 7))
plt.xlabel("Coefficient values corrected by the feature's std. dev.")
plt.title("Ridge model, small regularization")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)
Ridge model, small regularization

Теперь, когда коэффициенты приведены к общему масштабу, их можно безопасно сравнивать.

Примечание

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

График выше показывает зависимости между конкретным признаком и целевой переменной при неизменности всех остальных признаков, то есть условные зависимости. Увеличение AGE приведёт к снижению WAGE при неизменности остальных признаков. Напротив, увеличение EXPERIENCE приведёт к росту WAGE при неизменности остальных признаков. Кроме того, AGE, EXPERIENCE и EDUCATION — три переменные, оказывающие наибольшее влияние на модель.

Интерпретация коэффициентов: осторожность в отношении причинности

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

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

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

Такое смешение эффектов становится проблемой при рассмотрении каких-либо мер вмешательства, например государственных субсидий на получение университетского образования или рекламных материалов, побуждающих людей получать высшее образование. Полезность таких мер может быть переоценена, особенно если степень смешения велика. Наша модель прогнозирует увеличение почасовой оплаты на \(0.054699\) за каждый дополнительный год обучения. Из-за этого смешения фактический причинный эффект может быть меньше.

Проверка изменчивости коэффициентов

Изменчивость коэффициентов можно проверить с помощью перекрёстной проверки: это один из видов возмущения данных (связанный с повторной выборкой).

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

from sklearn.model_selection import RepeatedKFold, cross_validate

cv = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0)
cv_model = cross_validate(
    model,
    X,
    y,
    cv=cv,
    return_estimator=True,
    n_jobs=2,
)

coefs = pd.DataFrame(
    [
        est[-1].regressor_.coef_ * est[:-1].transform(X.iloc[train_idx]).std(axis=0)
        for est, (train_idx, _) in zip(cv_model["estimator"], cv.split(X, y))
    ],
    columns=feature_names,
)
plt.figure(figsize=(9, 7))
sns.stripplot(data=coefs, orient="h", palette="dark:k", alpha=0.5)
sns.boxplot(data=coefs, orient="h", color="cyan", saturation=0.5, whis=10)
plt.axvline(x=0, color=".5")
plt.xlabel("Coefficient importance")
plt.title("Coefficient importance and its variability")
plt.suptitle("Ridge model, small regularization")
plt.subplots_adjust(left=0.3)
Ridge model, small regularization, Coefficient importance and its variability

Проблема коррелирующих переменных

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

Чтобы проверить эту интерпретацию, построим график изменчивости коэффициентов AGE и EXPERIENCE.

plt.xlabel("Age coefficient")
plt.ylabel("Experience coefficient")
plt.grid(True)
plt.xlim(-0.4, 0.5)
plt.ylim(-0.4, 0.5)
plt.scatter(coefs["AGE"], coefs["EXPERIENCE"])
_ = plt.title("Co-variations of coefficients for AGE and EXPERIENCE across folds")
Co-variations of coefficients for AGE and EXPERIENCE across folds

На графике выделяются две области: когда коэффициент EXPERIENCE положителен, коэффициент AGE отрицателен, и наоборот.

Чтобы продолжить анализ, удалим один из двух признаков — AGE — и проверим, как это повлияет на стабильность модели.

column_to_drop = ["AGE"]

cv_model = cross_validate(
    model,
    X.drop(columns=column_to_drop),
    y,
    cv=cv,
    return_estimator=True,
    n_jobs=2,
)

coefs = pd.DataFrame(
    [
        est[-1].regressor_.coef_
        * est[:-1].transform(X.drop(columns=column_to_drop).iloc[train_idx]).std(axis=0)
        for est, (train_idx, _) in zip(cv_model["estimator"], cv.split(X, y))
    ],
    columns=feature_names[:-1],
)
plt.figure(figsize=(9, 7))
sns.stripplot(data=coefs, orient="h", palette="dark:k", alpha=0.5)
sns.boxplot(data=coefs, orient="h", color="cyan", saturation=0.5)
plt.axvline(x=0, color=".5")
plt.title("Coefficient importance and its variability")
plt.xlabel("Coefficient importance")
plt.suptitle("Ridge model, small regularization, AGE dropped")
plt.subplots_adjust(left=0.3)
Ridge model, small regularization, AGE dropped, Coefficient importance and its variability

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

Предварительная обработка числовых переменных

Как было сказано выше (см. «Конвейер машинного обучения»), перед обучением модели мы также можем масштабировать числовые значения. Это может быть полезно, когда при использовании ridge-регрессии ко всем переменным применяется одинаковый уровень регуляризации. Предварительная обработка определяется заново, чтобы вычитать среднее и масштабировать переменные до единичной дисперсии.

from sklearn.preprocessing import StandardScaler

preprocessor = make_column_transformer(
    (OneHotEncoder(drop="if_binary"), categorical_columns),
    (StandardScaler(), numerical_columns),
)

Модель останется без изменений.

model = make_pipeline(
    preprocessor,
    TransformedTargetRegressor(
        regressor=Ridge(alpha=1e-10), func=np.log10, inverse_func=sp.special.exp10
    ),
)
model.fit(X_train, y_train)
Pipeline(steps=[('columntransformer',
                 ColumnTransformer(transformers=[('onehotencoder',
                                                  OneHotEncoder(drop='if_binary'),
                                                  ['RACE', 'OCCUPATION',
                                                   'SECTOR', 'MARR', 'UNION',
                                                   'SEX', 'SOUTH']),
                                                 ('standardscaler',
                                                  StandardScaler(),
                                                  ['EDUCATION', 'EXPERIENCE',
                                                   'AGE'])])),
                ('transformedtargetregressor',
                 TransformedTargetRegressor(func=<ufunc 'log10'>,
                                            inverse_func=<ufunc 'exp10'>,
                                            regressor=Ridge(alpha=1e-10)))])
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте записной книжке.
На GitHub HTML-представление не отображается. Попробуйте открыть эту страницу с помощью nbviewer.org.
Параметры
steps steps: список кортежей

Список кортежей (имя шага, оцениватель), которые будут объединены
в последовательном порядке. Для совместимости с API scikit-learn все шаги
должны определять `fit`. Все шаги, кроме последнего, также должны определять `transform`. Подробнее см.
:ref:`Combining Estimators <combining_estimators>`.
[('columntransformer', ...), ('transformedtargetregressor', ...)]
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
Обученные атрибуты
Имя Тип Значение
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

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

.. versionadded:: 1.0
ndarray[object](10,) ['EDUCATION','SOUTH','SEX',...,'OCCUPATION','SECTOR','MARR']
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 10
Параметры
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`.
[('onehotencoder', ...), ('standardscaler', ...)]
remainder remainder: {'drop', 'passthrough'} или оцениватель, по умолчанию 'drop'

По умолчанию преобразуются и объединяются в выходных данных только столбцы, указанные в `transformers`,
а остальные столбцы удаляются (значение по умолчанию — ``'drop'``).
Если указать ``remainder='passthrough'``, все оставшиеся столбцы, которые
не указаны в `transformers`, но присутствуют в данных, переданных
в `fit`, будут автоматически переданы без преобразования. Это подмножество столбцов
объединяется с результатом преобразователей. Для объектов DataFrame
дополнительные столбцы, отсутствовавшие во время `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
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` может быть вызываемым объектом или строкой для форматирования.
True
Обученные атрибуты
Имя Тип Значение
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

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

.. versionadded:: 1.0
ndarray[object](10,) ['EDUCATION','SOUTH','SEX',...,'OCCUPATION','SECTOR','MARR']
n_features_in_ n_features_in_: int

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

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

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

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

.. versionadded:: 1.0
dict {'on...er': slice(0, 16, None), 're...er': slice(0, 0, None), 'st...er': slice(16, 19, 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 [('on...er', OneHotEncoder...p='if_binary'), ['RACE', 'OC...ON', 'SECTOR', 'MARR', ...]), ('st...er', StandardScaler(), ['ED...ON', 'EX...CE', 'AGE'])]
['RACE', 'OCCUPATION', 'SECTOR', 'MARR', 'UNION', 'SEX', 'SOUTH']
Параметры
drop drop: {'first', 'if_binary'} или массивоподобный объект формы (n_features,), по умолчанию=None

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

Однако удаление одной категории нарушает симметрию исходного
представления и поэтому может привести к смещению в последующих моделях,
например в моделях линейной классификации или регрессии с регуляризацией.

- None : сохранить все признаки (по умолчанию).
- 'first' : удалить первую категорию в каждом признаке. Если присутствует только одна
категория, признак будет удален полностью.
- 'if_binary' : удалить первую категорию в каждом признаке с двумя
категориями. Признаки с 1 или более чем 2 категориями
остаются без изменений.
- array : ``drop[i]`` — категория признака ``X[:, i]``, которую
следует удалить.

Если для группировки редких категорий заданы `max_categories` или `min_frequency`,
удаление выполняется после группировки.

.. versionadded:: 0.21
Параметр `drop` добавлен в версии 0.21.

.. versionchanged:: 0.23
Возможность `drop='if_binary'` добавлена в версии 0.23.

.. versionchanged:: 1.1
Добавлена поддержка удаления редких категорий.
'if_binary'
categories categories: 'auto' или список массивоподобных объектов, по умолчанию='auto'

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

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

Используемые категории можно найти в атрибуте ``categories_``.

.. versionadded:: 0.20
'auto'
sparse_output sparse_output: bool, по умолчанию=True

Если ``True``, возвращает разреженную матрицу/массив SciPy
в формате "Compressed Sparse Row" (CSR).

.. versionadded:: 1.2
Параметр `sparse` переименован в `sparse_output`
True
dtype dtype: числовой тип, по умолчанию=np.float64

Желаемый тип данных результата.
<class 'numpy.float64'>
handle_unknown handle_unknown: {'error', 'ignore', 'infrequent_if_exist', 'warn'}, по умолчанию='error'

Задает способ обработки неизвестных категорий во время :meth:`transform`.

- 'error' : вызвать ошибку, если во время преобразования обнаружена неизвестная категория.
- 'ignore' : при обнаружении неизвестной категории во время
преобразования полученные столбцы one-hot-кодирования для этого признака
будут заполнены нулями. При обратном преобразовании
неизвестная категория будет обозначена как None.
- 'infrequent_if_exist' : при обнаружении неизвестной категории
во время преобразования полученные столбцы one-hot-кодирования для этого
признака будут соответствовать редкой категории, если она существует.
Редкая категория будет отображаться в последнюю позицию
кодирования. При обратном преобразовании неизвестная категория будет
сопоставлена с категорией, обозначенной `'infrequent'`, если она существует. Если
категория `'infrequent'` не существует, то :meth:`transform` и
:meth:`inverse_transform` будут обрабатывать неизвестную категорию так же, как
при `handle_unknown='ignore'`. Редкие категории определяются на основе
`min_frequency` и `max_categories`. Подробнее см. в
:ref:`руководстве пользователя <encoder_infrequent_categories>`.
- 'warn' : при обнаружении неизвестной категории во время преобразования
выдается предупреждение, после чего кодирование выполняется так, как описано для
`handle_unknown="infrequent_if_exist"`.

.. versionchanged:: 1.1
Возможность `'infrequent_if_exist'` добавлена для автоматической обработки неизвестных
и редких категорий.

.. versionadded:: 1.6
Возможность `"warn"` добавлена в версии 1.6.
'error'
min_frequency min_frequency: int или float, по умолчанию=None

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

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

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

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

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

.. versionadded:: 1.1
Подробнее см. в :ref:`руководстве пользователя <encoder_infrequent_categories>`.
None
feature_name_combiner feature_name_combiner: "concat" или вызываемый объект, по умолчанию="concat"

Вызываемый объект с сигнатурой `def callable(input_feature, category)`, возвращающий
строку. Используется для создания имен признаков, возвращаемых методом
:meth:`get_feature_names_out`.

`"concat"` объединяет закодированное имя признака и категорию с помощью
`feature + "_" + str(category)`. Например, для признака X со значениями 1, 6, 7 создаются
имена признаков `X_1, X_6, X_7`.

.. versionadded:: 1.3
'concat'
Обученные атрибуты
Имя Тип Значение
categories_ categories_: список массивов

Категории каждого признака, определенные во время обучения
(в порядке признаков в X и соответствующие выходным данным
``transform``). Включает категорию, указанную в ``drop``
(если она задана).
list [array(['Hispa... dtype=object), array(['Cleri... dtype=object), array(['Const... dtype=object), array(['Marri... dtype=object), ...]
drop_idx_ drop_idx_: массив формы (n_features,)

- ``drop_idx_[i]`` — индекс удаляемой категории в ``categories_[i]``
для каждого признака.
- ``drop_idx_[i] = None``, если из признака с индексом ``i`` не нужно
удалять ни одной категории, например когда задано `drop='if_binary'`, а
признак не является бинарным.
- ``drop_idx_ = None``, если необходимо сохранить все преобразованные
признаки.

Если редкие категории включены заданием для `min_frequency` или
`max_categories` значения, отличного от значения по умолчанию, и `drop_idx[i]` соответствует
редкой категории, удаляется вся редкая категория.

.. versionchanged:: 0.23
Добавлена возможность содержать значения `None`.
ndarray[object](7,) [None,None,None,...,0,0,0]
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

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

.. versionadded:: 1.0
ndarray[object](7,) ['RACE','OCCUPATION','SECTOR',...,'UNION','SEX','SOUTH']
n_features_in_ n_features_in_: int

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

.. versionadded:: 1.0
int 7
16 признаков
RACE_Hispanic
RACE_Other
RACE_White
OCCUPATION_Clerical
OCCUPATION_Management
OCCUPATION_Other
OCCUPATION_Professional
OCCUPATION_Sales
OCCUPATION_Service
SECTOR_Construction
SECTOR_Manufacturing
SECTOR_Other
MARR_Unmarried
UNION_not_member
SEX_male
SOUTH_yes
['EDUCATION', 'EXPERIENCE', 'AGE']
Параметры
copy copy: bool, по умолчанию=True

Если False, старается избежать копирования и выполняет масштабирование на месте.
Это не всегда гарантируется; например, если данные
не являются массивом NumPy или разреженной матрицей scipy.sparse CSR, все же может быть
возвращена копия.
True
with_mean with_mean: bool, по умолчанию=True

Если True, центрировать данные перед масштабированием.
Это не работает (и приводит к исключению) при применении к
разреженным матрицам, поскольку центрирование требует создания плотной
матрицы, которая в типичных случаях использования может оказаться слишком большой для размещения в
памяти.
True
with_std with_std: bool, по умолчанию=True

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

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

.. versionadded:: 1.0
ndarray[object](3,) ['EDUCATION','EXPERIENCE','AGE']
mean_ mean_: ndarray формы (n_features,) или None

Среднее значение каждого признака в обучающем наборе.
Равно ``None``, когда ``with_mean=False`` и ``with_std=False``.
ndarray[float64](3,) [13.04,18.19,37.23]
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 3
n_samples_seen_ n_samples_seen_: int или ndarray формы (n_features,)

Количество образцов, обработанных оценщиком для каждого признака.
Если отсутствующие образцы отсутствуют, ``n_samples_seen`` будет целым
числом, в противном случае это будет массив типа int. Если используются
`sample_weights`, значение будет числом с плавающей точкой (при отсутствии пропущенных данных)
или массивом типа float, содержащим сумму весов, учтенных на данный момент.
Сбрасывается при новых вызовах fit, но увеличивается при вызовах
``partial_fit``.
float64 400
scale_ scale_: ndarray формы (n_features,) или None

Масштабирование данных для каждого признака, обеспечивающее нулевое среднее и единичную
дисперсию. Обычно вычисляется с помощью `np.sqrt(var_)`. Если
дисперсия равна нулю, невозможно обеспечить единичную дисперсию, поэтому данные остаются
без изменений, а коэффициент масштабирования равен 1. `scale_` равен `None`,
если `with_std=False`.

.. versionadded:: 0.17
*scale_*
ndarray[float64](3,) [ 2.63,12.38,11.76]
var_ var_: ndarray формы (n_features,) или None

Дисперсия каждого признака в обучающем наборе. Используется для вычисления
`scale_`. Равно ``None``, если ``with_mean=False`` и
``with_std=False``.
ndarray[float64](3,) [ 6.9 ,153.23,138.4 ]
3 признака
EDUCATION
EXPERIENCE
AGE
19 признаков
onehotencoder__RACE_Hispanic
onehotencoder__RACE_Other
onehotencoder__RACE_White
onehotencoder__OCCUPATION_Clerical
onehotencoder__OCCUPATION_Management
onehotencoder__OCCUPATION_Other
onehotencoder__OCCUPATION_Professional
onehotencoder__OCCUPATION_Sales
onehotencoder__OCCUPATION_Service
onehotencoder__SECTOR_Construction
onehotencoder__SECTOR_Manufacturing
onehotencoder__SECTOR_Other
onehotencoder__MARR_Unmarried
onehotencoder__UNION_not_member
onehotencoder__SEX_male
onehotencoder__SOUTH_yes
standardscaler__EDUCATION
standardscaler__EXPERIENCE
standardscaler__AGE
Параметры
regressor regressor: object, default=None

Объект регрессора, например производный от
:class:`~sklearn.base.RegressorMixin`. Этот регрессор будет
автоматически клонироваться перед каждым обучением. Если `regressor is
None`, создаётся и используется :class:`~sklearn.linear_model.LinearRegression`.
Ridge(alpha=1e-10)
func func: function, default=None

Функция, применяемая к `y` перед передачей в :meth:`fit`. Нельзя задавать
одновременно с `transformer`. Если `func is None`, используется
тождественная функция. Если задан параметр `func`, также необходимо
задать `inverse_func`. Функция должна возвращать двумерный массив.
<ufunc 'log10'>
inverse_func inverse_func: function, default=None

Функция, применяемая к предсказаниям регрессора. Нельзя задавать одновременно
с `transformer`. Обратная функция возвращает предсказания в то же
пространство, что и исходные обучающие метки. Если задан параметр
`inverse_func`, также необходимо задать `func`. Обратная функция
должна возвращать двумерный массив.
<ufunc 'exp10'>
transformer transformer: object, default=None

Объект преобразователя, например производный от
:class:`~sklearn.base.TransformerMixin`. Нельзя задавать одновременно
с `func` и `inverse_func`. Если `transformer is None`, а также
`func` и `inverse_func` не заданы, преобразователь будет тождественным.
Обратите внимание: во время обучения преобразователь будет клонирован.
Кроме того, преобразователь требует, чтобы `y` был массивом numpy.
None
check_inverse check_inverse: bool, default=True

Проверять ли, что применение `transform`, а затем `inverse_transform`,
или `func`, а затем `inverse_func`, возвращает исходные целевые значения.
True
Обученные атрибуты
Имя Тип Значение
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 19
regressor_ regressor_: object

Обученный регрессор.
Ridge Ridge(alpha=1e-10)
transformer_ transformer_: object

Преобразователь, используемый в :meth:`fit` и :meth:`predict`.
FunctionTransformer FunctionTrans...validate=True)
Параметры
alpha alpha: float or array-like of shape (n_targets,), default=1.0

Константа, умножающая член L2 и регулирующая силу регуляризации.
`alpha` должно быть неотрицательным числом с плавающей точкой, то есть принадлежать диапазону `[0, inf)`.

При `alpha = 0` целевая функция эквивалентна обычному методу наименьших
квадратов, решаемому объектом :class:`LinearRegression`. По численным
соображениям не рекомендуется использовать `alpha = 0` с объектом `Ridge`.
Вместо этого следует использовать объект :class:`LinearRegression`.

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

Пример влияния alpha на коэффициенты модели приведён в разделе
:ref:`sphx_glr_auto_examples_linear_model_plot_ridge_coeffs.py`.
1e-10
fit_intercept fit_intercept: bool, default=True

Следует ли обучать свободный член для этой модели. Если задать
значение false, свободный член не будет использоваться в вычислениях
(то есть предполагается, что ``X`` и ``y`` центрированы).
True
copy_X copy_X: bool, default=True

Если True, X будет скопирован; в противном случае он может быть перезаписан.
True
max_iter max_iter: int, default=None

Максимальное число итераций для решателя сопряжённых градиентов.
Для решателей 'sparse_cg' и 'lsqr' значение по умолчанию определяется
scipy.sparse.linalg. Для решателя 'sag' значение по умолчанию равно 1000.
Для решателя 'lbfgs' значение по умолчанию равно 15000.
None
tol tol: float, default=1e-4

Точность решения (`coef_`) определяется параметром `tol`, который
задаёт разные критерии сходимости для каждого решателя:

- 'svd': `tol` не влияет на результат.

- 'cholesky': `tol` не влияет на результат.

- 'sparse_cg': норма остатков меньше `tol`.

- 'lsqr': `tol` задаётся как atol и btol в scipy.sparse.linalg.lsqr,
которые определяют норму вектора остатков относительно норм матрицы и коэффициентов.

- 'sag' и 'saga': относительное изменение coef меньше `tol`.

- 'lbfgs': максимум абсолютного (проецированного) градиента=max|residuals|
меньше `tol`.

.. versionchanged:: 1.2
Значение по умолчанию изменено с 1e-3 на 1e-4 для согласованности с другими линейными
моделями.
0.0001
solver solver: {'auto', 'svd', 'cholesky', 'lsqr', 'sparse_cg', 'sag', 'saga', 'lbfgs'}, default='auto'

Решатель, используемый в вычислительных процедурах:

- 'auto' автоматически выбирает решатель на основе типа данных.

- 'svd' использует сингулярное разложение матрицы X для вычисления коэффициентов
Ridge. Это наиболее устойчивый решатель, особенно для вырожденных матриц — он устойчивее,
чем 'cholesky', но работает медленнее.

- 'cholesky' использует стандартную функцию :func:`scipy.linalg.solve` для
получения решения в замкнутой форме.

- 'sparse_cg' использует решатель сопряжённых градиентов из
:func:`scipy.sparse.linalg.cg`. Поскольку это итеративный алгоритм, он
лучше подходит, чем 'cholesky', для крупномасштабных данных
(можно задавать `tol` и `max_iter`).

- 'lsqr' использует специализированную процедуру регуляризованного метода наименьших квадратов
:func:`scipy.sparse.linalg.lsqr`. Это самый быстрый решатель, использующий итеративную
процедуру.

- 'sag' использует стохастический градиент с усреднением, а 'saga' —
его улучшенную несмещённую версию под названием SAGA. Оба метода также используют
итеративную процедуру и часто работают быстрее других решателей, если
одновременно велики n_samples и n_features. Обратите внимание, что быстрая сходимость 'sag' и
'saga' гарантируется только для признаков примерно одинакового масштаба.
Данные можно предварительно обработать с помощью масштабировщика из
:mod:`sklearn.preprocessing`.

- 'lbfgs' использует алгоритм L-BFGS-B, реализованный в
:func:`scipy.optimize.minimize`. Его можно использовать только при `positive`
со значением True.

Все решатели, кроме 'svd', поддерживают как плотные, так и разреженные данные. Однако только
'lsqr', 'sag', 'sparse_cg' и 'lbfgs' поддерживают разреженный ввод, если
`fit_intercept` имеет значение True.

.. versionadded:: 0.17
Решатель стохастического градиента с усреднением.
.. versionadded:: 0.19
Решатель SAGA.
'auto'
positive positive: bool, default=False

Если задано ``True``, коэффициенты принудительно принимают положительные значения.
В этом случае поддерживается только решатель 'lbfgs'.
False
random_state random_state: int, RandomState instance, default=None

Используется для перемешивания данных, если ``solver`` == 'sag' или 'saga'.
Подробности см. в :term:`Glossary <random_state>`.

.. versionadded:: 0.17
Параметр `random_state` добавлен для поддержки стохастического градиента с усреднением.
None
Обученные атрибуты
Имя Тип Значение
coef_ coef_: ndarray of shape (n_features,) or (n_targets, n_features)

Вектор(ы) весов.
ndarray[float64](19,) [-0.01,-0.01, 0.02,..., 0.14, 0.43,-0.36]
intercept_ intercept_: float or ndarray of shape (n_targets,)

Свободный член в функции принятия решения. Равен 0.0, если
``fit_intercept = False``.
float64 0.9677
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 19
n_iter_ n_iter_: None or ndarray of shape (n_targets,)

Фактическое число итераций для каждой целевой переменной. Доступно только для
решателей 'sag' и 'lsqr'. Другие решатели возвращают None.

.. versionadded:: 0.17
NoneType None
solver_ solver_: str

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

.. versionadded:: 1.5
str 'ch...ky'


Снова оценим качество полученной модели с помощью медианной абсолютной ошибки.

mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
    "MedAE on training set": f"{mae_train:.2f} $/hour",
    "MedAE on testing set": f"{mae_test:.2f} $/hour",
}

_, ax = plt.subplots(figsize=(5, 5))
display = PredictionErrorDisplay.from_predictions(
    y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Ridge model, small regularization")
for name, score in scores.items():
    ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()
Ridge model, small regularization

На этот раз для анализа коэффициентов масштабирование не требуется, поскольку оно было выполнено на этапе предварительной обработки.

coefs = pd.DataFrame(
    model[-1].regressor_.coef_,
    columns=["Coefficients importance"],
    index=feature_names,
)
coefs.plot.barh(figsize=(9, 7))
plt.title("Ridge model, small regularization, normalized variables")
plt.xlabel("Raw coefficient values")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)
Ridge model, small regularization, normalized variables

Теперь рассмотрим коэффициенты на нескольких фолдах кросс-валидации.

cv_model = cross_validate(
    model,
    X,
    y,
    cv=cv,
    return_estimator=True,
    n_jobs=2,
)
coefs = pd.DataFrame(
    [est[-1].regressor_.coef_ for est in cv_model["estimator"]], columns=feature_names
)
plt.figure(figsize=(9, 7))
sns.stripplot(data=coefs, orient="h", palette="dark:k", alpha=0.5)
sns.boxplot(data=coefs, orient="h", color="cyan", saturation=0.5, whis=10)
plt.axvline(x=0, color=".5")
plt.title("Coefficient variability")
plt.subplots_adjust(left=0.3)
Coefficient variability

Результат довольно похож на случай без нормализации.

Линейные модели с регуляризацией

На практике машинного обучения гребневая регрессия чаще используется с ненулевой регуляризацией.

Выше мы ограничили эту регуляризацию очень малым значением. Регуляризация улучшает обусловленность задачи и уменьшает дисперсию оценок. RidgeCV использует перекрёстную проверку, чтобы определить, какое значение параметра регуляризации (alpha) лучше всего подходит для предсказания.

from sklearn.linear_model import RidgeCV

alphas = np.logspace(-10, 10, 21)  # alpha values to be chosen from by cross-validation
model = make_pipeline(
    preprocessor,
    TransformedTargetRegressor(
        regressor=RidgeCV(alphas=alphas),
        func=np.log10,
        inverse_func=sp.special.exp10,
    ),
)
model.fit(X_train, y_train)
Pipeline(steps=[('columntransformer',
                 ColumnTransformer(transformers=[('onehotencoder',
                                                  OneHotEncoder(drop='if_binary'),
                                                  ['RACE', 'OCCUPATION',
                                                   'SECTOR', 'MARR', 'UNION',
                                                   'SEX', 'SOUTH']),
                                                 ('standardscaler',
                                                  StandardScaler(),
                                                  ['EDUCATION', 'EXPERIENCE',
                                                   'AGE'])])),
                ('transformedtargetregressor',
                 TransformedTargetRegressor(func=<ufunc 'log10'>,
                                            inverse_func=<ufunc 'exp10'>,
                                            regressor=RidgeCV(alphas=array([1.e-10, 1.e-09, 1.e-08, 1.e-07, 1.e-06, 1.e-05, 1.e-04, 1.e-03,
       1.e-02, 1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05,
       1.e+06, 1.e+07, 1.e+08, 1.e+09, 1.e+10]))))])
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте этому блокноту.
HTML-представление невозможно отобразить на GitHub; попробуйте открыть эту страницу с помощью nbviewer.org.
Параметры
steps steps: список кортежей

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

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

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

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

.. добавлено в версии:: 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
Обученные атрибуты
Имя Тип Значение
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

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

.. добавлено в версии:: 1.0
ndarray[object](10,) ['EDUCATION','SOUTH','SEX',...,'OCCUPATION','SECTOR','MARR']
n_features_in_ n_features_in_: int

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

.. добавлено в версии:: 0.24
int 10
Параметры
transformers transformers: список кортежей

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

name : str
Как и в Pipeline и FeatureUnion, это позволяет задавать преобразователь и
его параметры с помощью ``set_params`` и выполнять поиск в сеточном
поиске.
transformer : {'drop', 'passthrough'} или оцениватель
Оцениватель должен поддерживать :term:`fit` и :term:`transform`.
Также допускаются специальные строки 'drop' и 'passthrough',
указывающие соответственно на удаление столбцов или передачу их без
преобразования.
columns : str, массивоподобный объект из str, int, массивоподобный объект из int, массивоподобный объект из bool, slice или вызываемый объект
Индексирует данные по второй оси. Целые числа интерпретируются как
позиции столбцов, а строки могут ссылаться на столбцы DataFrame
по имени. Если ``transformer`` ожидает, что X будет одномерным массивоподобным объектом (вектором),
следует использовать скалярную строку или целое число;
в противном случае преобразователю будет передан двумерный массив.
Вызываемому объекту передаются входные данные `X`, и он может вернуть любое из
перечисленного выше. Чтобы выбрать несколько столбцов по имени или типу данных, можно использовать
:obj:`make_column_selector`.
[('onehotencoder', ...), ('standardscaler', ...)]
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
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` из стандартной библиотеки.

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

.. изменено в версии:: 1.6
`verbose_feature_names_out` может быть вызываемым объектом или строкой для форматирования.
True
Обученные атрибуты
Имя Тип Значение
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

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

.. добавлено в версии:: 1.0
ndarray[object](10,) ['EDUCATION','SOUTH','SEX',...,'OCCUPATION','SECTOR','MARR']
n_features_in_ n_features_in_: int

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

.. добавлено в версии:: 0.24
int 10
named_transformers_ named_transformers_: :class:`~sklearn.utils.Bunch`

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

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

.. добавлено в версии:: 1.0
dict {'on...er': slice(0, 16, None), 're...er': slice(0, 0, None), 'st...er': slice(16, 19, 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)``.

.. добавлено в версии:: 1.7
Теперь формат оставшихся столбцов по возможности соответствует формату остальных
преобразователей: если все столбцы заданы именами столбцов (`str`),
оставшиеся столбцы сохраняются как имена столбцов; если все столбцы заданы
массивами масок (`bool`), оставшиеся столбцы также сохраняются в этом формате; во всех остальных случаях
оставшиеся столбцы сохраняются как индексы (`int`).
list [('on...er', OneHotEncoder...p='if_binary'), ['RACE', 'OC...ON', 'SECTOR', 'MARR', ...]), ('st...er', StandardScaler(), ['ED...ON', 'EX...CE', 'AGE'])]
['RACE', 'OCCUPATION', 'SECTOR', 'MARR', 'UNION', 'SEX', 'SOUTH']
Параметры
drop drop: {'first', 'if_binary'} или массивоподобная структура формы (n_features,), по умолчанию=None

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

Однако удаление одной категории нарушает симметрию исходного
представления и поэтому может привести к смещению в последующих моделях,
например в моделях линейной классификации или регрессии со штрафом.

- None : сохранить все признаки (значение по умолчанию).
- 'first' : удалить первую категорию каждого признака. Если присутствует
только одна категория, признак будет удален полностью.
- 'if_binary' : удалить первую категорию каждого признака с двумя
категориями. Признаки с 1 или более чем 2 категориями
остаются без изменений.
- array : ``drop[i]`` — категория признака ``X[:, i]``, которую
следует удалить.

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

.. versionadded:: 0.21
Параметр `drop` добавлен в версии 0.21.

.. versionchanged:: 0.23
Параметр `drop='if_binary'` добавлен в версии 0.23.

.. versionchanged:: 1.1
Добавлена поддержка удаления редко встречающихся категорий.
'if_binary'
categories categories: 'auto' или список массивоподобных объектов, по умолчанию='auto'

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

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

Используемые категории можно найти в атрибуте ``categories_``.

.. versionadded:: 0.20
'auto'
sparse_output sparse_output: bool, по умолчанию=True

Если ``True``, возвращает разреженную матрицу/массив SciPy
в формате "Compressed Sparse Row" (CSR).

.. versionadded:: 1.2
`sparse` переименован в `sparse_output`
True
dtype dtype: числовой тип, по умолчанию=np.float64

Желаемый тип данных выходных значений.
<class 'numpy.float64'>
handle_unknown handle_unknown: {'error', 'ignore', 'infrequent_if_exist', 'warn'}, по умолчанию='error'

Задает способ обработки неизвестных категорий во время :meth:`transform`.

- 'error' : вызывать ошибку, если при преобразовании встречается неизвестная категория.
- 'ignore' : если встречается неизвестная категория, результирующие столбцы
one-hot-кодирования этого признака будут состоять из нулей. При обратном
преобразовании неизвестная категория обозначается как None.
- 'infrequent_if_exist' : если при преобразовании встречается неизвестная
категория, результирующие столбцы one-hot-кодирования этого признака
будут соответствовать редко встречающейся категории, если она существует.
Редко встречающаяся категория будет расположена последней в кодировании.
При обратном преобразовании неизвестная категория будет сопоставлена
с категорией, обозначенной `'infrequent'`, если она существует. Если
категория `'infrequent'` отсутствует, :meth:`transform` и
:meth:`inverse_transform` обработают неизвестную категорию так же, как
при `handle_unknown='ignore'`. Редко встречающиеся категории определяются
параметрами `min_frequency` и `max_categories`. Подробнее см. в
:ref:`руководстве пользователя <encoder_infrequent_categories>`.
- 'warn' : при обнаружении неизвестной категории во время преобразования
выдается предупреждение, а затем кодирование выполняется так, как описано
для `handle_unknown="infrequent_if_exist"`.

.. versionchanged:: 1.1
Параметр `'infrequent_if_exist'` добавлен для автоматической обработки
неизвестных и редко встречающихся категорий.

.. versionadded:: 1.6
Параметр `"warn"` добавлен в версии 1.6.
'error'
min_frequency min_frequency: int или float, по умолчанию=None

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

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

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

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

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

.. versionadded:: 1.1
Подробнее см. в :ref:`руководстве пользователя <encoder_infrequent_categories>`.
None
feature_name_combiner feature_name_combiner: "concat" или вызываемый объект, по умолчанию="concat"

Вызываемый объект с сигнатурой `def callable(input_feature, category)`, возвращающий
строку. Используется для создания имен признаков, возвращаемых методом
:meth:`get_feature_names_out`.

`"concat"` объединяет имя закодированного признака и категорию с помощью
`feature + "_" + str(category)`. Например, для признака X со значениями 1, 6, 7 создаются
имена признаков `X_1, X_6, X_7`.

.. versionadded:: 1.3
'concat'
Обученные атрибуты
Имя Тип Значение
categories_ categories_: список массивов

Категории каждого признака, определенные во время обучения
(в порядке признаков в X и в соответствии с выходными данными
``transform``). Включает категорию, указанную в ``drop``
(если она задана).
list [array(['Hispa... dtype=object), array(['Cleri... dtype=object), array(['Const... dtype=object), array(['Marri... dtype=object), ...]
drop_idx_ drop_idx_: массив формы (n_features,)

- ``drop_idx_[i]`` — индекс категории в ``categories_[i]``,
которую следует удалить для каждого признака.
- ``drop_idx_[i] = None``, если для признака с индексом ``i``
не нужно удалять категорию, например, когда задано `drop='if_binary'`, а
признак не является бинарным.
- ``drop_idx_ = None``, если нужно сохранить все преобразованные
признаки.

Если редко встречающиеся категории включены заданием для `min_frequency` или
`max_categories` значения, отличного от значения по умолчанию, и `drop_idx[i]` соответствует
редко встречающейся категории, удаляется вся такая категория.

.. versionchanged:: 0.23
Добавлена возможность содержать значения `None`.
ndarray[object](7,) [None,None,None,...,0,0,0]
feature_names_in_ feature_names_in_: ndarray формы (`n_features_in_`,)

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

.. versionadded:: 1.0
ndarray[object](7,) ['RACE','OCCUPATION','SECTOR',...,'UNION','SEX','SOUTH']
n_features_in_ n_features_in_: int

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

.. versionadded:: 1.0
int 7
16 признаков
RACE_Hispanic
RACE_Other
RACE_White
OCCUPATION_Clerical
OCCUPATION_Management
OCCUPATION_Other
OCCUPATION_Professional
OCCUPATION_Sales
OCCUPATION_Service
SECTOR_Construction
SECTOR_Manufacturing
SECTOR_Other
MARR_Unmarried
UNION_not_member
SEX_male
SOUTH_yes
['EDUCATION', 'EXPERIENCE', 'AGE']
Параметры
copy copy: bool, по умолчанию=True

Если False, пытается избежать копирования и масштабировать данные на месте.
Это не всегда гарантирует обработку на месте; например, если данные
не являются массивом NumPy или разреженной матрицей scipy.sparse CSR,
может быть возвращена копия.
True
with_mean with_mean: bool, по умолчанию=True

Если True, центрирует данные перед масштабированием.
Этот параметр нельзя использовать для разреженных матриц (при попытке
будет вызвано исключение), поскольку центрирование требует создания плотной
матрицы, которая в типичных случаях использования может оказаться слишком
большой для размещения в памяти.
True
with_std with_std: bool, по умолчанию=True

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

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

.. versionadded:: 1.0
ndarray[object](3,) ['EDUCATION','EXPERIENCE','AGE']
mean_ mean_: ndarray формы (n_features,) или None

Среднее значение каждого признака в обучающем наборе.
Равно ``None``, если ``with_mean=False`` и ``with_std=False``.
ndarray[float64](3,) [13.04,18.19,37.23]
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 3
n_samples_seen_ n_samples_seen_: int или ndarray формы (n_features,)

Число обработанных оценивателем выборок для каждого признака.
Если пропущенных выборок нет, ``n_samples_seen`` будет целым числом,
в противном случае это будет массив типа int. Если используются
`sample_weights`, значение будет числом с плавающей точкой (при отсутствии пропущенных данных)
или массивом типа float, содержащим сумму весов, учтенных на данный момент.
Сбрасывается при новых вызовах fit, но увеличивается при вызовах
``partial_fit``.
float64 400
scale_ scale_: ndarray формы (n_features,) или None

Относительный масштаб данных для каждого признака, обеспечивающий нулевое среднее и единичную
дисперсию. Обычно вычисляется с помощью `np.sqrt(var_)`. Если дисперсия
равна нулю, добиться единичной дисперсии невозможно, поэтому данные остаются
без изменений, а коэффициент масштабирования равен 1. `scale_` равно `None`,
если `with_std=False`.

.. versionadded:: 0.17
*scale_*
ndarray[float64](3,) [ 2.63,12.38,11.76]
var_ var_: ndarray формы (n_features,) или None

Дисперсия каждого признака в обучающем наборе. Используется для вычисления
`scale_`. Равно ``None``, если ``with_mean=False`` и
``with_std=False``.
ndarray[float64](3,) [ 6.9 ,153.23,138.4 ]
3 признака
EDUCATION
EXPERIENCE
AGE
19 признаков
onehotencoder__RACE_Hispanic
onehotencoder__RACE_Other
onehotencoder__RACE_White
onehotencoder__OCCUPATION_Clerical
onehotencoder__OCCUPATION_Management
onehotencoder__OCCUPATION_Other
onehotencoder__OCCUPATION_Professional
onehotencoder__OCCUPATION_Sales
onehotencoder__OCCUPATION_Service
onehotencoder__SECTOR_Construction
onehotencoder__SECTOR_Manufacturing
onehotencoder__SECTOR_Other
onehotencoder__MARR_Unmarried
onehotencoder__UNION_not_member
onehotencoder__SEX_male
onehotencoder__SOUTH_yes
standardscaler__EDUCATION
standardscaler__EXPERIENCE
standardscaler__AGE
Параметры
regressor regressor: object, default=None

Объект регрессора, например производный от
:class:`~sklearn.base.RegressorMixin`. Этот регрессор будет
автоматически клонироваться перед каждым обучением. Если `regressor is
None`, создаётся и используется :class:`~sklearn.linear_model.LinearRegression`.
RidgeCV(alpha...+09, 1.e+10]))
func func: function, default=None

Функция, применяемая к `y` перед передачей в :meth:`fit`. Не может быть задана
одновременно с `transformer`. Если `func is None`, используется тождественная функция. Если задан `func`, необходимо также
указать `inverse_func`. Функция должна возвращать двумерный массив.
<ufunc 'log10'>
inverse_func inverse_func: function, default=None

Функция, применяемая к предсказаниям регрессора. Не может быть задана
одновременно с `transformer`. Обратная функция используется для возвращения
предсказаний в то же пространство, что и исходные обучающие метки. Если
задана `inverse_func`, необходимо также указать `func`. Обратная
функция должна возвращать двумерный массив.
<ufunc 'exp10'>
transformer transformer: object, default=None

Объект преобразователя, например производный от
:class:`~sklearn.base.TransformerMixin`. Не может быть задан одновременно
с `func` и `inverse_func`. Если `transformer is None`, а также не заданы
`func` и `inverse_func`, преобразователь будет тождественным.
Обратите внимание, что преобразователь будет клонирован во время обучения.
Кроме того, преобразователь ограничивает `y` типом массива numpy.
None
check_inverse check_inverse: bool, default=True

Проверять ли, что применение `transform` с последующим `inverse_transform`
или `func` с последующим `inverse_func` возвращает исходные целевые значения.
True
Обученные атрибуты
Имя Тип Значение
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 19
regressor_ regressor_: object

Обученный регрессор.
RidgeCV RidgeCV(alpha...+09, 1.e+10]))
transformer_ transformer_: object

Преобразователь, использованный в :meth:`fit` и :meth:`predict`.
FunctionTransformer FunctionTrans...validate=True)
Параметры
alphas alphas: array-like of shape (n_alphas,), default=(0.1, 1.0, 10.0)

Массив значений alpha для проверки.
Сила регуляризации; значение должно быть положительным числом с плавающей точкой. Регуляризация
улучшает обусловленность задачи и снижает дисперсию
оценок. Большие значения означают более сильную регуляризацию.
В других линейных моделях, например
:class:`~sklearn.linear_model.LogisticRegression` или
:class:`~sklearn.svm.LinearSVC`, alpha соответствует ``1 / (2C)``.
При использовании перекрёстной проверки «исключение одного объекта» значения alpha должны быть строго положительными.

Пример влияния силы регуляризации на коэффициенты модели см. в разделе
:ref:`sphx_glr_auto_examples_linear_model_plot_ridge_coeffs.py`.
array([1.e-10...e+09, 1.e+10])
fit_intercept fit_intercept: bool, default=True

Вычислять ли свободный член этой модели. Если задано
значение false, свободный член не будет использоваться в вычислениях
(то есть предполагается, что данные центрированы).
True
scoring scoring: str, callable, default=None

Метод оценки для перекрёстной проверки. Возможные варианты:

- str: варианты см. в разделе :ref:`scoring_string_names`.
- callable: вызываемый объект оценщика (например, функция) с сигнатурой
``scorer(estimator, X, y)``. Подробности см. в разделе :ref:`scoring_callable`.
- `None`: отрицательная :ref:`среднеквадратичная ошибка <mean_squared_error>`, если cv равно
None (то есть при перекрёстной проверке «исключение одного объекта»), или
:ref:`коэффициент детерминации <r2_score>` (:math:`R^2`) в противном случае.
None
cv cv: int, cross-validation generator or an iterable, default=None

Определяет стратегию разбиения для перекрёстной проверки.
Возможные значения cv:

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

Для целочисленных значений и None, если ``y`` — бинарная или многоклассовая переменная,
используется :class:`~sklearn.model_selection.StratifiedKFold`, иначе —
:class:`~sklearn.model_selection.KFold`.

О различных стратегиях перекрёстной проверки, которые можно использовать здесь,
см. :ref:`руководство пользователя <cross_validation>`.
None
gcv_mode gcv_mode: {'auto', 'svd', 'eigen'}, default='auto'

Флаг, указывающий, какую стратегию использовать при выполнении
перекрёстной проверки «исключение одного объекта». Возможные варианты::

'auto' : то же, что 'eigen'
'svd' : использовать сингулярное разложение матрицы X, если X — плотная матрица,
при разреженной X переключиться на 'eigen'
'eigen' : использовать разложение матрицы X X' по собственным значениям, если n_samples <= n_features,
или X' X, если n_features < n_samples

Режим 'auto' используется по умолчанию и выбирает более быстрый
вариант в зависимости от формы и разреженности обучающих данных.
None
store_cv_results store_cv_results: bool, default=False

Флаг, указывающий, нужно ли сохранять значения перекрёстной проверки для
каждого alpha в атрибуте ``cv_results_`` (см.
ниже). Этот флаг совместим только с ``cv=None`` (то есть при использовании
перекрёстной проверки «исключение одного объекта»).

.. versionchanged:: 1.5
Имя параметра изменено с `store_cv_values` на `store_cv_results`.
False
alpha_per_target alpha_per_target: bool, default=False

Флаг, указывающий, нужно ли подбирать значение alpha (выбираемое из списка параметров
`alphas`) отдельно для каждой целевой переменной (в задачах с несколькими выходами:
несколькими целевыми переменными для предсказания). Если задано `True`, после
обучения атрибут `alpha_` будет содержать значение для каждой целевой переменной.
Если задано `False`, для всех целевых переменных используется одно значение alpha.
Этот флаг совместим только с ``cv=None`` (то есть при использовании
перекрёстной проверки «исключение одного объекта»).

.. versionadded:: 0.24
False
Обученные атрибуты
Имя Тип Значение
alpha_ alpha_: float or ndarray of shape (n_targets,)

Оценённый параметр регуляризации или, если ``alpha_per_target=True``,
оценённый параметр регуляризации для каждой целевой переменной.
float 10
best_score_ best_score_: float or ndarray of shape (n_targets,)

Оценка базового оценщика с лучшим значением alpha или,
если ``alpha_per_target=True``, оценка для каждой целевой переменной.

.. versionadded:: 0.23
float64 -0.03611
coef_ coef_: ndarray of shape (n_features) or (n_targets, n_features)

Вектор(ы) весов.
ndarray[float64](19,) [-0.01,-0.01, 0.02,..., 0.06, 0.02, 0.03]
intercept_ intercept_: float or ndarray of shape (n_targets,)

Свободный член в функции принятия решения. Равен 0.0, если
``fit_intercept = False``.
float64 0.9579
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 19


Сначала проверим, какое значение \(\alpha\) было выбрано.

model[-1].regressor_.alpha_
10.0

Затем проверим качество предсказаний.

mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
    "MedAE on training set": f"{mae_train:.2f} $/hour",
    "MedAE on testing set": f"{mae_test:.2f} $/hour",
}

_, ax = plt.subplots(figsize=(5, 5))
display = PredictionErrorDisplay.from_predictions(
    y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Ridge model, optimum regularization")
for name, score in scores.items():
    ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()
Ridge model, optimum regularization

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

coefs = pd.DataFrame(
    model[-1].regressor_.coef_,
    columns=["Coefficients importance"],
    index=feature_names,
)
coefs.plot.barh(figsize=(9, 7))
plt.title("Ridge model, with regularization, normalized variables")
plt.xlabel("Raw coefficient values")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)
Ridge model, with regularization, normalized variables

Коэффициенты существенно различаются. Коэффициенты AGE и EXPERIENCE оба положительны, но теперь их влияние на предсказание меньше.

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

С другой стороны, веса, полученные с регуляризацией, более стабильны (см. раздел руководства пользователя Регрессия и классификация Ridge). Эта повышенная стабильность видна на графике, построенном по возмущённым данным в ходе перекрёстной проверки. Этот график можно сравнить с предыдущим.

cv_model = cross_validate(
    model,
    X,
    y,
    cv=cv,
    return_estimator=True,
    n_jobs=2,
)
coefs = pd.DataFrame(
    [est[-1].regressor_.coef_ for est in cv_model["estimator"]], columns=feature_names
)
plt.xlabel("Age coefficient")
plt.ylabel("Experience coefficient")
plt.grid(True)
plt.xlim(-0.4, 0.5)
plt.ylim(-0.4, 0.5)
plt.scatter(coefs["AGE"], coefs["EXPERIENCE"])
_ = plt.title("Co-variations of coefficients for AGE and EXPERIENCE across folds")
Co-variations of coefficients for AGE and EXPERIENCE across folds

Линейные модели с разреженными коэффициентами

Ещё один способ учитывать коррелирующие переменные в наборе данных — оценивать разреженные коэффициенты. В некотором смысле мы уже сделали это вручную, отбросив столбец AGE при предыдущей оценке Ridge.

Модели Lasso (см. раздел руководства пользователя Lasso) оценивают разреженные коэффициенты. LassoCV применяет перекрёстную проверку, чтобы определить, какое значение параметра регуляризации (alpha) лучше всего подходит для оценки модели.

from sklearn.linear_model import LassoCV

alphas = np.logspace(-10, 10, 21)  # alpha values to be chosen from by cross-validation
model = make_pipeline(
    preprocessor,
    TransformedTargetRegressor(
        regressor=LassoCV(alphas=alphas, max_iter=100_000),
        func=np.log10,
        inverse_func=sp.special.exp10,
    ),
)

_ = model.fit(X_train, y_train)

Сначала проверим, какое значение \(\alpha\) было выбрано.

model[-1].regressor_.alpha_
np.float64(0.001)

Затем проверим качество предсказаний.

mae_train = median_absolute_error(y_train, model.predict(X_train))
y_pred = model.predict(X_test)
mae_test = median_absolute_error(y_test, y_pred)
scores = {
    "MedAE on training set": f"{mae_train:.2f} $/hour",
    "MedAE on testing set": f"{mae_test:.2f} $/hour",
}

_, ax = plt.subplots(figsize=(6, 6))
display = PredictionErrorDisplay.from_predictions(
    y_test, y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.5}
)
ax.set_title("Lasso model, optimum regularization")
for name, score in scores.items():
    ax.plot([], [], " ", label=f"{name}: {score}")
ax.legend(loc="upper left")
plt.tight_layout()
Lasso model, optimum regularization

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

coefs = pd.DataFrame(
    model[-1].regressor_.coef_,
    columns=["Coefficients importance"],
    index=feature_names,
)
coefs.plot(kind="barh", figsize=(9, 7))
plt.title("Lasso model, optimum regularization, normalized variables")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)
Lasso model, optimum regularization, normalized variables

Модель Lasso обнаруживает корреляцию между AGE и EXPERIENCE и исключает одну из этих переменных ради качества предсказания.

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

Действительно, мы можем проверить изменчивость коэффициентов между фолдами.

cv_model = cross_validate(
    model,
    X,
    y,
    cv=cv,
    return_estimator=True,
    n_jobs=2,
)
coefs = pd.DataFrame(
    [est[-1].regressor_.coef_ for est in cv_model["estimator"]], columns=feature_names
)
plt.figure(figsize=(9, 7))
sns.stripplot(data=coefs, orient="h", palette="dark:k", alpha=0.5)
sns.boxplot(data=coefs, orient="h", color="cyan", saturation=0.5, whis=100)
plt.axvline(x=0, color=".5")
plt.title("Coefficient variability")
plt.subplots_adjust(left=0.3)
Coefficient variability

Мы видим, что значения коэффициентов AGE и EXPERIENCE сильно меняются в зависимости от фолда.

Ошибочная причинная интерпретация

Разработчики государственной политики могут захотеть узнать, как образование влияет на заработную плату, чтобы оценить, будет ли экономически целесообразна политика, призванная побудить людей получать больше образования. Хотя модели машинного обучения хорошо измеряют статистические связи, обычно они не способны выявлять причинно-следственные эффекты.

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

К сожалению, существуют, вероятно, ненаблюдаемые смешивающие переменные, которые завышают или занижают этот коэффициент. Смешивающая переменная — это переменная, которая влияет и на EDUCATION, и на WAGE. Одним из примеров такой переменной является способности. Предположительно, люди с более высокими способностями чаще получают образование и одновременно с этим с большей вероятностью зарабатывают больше за час при любом уровне образования. В этом случае способности создают положительное смещение из-за пропущенной переменной (OVB) для коэффициента EDUCATION, тем самым преувеличивая влияние образования на заработную плату.

Пример OVB из-за способностей на симулированных данных см. в разделе Неспособность машинного обучения выявлять причинно-следственные эффекты.

Выводы

  • Чтобы определить важность признаков, коэффициенты необходимо привести к одной и той же единице измерения. Масштабирование с использованием стандартного отклонения признака — полезная приближённая оценка.
  • Коэффициенты в многомерных линейных моделях отражают зависимость между заданным признаком и целевой переменной при условии, что остальные признаки фиксированы.
  • Коррелирующие признаки вызывают нестабильность коэффициентов линейных моделей, и их эффекты трудно надёжно разделить.
  • Разные линейные модели по-разному реагируют на корреляцию признаков, поэтому коэффициенты могут существенно различаться.
  • Анализ коэффициентов по фолдам цикла перекрёстной проверки позволяет оценить их стабильность.
  • Интерпретировать причинно-следственные связи сложно при наличии смешивающих эффектов. Если на связь между двумя переменными также влияет что-то ненаблюдаемое, следует с осторожностью делать выводы о причинности.

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_linear_model_coefficient_interpretation.ipynb

Download Python source code: plot_linear_model_coefficient_interpretation.py

Download zipped: plot_linear_model_coefficient_interpretation.zip

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

Коэффициенты Ridge в зависимости от L2-регуляризации

Неспособность машинного обучения выявлять причинно-следственные эффекты

График коэффициентов Ridge в зависимости от регуляризации

Влияние регуляризации модели на ошибку на обучающих и тестовых данных

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

Spec-Zone.ru

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