Распространённые ошибки в интерпретации коэффициентов линейных моделей
В линейных моделях целевое значение моделируется как линейная комбинация признаков (см. Линейные модели раздел Руководства пользователя для описания набора линейных моделей, доступных в scikit-learn). Коэффициенты в множественных линейных моделях представляют связь между данным признаком, \(X_i\) и целевая переменная, \(y\) , предполагая, что все остальные признаки остаются постоянными (условная зависимость ). Это отличается от построения \(X_i\) против \(y\) и подгонка линейной зависимости: в
этом случае все возможные значения других признаков учитываются в
оценке (маргинальная зависимость).
Этот пример даст некоторые подсказки по интерпретации коэффициентов в линейных
моделях, указывая на проблемы, возникающие, когда либо линейная модель не
подходит для описания набора данных, либо когда признаки коррелированы.
Примечание
Имейте в виду, что признаки \(X\) и результат \(y\) в целом являются результатом процесса генерации данных, который нам неизвестен. Модели машинного обучения обучаются для аппроксимации ненаблюдаемой математической функции, которая связывает \(X\) to \(y\) из выборочных данных. В
результате любая интерпретация, сделанная о модели, не обязательно
обобщается на истинный процесс генерации данных. Это особенно верно, когда
модель низкого качества или когда выборочные данные не репрезентативны для
генеральной совокупности.
Мы будем использовать данные из «Текущее обследование населения» с 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 dataframe.
Затем мы идентифицируем признаки X и цель y : столбец WAGE является нашей
целевой переменной (т.е. переменной, которую мы хотим предсказать).
X = survey . data [ survey . feature_names ]
X . describe ( include = "all" )
EDUCATION
SOUTH
SEX
ОПЫТ
UNION
AGE
RACE
OCCUPATION
SECTOR
MARR
count
534.000000
534
534
534.000000
534
534.000000
534
534
534
534
уникальный
NaN
2
2
NaN
2
NaN
3
6
3
2
верх
NaN
нет
мужской
NaN
not_member
NaN
White
Другие
Другие
Женат/Замужем
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
Обратите внимание, что набор данных содержит категориальные и числовые переменные. Нам нужно будет учесть это при предобработке набора данных в дальнейшем.
EDUCATION
SOUTH
SEX
ОПЫТ
UNION
AGE
RACE
OCCUPATION
SECTOR
MARR
0
8
нет
женский
21
not_member
35
Латиноамериканец
Другие
Производство
Женат/Замужем
1
9
нет
женский
42
not_member
57
White
Другие
Производство
Женат/Замужем
2
12
нет
мужской
1
not_member
19
White
Другие
Производство
Неженат/Незамужем
3
12
нет
мужской
4
not_member
22
White
Другие
Другие
Неженат/Незамужем
4
12
нет
мужской
17
not_member
35
White
Другие
Другие
Женат/Замужем
Наша цель для предсказания: заработная плата.
Заработная плата описывается как число с плавающей точкой в долларах в час.
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
Мы разделяем выборку на обучающий и тестовый наборы данных.
Только обучающий набор данных будет использоваться в следующем исследовательском анализе.
Это способ имитировать реальную ситуацию, когда прогнозы выполняются на неизвестной цели, и мы не хотим, чтобы наш анализ и решения были смещены знанием тестовых данных.
Сначала давайте получим некоторые представления, посмотрев на распределения переменных и
на попарные отношения между ними. Будут использоваться только числовые
переменные. На следующем графике каждая точка представляет образец.
train_dataset = X_train . copy ()
train_dataset . insert ( 0 , "WAGE" , y_train )
_ = sns . pairplot ( train_dataset , kind = "reg" , diag_kind = "kde" )
При внимательном рассмотрении распределения WAGE видно, что оно имеет
длинный хвост. По этой причине мы должны взять его логарифм,
чтобы приблизительно превратить его в нормальное распределение (линейные модели, такие как
ридж или лассо, лучше всего работают для нормального распределения ошибок).
ЗАРПЛАТА увеличивается, когда ОБРАЗОВАНИЕ увеличивается. Обратите внимание, что зависимость между ЗАРПЛАТОЙ и ОБРАЗОВАНИЕМ, представленная здесь, является маргинальной зависимостью, т.е. она описывает поведение конкретной переменной без фиксации остальных.
Также, EXPERIENCE и AGE сильно линейно коррелированы.
Машинно-обучающий конвейер
Для проектирования нашего конвейера машинного обучения мы сначала вручную
проверяем тип данных, с которыми работаем:
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-кодирование. Наш предобработчик будет:
применить one-hot кодирование (т.е. создать столбец для каждой категории) к категориальным столбцам, только для небинарных категориальных переменных;
в качестве первого подхода (мы увидим позже, как нормализация числовых значений повлияет на наше обсуждение), оставьте числовые значения как есть.
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.
Обработка набора данных
Сначала мы обучаем модель.
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=,
inverse_func=,
regressor=Ridge(alpha=1e-10)))]) В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы показать HTML-представление, или доверьтесь блокноту. На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
шаги
steps: список кортежей Список кортежей (имя шага, оценщик), которые должны быть соединены в цепочку последовательный порядок. Для совместимости с API scikit-learn, все шаги должен определять `fit`. Все не последние шаги также должны определять `transform`. См. :ref:`Комбинирование оценщиков ` для получения дополнительной информации.
[('columntransformer', ...), ('transformedtargetregressor', ...)]
transform_input
transform_input: list of str, default=None Имена параметров :term:`metadata`, которые должны быть преобразованы конвейер перед передачей его шагу, который его потребляет. Это позволяет преобразовывать некоторые входные аргументы для ``fit`` (кроме ``X``) для преобразования шагами конвейера до шага, который требует их. Требование определяется через :ref:`маршрутизацию метаданных `. Например, это можно использовать для передачи набора валидации через конвейер. Вы можете установить это только если включена маршрутизация метаданных, что вы можно включить, используя ``sklearn.set_config(enable_metadata_routing=True)``. .. versionadded:: 1.6
None
память
memory: строка или объект с интерфейсом joblib.Memory, по умолчанию=None Используется для кэширования обученных трансформеров конвейера. Последний шаг никогда не будет кэшироваться, даже если это трансформер. По умолчанию, никакие кэширование выполняется. Если задана строка, это путь к директория кэширования. Включение кэширования запускает клонирование преобразователей перед обучением. Следовательно, экземпляр трансформатора, переданный в конвейер не может быть проверен напрямую. Используйте атрибут `named_steps` или ``steps`` для проверки оценщиков внутри конвейера. Кэширование трансформеры выгодны, когда подгонка занимает много времени. См. :ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py` для примера о том, как включить кэширование.
None
verbose
verbose: bool, default=False Если True, затраченное время на обучение каждого шага будет выводиться по мере его выполнения. завершено.
False
columntransformer: ColumnTransformer
Параметры
преобразователи
transformers: список кортежей Список кортежей (имя, transformer, столбцы), определяющих объекты трансформеров, которые должны быть применены к подмножествам данных. name : str Как и в Pipeline и FeatureUnion, это позволяет преобразователю и его параметры могут быть установлены с помощью ``set_params`` и найдены в сетке поиск. transformer: {'drop', 'passthrough'} или estimator Оценщик должен поддерживать :term:`fit` и :term:`transform`. Специальные строки 'drop' и 'passthrough' принимаются как хорошо, чтобы указать, удалить столбцы или пропустить их непреобразованные, соответственно. столбцы : str, массив строк, int, массив int, массив bool, срез или вызываемый объект Индексирует данные по второй оси. Целые числа интерпретируются как позиционные столбцы, в то время как строки могут ссылаться на столбцы DataFrame по имени. Скалярная строка или целое число должны использоваться там, где ``transformer`` ожидает, что X будет одномерным array-like (вектором), иначе в преобразователь будет передан двумерный массив. Вызываемый объект получает входные данные `X` и может возвращать любой из выше. Чтобы выбрать несколько столбцов по имени или типу данных, можно использовать :obj:`make_column_selector`.
[('onehotencoder', ...)]
остаток
остаток: {'drop', 'passthrough'} или оценщик, по умолчанию='drop' По умолчанию только указанные столбцы в `transformers` являются преобразованы и объединены в выходных данных, а не указанные столбцы удаляются. (по умолчанию ``'drop'``). Указав ``remainder='passthrough'``, все оставшиеся столбцы, которые не были указаны в `transformers`, но присутствуют в переданных данных к `fit` будут автоматически переданы. Это подмножество столбцов объединяется с выходом преобразователей. Для датафреймов, дополнительные столбцы, не встречавшиеся во время `fit`, будут исключены из вывода `transform`. Установив ``remainder`` в качестве оценщика, оставшиеся неуказанные столбцы будут использовать оценщик ``remainder``. оценщик должен поддерживать :term:`fit` и :term:`transform`. Обратите внимание, что использование этой функции требует, чтобы столбцы DataFrame входные данные в :term:`fit` и :term:`transform` имеют одинаковый порядок.
'passthrough'
sparse_threshold
sparse_threshold: float, default=0.3 Если выход разных преобразователей содержит разреженные матрицы, они будут сложены в разреженную матрицу, если общая плотность составляет ниже этого значения. Используйте ``sparse_threshold=0``, чтобы всегда возвращать плотный. Когда преобразованный вывод состоит из всех плотных данных, результат будет плотным, и этот ключевой параметр будет проигнорирован.
0.3
n_jobs
n_jobs: int, default=None Количество параллельно выполняемых задач. ``None`` означает 1, если не в контексте :obj:`joblib.parallel_backend`. ``-1`` означает использование всех процессоров. См. :term:`Глоссарий ` для получения дополнительной информации.
None
transformer_weights
transformer_weights: dict, по умолчанию=None Мультипликативные веса для признаков на трансформер. Выходные данные преобразователь умножается на эти веса. Ключи — это имена преобразователей, значения весов.
None
verbose
verbose: bool, default=False Если True, затраченное время на подгонку каждого трансформатора будет печатается по завершении.
False
verbose_feature_names_out
verbose_feature_names_out: bool, str или Callable[[str, str], str], default=True - Если True, :meth:`ColumnTransformer.get_feature_names_out` добавит префикс все имена признаков с именем преобразователя, который их сгенерировал признак. Эквивалентно установке `verbose_feature_names_out="{transformer_name}__{feature_name}"`. - Если False, :meth:`ColumnTransformer.get_feature_names_out` не будет добавляет префикс к любым именам признаков и вызовет ошибку, если имена признаков отсутствуют уникальные. - Если ``Callable[[str, str], str]``, :meth:`ColumnTransformer.get_feature_names_out` переименует все признаки используя имя преобразователя. Первый аргумент вызываемого объекта - это имя трансформера и второй аргумент — имя признака. Возвращаемый строка будет новым именем признака. - Если ``str``, это должна быть строка, готовая к форматированию. Данная строка будет должны форматироваться с использованием двух имен полей: ``transformer_name`` и ``feature_name``. например, ``"{feature_name}__{transformer_name}"``. См. метод :meth:`str.format` из стандартной библиотеки для получения дополнительной информации. .. versionadded:: 1.0 .. versionchanged:: 1.6 `verbose_feature_names_out` может быть вызываемым объектом или строкой для форматирования.
False
force_int_remainder_cols
force_int_remainder_cols: bool, default=False Этот параметр не оказывает влияния. .. примечание:: Если вы не обращаетесь к списку столбцов для оставшихся столбцов в атрибуте `transformers_` после обучения, вам не нужно устанавливать этот параметр. .. versionadded:: 1.5 .. versionchanged:: 1.7 Значение по умолчанию для `force_int_remainder_cols` изменится с с `True` на `False` в версии 1.7. .. устарело:: 1.7 `force_int_remainder_cols` устарел и будет удалён в версии 1.9.
'устаревший'
Параметры
категории
категории: 'auto' или список массивоподобных объектов, по умолчанию='auto' Категории (уникальные значения) для каждого признака: - 'auto' : Автоматически определять категории из обучающих данных. - список: ``categories[i]`` содержит категории, ожидаемые в i-м столбец. Переданные категории не должны смешивать строки и числа значения в пределах одного признака и должны быть отсортированы в случае числовые значения. Используемые категории можно найти в атрибуте ``categories_``. .. versionadded:: 0.20
'auto'
drop
drop: {'first', 'if_binary'} или array-like формы (n_features,), default=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'
sparse_output
sparse_output: bool, default=True Когда ``True``, возвращает :class:`scipy.sparse.csr_matrix`, т.е. разреженная матрица в формате "Compressed Sparse Row" (CSR). .. versionadded:: 1.2 `sparse` был переименован в `sparse_output`
True
dtype
dtype: number type, default=np.float64 Желаемый тип данных выходных данных.
handle_unknown
handle_unknown: {'error', 'ignore', 'infrequent_if_exist', 'warn'}, default='error' Определяет способ обработки неизвестных категорий во время :meth:`transform`. - 'error': Вызвать ошибку, если во время преобразования присутствует неизвестная категория. - 'ignore' : Когда во время transform, результирующие one-hot кодированные столбцы для этого признака будут все нули. При обратном преобразовании неизвестная категория будет обозначаться как None. - 'infrequent_if_exist' : Когда встречается неизвестная категория во время преобразования, результирующие one-hot кодированные столбцы для этой признак будет отображаться в редкую категорию, если она существует. редкая категория будет отображена в последнюю позицию в кодировку. При обратном преобразовании неизвестная категория будет сопоставляется с категорией, обозначенной `'infrequent'`, если она существует. Если категория `'infrequent'` не существует, тогда :meth:`transform` и :meth:`inverse_transform` обработает неизвестную категорию как с `handle_unknown='ignore'`. Редкие категории существуют на основе `min_frequency` и `max_categories`. Подробнее в :ref:`Руководство пользователя `. - '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:`Руководстве пользователя `.
None
max_categories
max_categories: int, default=None Задает верхний предел количества выходных признаков для каждого входного особенность при рассмотрении редких категорий. Если есть редкие категории, `max_categories` включает категорию, представляющую редкие категории вместе с частыми категориями. Если `None`, нет ограничения на количество выходных признаков. .. versionadded:: 1.1 Подробнее в :ref:`Руководстве пользователя `.
None
feature_name_combiner
feature_name_combiner: "concat" или callable, по умолчанию="concat" Вызываемый объект с сигнатурой `def callable(input_feature, category)`, который возвращает string. Используется для создания имен признаков, возвращаемых :meth:`get_feature_names_out`. `"concat"` объединяет закодированное имя признака и категорию с `feature + "_" + str(category)`. Например, признак X со значениями 1, 6, 7 создает имена признаков `X_1, X_6, X_7`. .. versionadded:: 1.3
'concat'
transformedtargetregressor: TransformedTargetRegressor
Параметры
регрессор
regressor: объект, по умолчанию=None Объект регрессора, такой как производный от :class:`~sklearn.base.RegressorMixin`. Этот регрессор будет автоматически клонируется каждый раз перед обучением. Если `regressor` является None`, создаётся и используется :class:`~sklearn.linear_model.LinearRegression`.
Ridge(alpha=1e-10)
преобразователь
transformer: object, default=None Объект Estimator, такой как производный от :class:`~sklearn.base.TransformerMixin`. Нельзя устанавливать одновременно как `func` и `inverse_func`. Если `transformer is None`, а также `func` и `inverse_func`, преобразователь будет тождественным преобразователь. Обратите внимание, что преобразователь будет клонирован во время обучения. Кроме того, преобразователь ограничивает `y` массивом numpy.
None
функция
func: функция, по умолчанию=None Функция для применения к `y` перед передачей в :meth:`fit`. Не может быть установлена одновременно с `transformer`. Если `func is None`, используемая функция будет тождественная функция. Если задана `func`, то `inverse_func` также должна быть задана предоставлена. Функция должна возвращать двумерный массив.
inverse_func
inverse_func: функция, по умолчанию=None Функция для применения к предсказанию регрессора. Не может быть установлена в в то же время, что и `transformer`. Обратная функция используется для возврата предсказания в то же пространство исходных меток обучения. Если если установлен `inverse_func`, также необходимо указать `func`. Обратная функция должна возвращать двумерный массив.
check_inverse
check_inverse: bool, default=True Проверять ли, что `transform`, за которым следует `inverse_transform` или `func`, за которым следует `inverse_func`, приводит к исходным целевым значениям.
True
Параметры
alpha
alpha: {float, ndarray формы (n_targets,)}, default=1.0 Константа, умножающая L2-член, контролирующая регуляризацию сила. `alpha` должен быть неотрицательным float, т.е. в `[0, inf)`. Когда `alpha = 0`, целевая функция эквивалентна обычному методу наименьших квадратов квадратов, решаемых объектом :class:`LinearRegression`. Для числовых по причинам, использование `alpha = 0` с объектом `Ridge` не рекомендуется. Вместо этого следует использовать объект :class:`LinearRegression`. Если передаётся массив, предполагается, что штрафы специфичны для целевые переменные. Следовательно, они должны соответствовать по количеству.
1e-10
fit_intercept
fit_intercept: bool, по умолчанию=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|остатки| меньше, чем `tol`. .. versionchanged:: 1.2 Значение по умолчанию изменено с 1e-3 на 1e-4 для согласованности с другими линейными модели.
0.0001
solver
solver: {'auto', 'svd', 'cholesky', 'lsqr', 'sparse_cg', 'sag', 'saga', 'lbfgs'}, по умолчанию='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 solver.
'auto'
положительный
positive: bool, default=False При установке в ``True`` принудительно делает коэффициенты положительными. В этом случае поддерживается только решатель 'lbfgs'.
False
random_state
random_state: int, RandomState instance, default=None Используется, когда ``solver`` == 'sag' или 'saga' для перемешивания данных. См. :term:`Глоссарий ` для деталей. .. versionadded:: 0.17 `random_state` для поддержки Stochastic Average Gradient.
None
Затем мы проверяем производительность вычисленной модели, строя график ее прогнозов против фактических значений на тестовом наборе и вычисляя медианную абсолютную ошибку.
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 ()
Модель, полученная в результате обучения, далека от хорошей модели, способной делать точные прогнозы:
это очевидно при взгляде на график выше, где хорошие прогнозы
должны лежать на черной пунктирной линии.
В следующем разделе мы интерпретируем коэффициенты модели. При этом мы должны помнить, что любые выводы, которые мы делаем, относятся к построенной нами модели, а не к истинному (реальному) процессу генерации данных.
Интерпретация коэффициентов: важность масштаба
Прежде всего, мы можем взглянуть на значения коэффициентов подобранного нами регрессора.
feature_names = model [: - 1 ] . get_feature_names_out ()
coefs = pd . DataFrame (
model [ - 1 ] . regressor_ . coef_ ,
columns = [ "Coefficients" ],
index = feature_names ,
)
coefs
Коэффициенты
RACE_Hispanic
-0.013520
РАСА_Другая
-0.009077
RACE_White
0.022593
OCCUPATION_Clerical
0.000045
OCCUPATION_Management
0.090528
OCCUPATION_Other
-0.025102
OCCUPATION_Professional
0.071964
OCCUPATION_Sales
-0.046636
OCCUPATION_Service
-0.091053
SECTOR_Construction
-0.000198
SECTOR_Manufacturing
0.031255
SECTOR_Other
-0.031026
MARR_Unmarried
-0.032405
UNION_not_member
-0.117154
SEX_male
0.090808
SOUTH_yes
-0.033823
EDUCATION
0.054699
ОПЫТ
0.035005
AGE
-0.030867
Коэффициент AGE выражен в "долларах/час за прожитые годы", а коэффициент EDUCATION — в "долларах/час за годы образования". Такое представление коэффициентов имеет преимущество в том, что делает ясными практические предсказания модели: увеличение \(1\) год в ВОЗРАСТЕ
означает уменьшение на \(0.030867\) долларов/час, в то время как увеличение
\(1\) год в EDUCATION означает увеличение \(0.054699\)
долларов/час. С другой стороны, категориальные переменные (как UNION или SEX) — безразмерные числа, принимающие значение 0 или 1. Их коэффициенты выражены в долларах/час. Затем мы не можем сравнить величину разных коэффициентов, поскольку признаки имеют разные естественные масштабы и, следовательно, диапазоны значений из-за их разных единиц измерения. Это более заметно, если построить коэффициенты.
Действительно, из графика выше наиболее важным фактором в определении 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 )
Умножение коэффициентов на стандартное отклонение соответствующего признака привело бы все коэффициенты к одной единице измерения. Как мы увидим после это эквивалентно нормализации числовых переменных по их стандартному отклонению, как \(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 )
Теперь, когда коэффициенты масштабированы, их можно безопасно сравнивать.
Примечание
Почему график выше предполагает, что увеличение возраста приводит к
уменьшению заработной платы? Почему начальный pairplot говоря противоположное? Это различие — разница между маргинальной и условной зависимостью.
Приведённый выше график показывает зависимости между конкретным признаком и целевой переменной, когда все остальные признаки остаются постоянными, т.е. условные
зависимости . Увеличение AGE приведет к уменьшению WAGE при постоянстве всех других признаков. Напротив, увеличение EXPERIENCE приведет к увеличению WAGE при постоянстве всех других признаков. Также AGE, EXPERIENCE и EDUCATION — это три переменные, которые больше всего влияют на модель.
Интерпретация коэффициентов: осторожность в отношении причинности
Линейные модели — отличный инструмент для измерения статистической связи, но мы
должны быть осторожны при утверждениях о причинно-следственной связи, ведь
корреляция не всегда подразумевает причинность. Это особенно сложно в
социальных науках, потому что наблюдаемые переменные служат лишь прокси
для лежащего в основе причинного процесса.
В нашем конкретном случае мы можем рассматривать ОБРАЗОВАНИЕ человека как
прокси для его профессиональной пригодности, реальной переменной, которая нас интересует,
но которую мы не можем наблюдать. Мы, конечно, хотели бы думать, что более длительное пребывание в школе
увеличивает техническую компетентность, но также вполне возможно, что
причинность работает и в обратную сторону. То есть те, кто технически
компетентен, как правило, дольше остаются в школе.
Работодатель вряд ли будет заботиться о том, какой это случай (или если это смесь обоих),
пока он остаётся убеждённым, что человек с большим ОБРАЗОВАНИЕМ лучше подходит для работы, он будет готов платить более высокую ЗАРПЛАТУ.
Это смешение эффектов становится проблематичным при рассмотрении некоторых форм вмешательства, например, государственных субсидий на университетские степени или рекламных материалов, поощряющих людей получать высшее образование. Полезность этих мер может оказаться переоцененной, особенно если степень смешения сильна. Наша модель предсказывает \(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 )
Предобработка числовых переменных
Как сказано выше (см. «Машинно-обучающий конвейер ”), мы также можем выбрать масштабирование
числовых значений перед обучением модели.
Это может быть полезно, когда мы применяем аналогичное количество регуляризации ко всем из них
в гребневой регрессии.
Препроцессор переопределяется для вычитания среднего и масштабирования
переменных до единичной дисперсии.
Модель останется неизменной.
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=,
inverse_func=,
regressor=Ridge(alpha=1e-10)))]) В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы показать HTML-представление, или доверьтесь блокноту. На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
шаги
steps: список кортежей Список кортежей (имя шага, оценщик), которые должны быть соединены в цепочку последовательный порядок. Для совместимости с API scikit-learn, все шаги должен определять `fit`. Все не последние шаги также должны определять `transform`. См. :ref:`Комбинирование оценщиков ` для получения дополнительной информации.
[('columntransformer', ...), ('transformedtargetregressor', ...)]
transform_input
transform_input: list of str, default=None Имена параметров :term:`metadata`, которые должны быть преобразованы конвейер перед передачей его шагу, который его потребляет. Это позволяет преобразовывать некоторые входные аргументы для ``fit`` (кроме ``X``) для преобразования шагами конвейера до шага, который требует их. Требование определяется через :ref:`маршрутизацию метаданных `. Например, это можно использовать для передачи набора валидации через конвейер. Вы можете установить это только если включена маршрутизация метаданных, что вы можно включить, используя ``sklearn.set_config(enable_metadata_routing=True)``. .. versionadded:: 1.6
None
память
memory: строка или объект с интерфейсом joblib.Memory, по умолчанию=None Используется для кэширования обученных трансформеров конвейера. Последний шаг никогда не будет кэшироваться, даже если это трансформер. По умолчанию, никакие кэширование выполняется. Если задана строка, это путь к директория кэширования. Включение кэширования запускает клонирование преобразователей перед обучением. Следовательно, экземпляр трансформатора, переданный в конвейер не может быть проверен напрямую. Используйте атрибут `named_steps` или ``steps`` для проверки оценщиков внутри конвейера. Кэширование трансформеры выгодны, когда подгонка занимает много времени. См. :ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py` для примера о том, как включить кэширование.
None
verbose
verbose: bool, default=False Если True, затраченное время на обучение каждого шага будет выводиться по мере его выполнения. завершено.
False
columntransformer: ColumnTransformer
Параметры
преобразователи
transformers: список кортежей Список кортежей (имя, transformer, столбцы), определяющих объекты трансформеров, которые должны быть применены к подмножествам данных. name : str Как и в Pipeline и FeatureUnion, это позволяет преобразователю и его параметры могут быть установлены с помощью ``set_params`` и найдены в сетке поиск. transformer: {'drop', 'passthrough'} или estimator Оценщик должен поддерживать :term:`fit` и :term:`transform`. Специальные строки 'drop' и 'passthrough' принимаются как хорошо, чтобы указать, удалить столбцы или пропустить их непреобразованные, соответственно. столбцы : str, массив строк, int, массив int, массив bool, срез или вызываемый объект Индексирует данные по второй оси. Целые числа интерпретируются как позиционные столбцы, в то время как строки могут ссылаться на столбцы DataFrame по имени. Скалярная строка или целое число должны использоваться там, где ``transformer`` ожидает, что X будет одномерным array-like (вектором), иначе в преобразователь будет передан двумерный массив. Вызываемый объект получает входные данные `X` и может возвращать любой из выше. Чтобы выбрать несколько столбцов по имени или типу данных, можно использовать :obj:`make_column_selector`.
[('onehotencoder', ...), ('standardscaler', ...)]
остаток
остаток: {'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, default=0.3 Если выход разных преобразователей содержит разреженные матрицы, они будут сложены в разреженную матрицу, если общая плотность составляет ниже этого значения. Используйте ``sparse_threshold=0``, чтобы всегда возвращать плотный. Когда преобразованный вывод состоит из всех плотных данных, результат будет плотным, и этот ключевой параметр будет проигнорирован.
0.3
n_jobs
n_jobs: int, default=None Количество параллельно выполняемых задач. ``None`` означает 1, если не в контексте :obj:`joblib.parallel_backend`. ``-1`` означает использование всех процессоров. См. :term:`Глоссарий ` для получения дополнительной информации.
None
transformer_weights
transformer_weights: dict, по умолчанию=None Мультипликативные веса для признаков на трансформер. Выходные данные преобразователь умножается на эти веса. Ключи — это имена преобразователей, значения весов.
None
verbose
verbose: bool, default=False Если True, затраченное время на подгонку каждого трансформатора будет печатается по завершении.
False
verbose_feature_names_out
verbose_feature_names_out: bool, str или Callable[[str, str], str], default=True - Если True, :meth:`ColumnTransformer.get_feature_names_out` добавит префикс все имена признаков с именем преобразователя, который их сгенерировал признак. Эквивалентно установке `verbose_feature_names_out="{transformer_name}__{feature_name}"`. - Если False, :meth:`ColumnTransformer.get_feature_names_out` не будет добавляет префикс к любым именам признаков и вызовет ошибку, если имена признаков отсутствуют уникальные. - Если ``Callable[[str, str], str]``, :meth:`ColumnTransformer.get_feature_names_out` переименует все признаки используя имя преобразователя. Первый аргумент вызываемого объекта - это имя трансформера и второй аргумент — имя признака. Возвращаемый строка будет новым именем признака. - Если ``str``, это должна быть строка, готовая к форматированию. Данная строка будет должны форматироваться с использованием двух имен полей: ``transformer_name`` и ``feature_name``. например, ``"{feature_name}__{transformer_name}"``. См. метод :meth:`str.format` из стандартной библиотеки для получения дополнительной информации. .. versionadded:: 1.0 .. versionchanged:: 1.6 `verbose_feature_names_out` может быть вызываемым объектом или строкой для форматирования.
True
force_int_remainder_cols
force_int_remainder_cols: bool, default=False Этот параметр не оказывает влияния. .. примечание:: Если вы не обращаетесь к списку столбцов для оставшихся столбцов в атрибуте `transformers_` после обучения, вам не нужно устанавливать этот параметр. .. versionadded:: 1.5 .. versionchanged:: 1.7 Значение по умолчанию для `force_int_remainder_cols` изменится с с `True` на `False` в версии 1.7. .. устарело:: 1.7 `force_int_remainder_cols` устарел и будет удалён в версии 1.9.
'устаревший'
Параметры
категории
категории: 'auto' или список массивоподобных объектов, по умолчанию='auto' Категории (уникальные значения) для каждого признака: - 'auto' : Автоматически определять категории из обучающих данных. - список: ``categories[i]`` содержит категории, ожидаемые в i-м столбец. Переданные категории не должны смешивать строки и числа значения в пределах одного признака и должны быть отсортированы в случае числовые значения. Используемые категории можно найти в атрибуте ``categories_``. .. versionadded:: 0.20
'auto'
drop
drop: {'first', 'if_binary'} или array-like формы (n_features,), default=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'
sparse_output
sparse_output: bool, default=True Когда ``True``, возвращает :class:`scipy.sparse.csr_matrix`, т.е. разреженная матрица в формате "Compressed Sparse Row" (CSR). .. versionadded:: 1.2 `sparse` был переименован в `sparse_output`
True
dtype
dtype: number type, default=np.float64 Желаемый тип данных выходных данных.
handle_unknown
handle_unknown: {'error', 'ignore', 'infrequent_if_exist', 'warn'}, default='error' Определяет способ обработки неизвестных категорий во время :meth:`transform`. - 'error': Вызвать ошибку, если во время преобразования присутствует неизвестная категория. - 'ignore' : Когда во время transform, результирующие one-hot кодированные столбцы для этого признака будут все нули. При обратном преобразовании неизвестная категория будет обозначаться как None. - 'infrequent_if_exist' : Когда встречается неизвестная категория во время преобразования, результирующие one-hot кодированные столбцы для этой признак будет отображаться в редкую категорию, если она существует. редкая категория будет отображена в последнюю позицию в кодировку. При обратном преобразовании неизвестная категория будет сопоставляется с категорией, обозначенной `'infrequent'`, если она существует. Если категория `'infrequent'` не существует, тогда :meth:`transform` и :meth:`inverse_transform` обработает неизвестную категорию как с `handle_unknown='ignore'`. Редкие категории существуют на основе `min_frequency` и `max_categories`. Подробнее в :ref:`Руководство пользователя `. - '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:`Руководстве пользователя `.
None
max_categories
max_categories: int, default=None Задает верхний предел количества выходных признаков для каждого входного особенность при рассмотрении редких категорий. Если есть редкие категории, `max_categories` включает категорию, представляющую редкие категории вместе с частыми категориями. Если `None`, нет ограничения на количество выходных признаков. .. versionadded:: 1.1 Подробнее в :ref:`Руководстве пользователя `.
None
feature_name_combiner
feature_name_combiner: "concat" или callable, по умолчанию="concat" Вызываемый объект с сигнатурой `def callable(input_feature, category)`, который возвращает string. Используется для создания имен признаков, возвращаемых :meth:`get_feature_names_out`. `"concat"` объединяет закодированное имя признака и категорию с `feature + "_" + str(category)`. Например, признак X со значениями 1, 6, 7 создает имена признаков `X_1, X_6, X_7`. .. versionadded:: 1.3
'concat'
Параметры
copy
copy: bool, default=True Если False, пытается избежать копирования и выполняет масштабирование на месте. Это не гарантирует всегда работать на месте; например, если данные не массив NumPy или разреженная матрица CSR scipy.sparse, копия все еще может быть возвращается.
True
with_mean
with_mean: bool, default=True Если True, центрировать данные перед масштабированием. Это не работает (и вызовет исключение) при попытке на разреженные матрицы, потому что их центрирование требует построения плотной матрица, которая в типичных случаях использования, вероятно, слишком велика для размещения в памяти.
True
with_std
with_std: bool, default=True Если True, масштабировать данные до единичной дисперсии (или, что эквивалентно, единичное стандартное отклонение).
True
transformedtargetregressor: TransformedTargetRegressor
Параметры
регрессор
regressor: объект, по умолчанию=None Объект регрессора, такой как производный от :class:`~sklearn.base.RegressorMixin`. Этот регрессор будет автоматически клонируется каждый раз перед обучением. Если `regressor` является None`, создаётся и используется :class:`~sklearn.linear_model.LinearRegression`.
Ridge(alpha=1e-10)
преобразователь
transformer: object, default=None Объект Estimator, такой как производный от :class:`~sklearn.base.TransformerMixin`. Нельзя устанавливать одновременно как `func` и `inverse_func`. Если `transformer is None`, а также `func` и `inverse_func`, преобразователь будет тождественным преобразователь. Обратите внимание, что преобразователь будет клонирован во время обучения. Кроме того, преобразователь ограничивает `y` массивом numpy.
None
функция
func: функция, по умолчанию=None Функция для применения к `y` перед передачей в :meth:`fit`. Не может быть установлена одновременно с `transformer`. Если `func is None`, используемая функция будет тождественная функция. Если задана `func`, то `inverse_func` также должна быть задана предоставлена. Функция должна возвращать двумерный массив.
inverse_func
inverse_func: функция, по умолчанию=None Функция для применения к предсказанию регрессора. Не может быть установлена в в то же время, что и `transformer`. Обратная функция используется для возврата предсказания в то же пространство исходных меток обучения. Если если установлен `inverse_func`, также необходимо указать `func`. Обратная функция должна возвращать двумерный массив.
check_inverse
check_inverse: bool, default=True Проверять ли, что `transform`, за которым следует `inverse_transform` или `func`, за которым следует `inverse_func`, приводит к исходным целевым значениям.
True
Параметры
alpha
alpha: {float, ndarray формы (n_targets,)}, default=1.0 Константа, умножающая L2-член, контролирующая регуляризацию сила. `alpha` должен быть неотрицательным float, т.е. в `[0, inf)`. Когда `alpha = 0`, целевая функция эквивалентна обычному методу наименьших квадратов квадратов, решаемых объектом :class:`LinearRegression`. Для числовых по причинам, использование `alpha = 0` с объектом `Ridge` не рекомендуется. Вместо этого следует использовать объект :class:`LinearRegression`. Если передаётся массив, предполагается, что штрафы специфичны для целевые переменные. Следовательно, они должны соответствовать по количеству.
1e-10
fit_intercept
fit_intercept: bool, по умолчанию=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|остатки| меньше, чем `tol`. .. versionchanged:: 1.2 Значение по умолчанию изменено с 1e-3 на 1e-4 для согласованности с другими линейными модели.
0.0001
solver
solver: {'auto', 'svd', 'cholesky', 'lsqr', 'sparse_cg', 'sag', 'saga', 'lbfgs'}, по умолчанию='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 solver.
'auto'
положительный
positive: bool, default=False При установке в ``True`` принудительно делает коэффициенты положительными. В этом случае поддерживается только решатель 'lbfgs'.
False
random_state
random_state: int, RandomState instance, default=None Используется, когда ``solver`` == 'sag' или 'saga' для перемешивания данных. См. :term:`Глоссарий ` для деталей. .. versionadded:: 0.17 `random_state` для поддержки Stochastic Average Gradient.
None
Снова проверяем производительность вычисленной модели, используя медианную абсолютную ошибку.
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 ()
Для анализа коэффициентов масштабирование не требуется на этот раз, потому что оно было выполнено на этапе предобработки.
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 )
Теперь мы исследуем коэффициенты по нескольким фолдам кросс-валидации.
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
)
Результат довольно похож на случай без нормализации.
Линейные модели с регуляризацией
В практике машинного обучения гребневая регрессия чаще используется с
непренебрежимо малым регуляризатором.
Выше мы ограничили это регуляризацию очень малым количеством. Регуляризация улучшает обусловленность задачи и уменьшает дисперсию оценок. RidgeCV применяет перекрестную проверку, чтобы определить, какое значение параметра регуляризации (alpha )
лучше всего подходит для предсказания.
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=,
inverse_func=,
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-представление, или доверьтесь блокноту. На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
шаги
steps: список кортежей Список кортежей (имя шага, оценщик), которые должны быть соединены в цепочку последовательный порядок. Для совместимости с API scikit-learn, все шаги должен определять `fit`. Все не последние шаги также должны определять `transform`. См. :ref:`Комбинирование оценщиков ` для получения дополнительной информации.
[('columntransformer', ...), ('transformedtargetregressor', ...)]
transform_input
transform_input: list of str, default=None Имена параметров :term:`metadata`, которые должны быть преобразованы конвейер перед передачей его шагу, который его потребляет. Это позволяет преобразовывать некоторые входные аргументы для ``fit`` (кроме ``X``) для преобразования шагами конвейера до шага, который требует их. Требование определяется через :ref:`маршрутизацию метаданных `. Например, это можно использовать для передачи набора валидации через конвейер. Вы можете установить это только если включена маршрутизация метаданных, что вы можно включить, используя ``sklearn.set_config(enable_metadata_routing=True)``. .. versionadded:: 1.6
None
память
memory: строка или объект с интерфейсом joblib.Memory, по умолчанию=None Используется для кэширования обученных трансформеров конвейера. Последний шаг никогда не будет кэшироваться, даже если это трансформер. По умолчанию, никакие кэширование выполняется. Если задана строка, это путь к директория кэширования. Включение кэширования запускает клонирование преобразователей перед обучением. Следовательно, экземпляр трансформатора, переданный в конвейер не может быть проверен напрямую. Используйте атрибут `named_steps` или ``steps`` для проверки оценщиков внутри конвейера. Кэширование трансформеры выгодны, когда подгонка занимает много времени. См. :ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py` для примера о том, как включить кэширование.
None
verbose
verbose: bool, default=False Если True, затраченное время на обучение каждого шага будет выводиться по мере его выполнения. завершено.
False
columntransformer: ColumnTransformer
Параметры
преобразователи
transformers: список кортежей Список кортежей (имя, transformer, столбцы), определяющих объекты трансформеров, которые должны быть применены к подмножествам данных. name : str Как и в Pipeline и FeatureUnion, это позволяет преобразователю и его параметры могут быть установлены с помощью ``set_params`` и найдены в сетке поиск. transformer: {'drop', 'passthrough'} или estimator Оценщик должен поддерживать :term:`fit` и :term:`transform`. Специальные строки 'drop' и 'passthrough' принимаются как хорошо, чтобы указать, удалить столбцы или пропустить их непреобразованные, соответственно. столбцы : str, массив строк, int, массив int, массив bool, срез или вызываемый объект Индексирует данные по второй оси. Целые числа интерпретируются как позиционные столбцы, в то время как строки могут ссылаться на столбцы DataFrame по имени. Скалярная строка или целое число должны использоваться там, где ``transformer`` ожидает, что X будет одномерным array-like (вектором), иначе в преобразователь будет передан двумерный массив. Вызываемый объект получает входные данные `X` и может возвращать любой из выше. Чтобы выбрать несколько столбцов по имени или типу данных, можно использовать :obj:`make_column_selector`.
[('onehotencoder', ...), ('standardscaler', ...)]
остаток
остаток: {'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, default=0.3 Если выход разных преобразователей содержит разреженные матрицы, они будут сложены в разреженную матрицу, если общая плотность составляет ниже этого значения. Используйте ``sparse_threshold=0``, чтобы всегда возвращать плотный. Когда преобразованный вывод состоит из всех плотных данных, результат будет плотным, и этот ключевой параметр будет проигнорирован.
0.3
n_jobs
n_jobs: int, default=None Количество параллельно выполняемых задач. ``None`` означает 1, если не в контексте :obj:`joblib.parallel_backend`. ``-1`` означает использование всех процессоров. См. :term:`Глоссарий ` для получения дополнительной информации.
None
transformer_weights
transformer_weights: dict, по умолчанию=None Мультипликативные веса для признаков на трансформер. Выходные данные преобразователь умножается на эти веса. Ключи — это имена преобразователей, значения весов.
None
verbose
verbose: bool, default=False Если True, затраченное время на подгонку каждого трансформатора будет печатается по завершении.
False
verbose_feature_names_out
verbose_feature_names_out: bool, str или Callable[[str, str], str], default=True - Если True, :meth:`ColumnTransformer.get_feature_names_out` добавит префикс все имена признаков с именем преобразователя, который их сгенерировал признак. Эквивалентно установке `verbose_feature_names_out="{transformer_name}__{feature_name}"`. - Если False, :meth:`ColumnTransformer.get_feature_names_out` не будет добавляет префикс к любым именам признаков и вызовет ошибку, если имена признаков отсутствуют уникальные. - Если ``Callable[[str, str], str]``, :meth:`ColumnTransformer.get_feature_names_out` переименует все признаки используя имя преобразователя. Первый аргумент вызываемого объекта - это имя трансформера и второй аргумент — имя признака. Возвращаемый строка будет новым именем признака. - Если ``str``, это должна быть строка, готовая к форматированию. Данная строка будет должны форматироваться с использованием двух имен полей: ``transformer_name`` и ``feature_name``. например, ``"{feature_name}__{transformer_name}"``. См. метод :meth:`str.format` из стандартной библиотеки для получения дополнительной информации. .. versionadded:: 1.0 .. versionchanged:: 1.6 `verbose_feature_names_out` может быть вызываемым объектом или строкой для форматирования.
True
force_int_remainder_cols
force_int_remainder_cols: bool, default=False Этот параметр не оказывает влияния. .. примечание:: Если вы не обращаетесь к списку столбцов для оставшихся столбцов в атрибуте `transformers_` после обучения, вам не нужно устанавливать этот параметр. .. versionadded:: 1.5 .. versionchanged:: 1.7 Значение по умолчанию для `force_int_remainder_cols` изменится с с `True` на `False` в версии 1.7. .. устарело:: 1.7 `force_int_remainder_cols` устарел и будет удалён в версии 1.9.
'устаревший'
Параметры
категории
категории: 'auto' или список массивоподобных объектов, по умолчанию='auto' Категории (уникальные значения) для каждого признака: - 'auto' : Автоматически определять категории из обучающих данных. - список: ``categories[i]`` содержит категории, ожидаемые в i-м столбец. Переданные категории не должны смешивать строки и числа значения в пределах одного признака и должны быть отсортированы в случае числовые значения. Используемые категории можно найти в атрибуте ``categories_``. .. versionadded:: 0.20
'auto'
drop
drop: {'first', 'if_binary'} или array-like формы (n_features,), default=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'
sparse_output
sparse_output: bool, default=True Когда ``True``, возвращает :class:`scipy.sparse.csr_matrix`, т.е. разреженная матрица в формате "Compressed Sparse Row" (CSR). .. versionadded:: 1.2 `sparse` был переименован в `sparse_output`
True
dtype
dtype: number type, default=np.float64 Желаемый тип данных выходных данных.
handle_unknown
handle_unknown: {'error', 'ignore', 'infrequent_if_exist', 'warn'}, default='error' Определяет способ обработки неизвестных категорий во время :meth:`transform`. - 'error': Вызвать ошибку, если во время преобразования присутствует неизвестная категория. - 'ignore' : Когда во время transform, результирующие one-hot кодированные столбцы для этого признака будут все нули. При обратном преобразовании неизвестная категория будет обозначаться как None. - 'infrequent_if_exist' : Когда встречается неизвестная категория во время преобразования, результирующие one-hot кодированные столбцы для этой признак будет отображаться в редкую категорию, если она существует. редкая категория будет отображена в последнюю позицию в кодировку. При обратном преобразовании неизвестная категория будет сопоставляется с категорией, обозначенной `'infrequent'`, если она существует. Если категория `'infrequent'` не существует, тогда :meth:`transform` и :meth:`inverse_transform` обработает неизвестную категорию как с `handle_unknown='ignore'`. Редкие категории существуют на основе `min_frequency` и `max_categories`. Подробнее в :ref:`Руководство пользователя `. - '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:`Руководстве пользователя `.
None
max_categories
max_categories: int, default=None Задает верхний предел количества выходных признаков для каждого входного особенность при рассмотрении редких категорий. Если есть редкие категории, `max_categories` включает категорию, представляющую редкие категории вместе с частыми категориями. Если `None`, нет ограничения на количество выходных признаков. .. versionadded:: 1.1 Подробнее в :ref:`Руководстве пользователя `.
None
feature_name_combiner
feature_name_combiner: "concat" или callable, по умолчанию="concat" Вызываемый объект с сигнатурой `def callable(input_feature, category)`, который возвращает string. Используется для создания имен признаков, возвращаемых :meth:`get_feature_names_out`. `"concat"` объединяет закодированное имя признака и категорию с `feature + "_" + str(category)`. Например, признак X со значениями 1, 6, 7 создает имена признаков `X_1, X_6, X_7`. .. versionadded:: 1.3
'concat'
Параметры
copy
copy: bool, default=True Если False, пытается избежать копирования и выполняет масштабирование на месте. Это не гарантирует всегда работать на месте; например, если данные не массив NumPy или разреженная матрица CSR scipy.sparse, копия все еще может быть возвращается.
True
with_mean
with_mean: bool, default=True Если True, центрировать данные перед масштабированием. Это не работает (и вызовет исключение) при попытке на разреженные матрицы, потому что их центрирование требует построения плотной матрица, которая в типичных случаях использования, вероятно, слишком велика для размещения в памяти.
True
with_std
with_std: bool, default=True Если True, масштабировать данные до единичной дисперсии (или, что эквивалентно, единичное стандартное отклонение).
True
transformedtargetregressor: TransformedTargetRegressor
Параметры
регрессор
regressor: объект, по умолчанию=None Объект регрессора, такой как производный от :class:`~sklearn.base.RegressorMixin`. Этот регрессор будет автоматически клонируется каждый раз перед обучением. Если `regressor` является None`, создаётся и используется :class:`~sklearn.linear_model.LinearRegression`.
RidgeCV(alpha...+09, 1.e+10]))
преобразователь
transformer: object, default=None Объект Estimator, такой как производный от :class:`~sklearn.base.TransformerMixin`. Нельзя устанавливать одновременно как `func` и `inverse_func`. Если `transformer is None`, а также `func` и `inverse_func`, преобразователь будет тождественным преобразователь. Обратите внимание, что преобразователь будет клонирован во время обучения. Кроме того, преобразователь ограничивает `y` массивом numpy.
None
функция
func: функция, по умолчанию=None Функция для применения к `y` перед передачей в :meth:`fit`. Не может быть установлена одновременно с `transformer`. Если `func is None`, используемая функция будет тождественная функция. Если задана `func`, то `inverse_func` также должна быть задана предоставлена. Функция должна возвращать двумерный массив.
inverse_func
inverse_func: функция, по умолчанию=None Функция для применения к предсказанию регрессора. Не может быть установлена в в то же время, что и `transformer`. Обратная функция используется для возврата предсказания в то же пространство исходных меток обучения. Если если установлен `inverse_func`, также необходимо указать `func`. Обратная функция должна возвращать двумерный массив.
check_inverse
check_inverse: bool, default=True Проверять ли, что `transform`, за которым следует `inverse_transform` или `func`, за которым следует `inverse_func`, приводит к исходным целевым значениям.
True
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]))
Параметры
альфы
alphas: array-like формы (n_alphas,), по умолчанию=(0.1, 1.0, 10.0) Массив значений alpha для проверки. Сила регуляризации; должна быть положительным числом с плавающей точкой. Регуляризация улучшает обусловленность задачи и уменьшает дисперсию оценки. Большие значения указывают на более сильную регуляризацию. Alpha соответствует ``1 / (2C)`` в других линейных моделях, таких как :class:`~sklearn.linear_model.LogisticRegression` или :class:`~sklearn.svm.LinearSVC`. При использовании перекрестной проверки Leave-One-Out альфы должны быть строго положительными.
array([1.e-10...e+09, 1.e+10])
fit_intercept
fit_intercept: bool, по умолчанию=True Вычислять ли свободный член для этой модели. Если установлено в false, перехват не будет использоваться в расчетах (т.е. данные предполагаются центрированными).
True
оценка
scoring: str, callable, default=None Метод оценки для перекрестной проверки. Варианты: - str: см. :ref:`scoring_string_names` для вариантов. - вызываемый объект: вызываемый объект оценки (например, функция) с сигнатурой ``scorer(estimator, X, y)``. См. :ref:`scoring_callable` для подробностей. - `None`: отрицательная :ref:`среднеквадратичная ошибка ` если cv None (т.е. при использовании перекрестной проверки с исключением по одному), или :ref:`коэффициент детерминации ` (:math:`R^2`) в противном случае.
None
cv
cv: int, генератор перекрестной проверки или итерируемый объект, по умолчанию=None Определяет стратегию разделения для кросс-валидации. Возможные значения для cv: - None, чтобы использовать эффективную перекрестную проверку Leave-One-Out - целое число, чтобы указать количество фолдов. - :term:`CV splitter`, - Итерируемый объект, возвращающий (обучающая, тестовая) разбиения в виде массивов индексов. Для целочисленных/None входных данных, если ``y`` является бинарным или многоклассовым, :class:`~sklearn.model_selection.StratifiedKFold` используется, иначе, используется :class:`~sklearn.model_selection.KFold`. См. :ref:`Руководство пользователя ` для различных стратегии перекрестной проверки, которые можно использовать здесь.
None
gcv_mode
. В: Труды 2-й Международной конференции по обнаружению знаний и интеллектуальному анализу данных, Портленд, OR, AAAI Press, стр. 226-231. 1996 Флаг, указывающий, какую стратегию использовать при выполнении Перекрестная проверка с исключением одного наблюдения. Варианты:: 'auto' : использовать 'svd', если n_samples > n_features, иначе использовать 'eigen' 'svd': принудительно использовать сингулярное разложение X, когда X является плотное, собственное разложение X^T.X, когда X разрежено. 'eigen' : принудительное вычисление через собственное разложение X.X^T Режим 'auto' используется по умолчанию и предназначен для выбора более дешевого вариант из двух в зависимости от формы обучающих данных.
None
store_cv_results
store_cv_results: bool, default=False Флаг, указывающий, соответствуют ли значения перекрестной проверки каждый альфа должен храниться в атрибуте ``cv_results_`` (см. ниже). Этот флаг совместим только с ``cv=None`` (т.е. с использованием Перекрестная проверка с исключением одного наблюдения). .. versionchanged:: 1.5 Имя параметра изменено с `store_cv_values` на `store_cv_results`.
False
alpha_per_target
alpha_per_target: bool, по умолчанию=False Флаг, указывающий, следует ли оптимизировать значение альфа (выбранное из список параметров `alphas`) для каждой цели отдельно (для многомерного вывода настройки: несколько целевых переменных для предсказания). При установке в `True`, после при обучении атрибут `alpha_` будет содержать значение для каждой целевой переменной. При установке значения `False` используется один альфа-параметр для всех целевых переменных. .. versionadded:: 0.24
False
Сначала мы проверяем, какое значение \(\alpha\) был выбран.
model [ - 1 ] . regressor_ . alpha_
Затем мы проверяем качество предсказаний.
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 ()
Способность воспроизводить данные регуляризованной модели аналогична таковой у нерегуляризованной модели.
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 )
Коэффициенты значительно различаются. Коэффициенты 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
)
Линейные модели с разреженными коэффициентами
Другая возможность учитывать коррелированные переменные в наборе данных —
оценивать разреженные коэффициенты. В некотором смысле мы уже делали это вручную,
когда удаляли столбец AGE в предыдущей оценке ridge.
Модели Lasso (см. Lasso раздел User Guide) оценивает разреженные коэффициенты. LassoCV применяет перекрёстную проверку для определения значения параметра регуляризации (alpha ) лучше всего подходит для оценки модели.
Сначала мы проверяем, какое значение \(\alpha\) был выбран.
model [ - 1 ] . regressor_ . alpha_
Затем мы проверяем качество предсказаний.
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 ()
Для нашего набора данных модель снова не очень предсказуема.
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 определяет корреляцию между
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
)
Мы наблюдаем, что коэффициенты AGE и EXPERIENCE сильно варьируются
в зависимости от фолда.
Неправильная причинная интерпретация
Политики могут захотеть узнать влияние образования на заработную плату, чтобы оценить, имеет ли экономический смысл определенная политика, направленная на поощрение людей к получению большего образования. Хотя модели машинного обучения отлично подходят для измерения статистических связей, они, как правило, не способны выводить причинно-следственные эффекты.
Может возникнуть соблазн посмотреть на коэффициент образования в модели заработной платы из нашей последней модели (или любой другой модели) и сделать вывод, что он отражает истинный эффект изменения стандартизированной переменной образования на заработную плату.
К сожалению, вероятно существуют ненаблюдаемые смешивающие переменные, которые либо
завышают, либо занижают этот коэффициент. Смешивающая переменная — это переменная, которая
влияет как на EDUCATION, так и на WAGE. Одним из примеров такой переменной является способности.
Предположительно, более способные люди с большей вероятностью получают образование, и в то же время
с большей вероятностью зарабатывают более высокую почасовую оплату на любом уровне
образования. В этом случае способности вызывают положительное Смещение из-за пропущенной переменной (OVB) на коэффициенте EDUCATION,
тем самым преувеличивая влияние образования на заработную плату.
См. Неспособность машинного обучения выводить причинно-следственные связи
для смоделированного случая способности OVB.
Извлеченные уроки
Коэффициенты должны быть приведены к одной единице измерения для определения важности признаков. Масштабирование их с помощью стандартного отклонения признака является полезным приближением.
Коэффициенты в многомерных линейных моделях представляют зависимость
между данным признаком и целевой переменной, условный на других признаках.
Коррелированные признаки вызывают нестабильность в коэффициентах линейных
моделей, и их эффекты не могут быть хорошо разделены.
Разные линейные модели по-разному реагируют на корреляцию признаков, и
коэффициенты могут значительно отличаться друг от друга.
Изучение коэффициентов по фолдам цикла перекрестной проверки дает представление об их стабильности.
Интерпретация причинно-следственных связей затруднена при наличии смешивающих эффектов. Если
связь между двумя переменными также подвержена влиянию чего-то
ненаблюдаемого, следует быть осторожными при выводе заключений о причинности.
Общее время выполнения скрипта: (0 минут 11.722 секунд)
Связанные примеры
Галерея, созданная Sphinx-Gallery