Spec-Zone.ru › scikit-learn

Примечание

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

Объединение предикторов с помощью стекинга

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

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

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

Генерация данных

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

import numpy as np
import pandas as pd

rng = np.random.RandomState(42)
X = rng.uniform(-3, 3, size=500)
trend = 2.4 * X
seasonal = 3.1 * np.sin(3.2 * X)
drop = 10.0 * (X > 2).astype(float)
sigma = 0.75 + 0.75 * X**2
y = trend + seasonal - drop + rng.normal(loc=0.0, scale=np.sqrt(sigma))

df = pd.DataFrame({"X": X, "y": y})
_ = df.plot.scatter(x="X", y="y")
plot stack predictors

Стекинг предикторов на одном наборе данных

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

Здесь мы объединяем 3 алгоритма (линейные и нелинейные) и используем регрессор RidgeCV с параметрами по умолчанию, чтобы объединить их выходные данные.

Примечание

Хотя некоторые базовые алгоритмы включают предварительную обработку (например, StandardScaler), final_estimator не требует дополнительной предварительной обработки при использовании passthrough=False по умолчанию, поскольку получает только предсказания базовых алгоритмов. Если passthrough=True, final_estimator должен быть конвейером с соответствующей предварительной обработкой.

from sklearn.ensemble import HistGradientBoostingRegressor, StackingRegressor
from sklearn.linear_model import RidgeCV
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures, SplineTransformer, StandardScaler

linear_ridge = make_pipeline(StandardScaler(), RidgeCV())

spline_ridge = make_pipeline(
    SplineTransformer(n_knots=6, degree=3),
    PolynomialFeatures(interaction_only=True),
    RidgeCV(),
)

hgbt = HistGradientBoostingRegressor(random_state=0)

estimators = [
    ("Linear Ridge", linear_ridge),
    ("Spline Ridge", spline_ridge),
    ("HGBT", hgbt),
]

stacking_regressor = StackingRegressor(estimators=estimators, final_estimator=RidgeCV())
stacking_regressor
StackingRegressor(estimators=[('Linear Ridge',
                               Pipeline(steps=[('standardscaler',
                                                StandardScaler()),
                                               ('ridgecv', RidgeCV())])),
                              ('Spline Ridge',
                               Pipeline(steps=[('splinetransformer',
                                                SplineTransformer(n_knots=6)),
                                               ('polynomialfeatures',
                                                PolynomialFeatures(interaction_only=True)),
                                               ('ridgecv', RidgeCV())])),
                              ('HGBT',
                               HistGradientBoostingRegressor(random_state=0))],
                  final_estimator=RidgeCV())
В среде Jupyter перезапустите эту ячейку, чтобы отобразить HTML-представление, или доверьте блокноту.
На GitHub HTML-представление не отображается. Попробуйте открыть эту страницу на nbviewer.org.
Параметры
estimators estimators: список (str, estimator)

Базовые оценщики, которые будут объединены с помощью стекинга. Каждый элемент
списка представляет собой кортеж из строки (т. е. имени) и экземпляра
оценщика. С помощью `set_params` оценщику можно задать значение 'drop'.
[('Linear Ridge', ...), ('Spline Ridge', ...), ...]
final_estimator final_estimator: оценщик, по умолчанию=None

Регрессор, который будет использоваться для объединения базовых оценщиков.
Регрессор по умолчанию — :class:`~sklearn.linear_model.RidgeCV`.
RidgeCV()
cv cv: int, генератор кросс-валидации, итерируемый объект или "prefit", по умолчанию=None

Определяет стратегию разбиения для кросс-валидации, используемую в
`cross_val_predict` для обучения `final_estimator`. Для cv возможны следующие
значения:

* None — использовать кросс-валидацию с 5 блоками по умолчанию;
* целое число — задать количество блоков в (Stratified) KFold;
* объект, который будет использоваться как генератор кросс-валидации;
* итерируемый объект, возвращающий разбиения на обучающую и тестовую выборки;
* `"prefit"` — считать, что оценщики `estimators` уже обучены. В этом случае
оценщики не будут обучаться повторно.

Для значений типа целое число/None, если оценщик является классификатором, а y
представляет собой бинарную или многоклассовую цель,
используется :class:`~sklearn.model_selection.StratifiedKFold`.
Во всех остальных случаях используется :class:`~sklearn.model_selection.KFold`.
Эти разделители создаются с параметром `shuffle=False`, поэтому разбиения
будут одинаковыми при каждом вызове.

Различные стратегии кросс-валидации, которые можно использовать здесь, описаны
в :ref:`Руководстве пользователя <cross_validation>`.

Если передано значение "prefit", предполагается, что все оценщики `estimators`
уже обучены. `final_estimator_` обучается на предсказаниях `estimators` для всего
обучающего набора, а не на предсказаниях, полученных с помощью кросс-валидации.
Обратите внимание: если модели обучались на тех же данных, что и модель стекинга,
риск переобучения очень высок.

.. versionadded:: 1.1
Параметр 'prefit' добавлен в версии 1.1

.. note::
Увеличение количества разбиений не даст преимуществ, если обучающая выборка
достаточно велика. При этом время обучения увеличится. ``cv`` используется
не для оценки модели, а для получения предсказаний.
None
n_jobs n_jobs: int, по умолчанию=None

Количество задач, выполняемых параллельно при вызове `fit` для всех оценщиков
`estimators`. Значение `None` означает 1, если только не используется контекст
`joblib.parallel_backend`. Значение -1 означает использование всех процессоров.
Дополнительные сведения см. в :term:`Глоссарии <n_jobs>`.
None
passthrough passthrough: bool, по умолчанию=False

Если False, в качестве обучающих данных для `final_estimator` используются только
предсказания оценщиков. Если True,
`final_estimator` обучается как на предсказаниях, так и на
исходных обучающих данных.
False
verbose verbose: int, по умолчанию=0

Уровень подробности вывода.
0
Параметры
copy copy: bool, default=True

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

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

Если True, масштабировать данные до единичной дисперсии (или, что эквивалентно,
единичного стандартного отклонения).
True
Параметры
alphas 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 значения alphas должны быть строго положительными.

Пример влияния силы регуляризации на коэффициенты модели
см. в разделе :ref:`sphx_glr_auto_examples_linear_model_plot_ridge_coeffs.py`.
(0.1, ...)
fit_intercept fit_intercept: bool, по умолчанию=True

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

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

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

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

- None — использовать эффективную перекрёстную проверку Leave-One-Out
- целое число — задать количество блоков,
- :term:`разделитель CV`,
- итерируемый объект, возвращающий разбиения (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'}, по умолчанию='auto'

Флаг, указывающий, какую стратегию использовать при выполнении
перекрёстной проверки Leave-One-Out. Доступны следующие варианты::

'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, по умолчанию=False

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

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

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

.. versionadded:: 0.24
False
Параметры
n_knots n_knots: int, по умолчанию=5

Количество узлов сплайнов, если `knots` равно одному из значений
{'uniform', 'quantile'}. Должно быть не меньше 2. Игнорируется, если `knots`
является массивоподобным объектом.
6
degree degree: int, по умолчанию=3

Степень полинома базиса сплайна. Должна быть неотрицательным
целым числом.
3
knots knots: {'uniform', 'quantile'} или массивоподобный объект формы (n_knots, n_features), по умолчанию='uniform'

Задать положения узлов так, чтобы первый узел <= признаки <= последний узел.

- Если задано 'uniform', узлы в количестве `n_knots` равномерно распределяются
от минимальных до максимальных значений признаков.
- Если задано 'quantile', они равномерно распределяются по квантилям
признаков.
- Если задан массивоподобный объект, он напрямую задаёт отсортированные положения
узлов, включая граничные. Обратите внимание: внутри алгоритма перед первым узлом
добавляется `degree` узлов, и столько же —
после последнего узла.
'uniform'
extrapolation extrapolation: {'error', 'constant', 'linear', 'continue', 'periodic'}, по умолчанию='constant'

Если задано 'error', значения за пределами минимальных и максимальных значений обучающих
признаков вызывают `ValueError`. Если задано 'constant', значения сплайнов
в минимальной и максимальной точках признаков используются для
постоянной экстраполяции. Если задано 'linear', используется линейная экстраполяция.
Если задано 'continue', сплайны экстраполируются без изменений, то есть используется параметр
`extrapolate=True` в :class:`scipy.interpolate.BSpline`. Если
задано 'periodic', используются периодические сплайны с периодом, равным расстоянию
между первым и последним узлом. Периодические сплайны обеспечивают
равенство значений функции и её производных в первом и последнем узлах.
Например, это позволяет избежать произвольного
скачка между 31 декабря и 1 января в сплайновых признаках, полученных из
естественно периодического входного признака «день года». В этом случае
рекомендуется вручную задать значения узлов, чтобы контролировать период.
'constant'
include_bias include_bias: bool, по умолчанию=True

Если False, последний элемент сплайна в диапазоне данных
для признака отбрасывается. Поскольку B-сплайны в сумме дают единицу по функциям
базиса сплайна для каждой точки данных, они неявно включают член смещения,
то есть столбец из единиц. В линейной модели он выполняет роль свободного члена.
True
order order: {'C', 'F'}, по умолчанию='C'

Порядок выходного массива в плотном случае. Порядок `'F'` вычисляется быстрее, но
может замедлить последующие оцениватели.
'C'
handle_missing handle_missing: {'error', 'zeros'}, по умолчанию='error'

Задаёт способ обработки пропущенных значений.

- 'error' : Вызывать ошибку, если во время :meth:`fit` присутствуют значения `np.nan`.
- 'zeros' : Кодировать сплайны для пропущенных значений нулями `0`.

Обратите внимание: `handle_missing='zeros'` отличается от предварительного заполнения пропущенных значений
нулями с последующим созданием базиса сплайна. Во втором случае создаются базисные функции сплайна,
имеющие ненулевые значения для пропущенных значений,
тогда как этот параметр просто устанавливает значения всех базисных функций сплайна в ноль для
пропущенных значений.

.. versionadded:: 1.8
'error'
sparse_output sparse_output: bool, по умолчанию=False

Если задано True, возвращается разреженная матрица CSR, иначе возвращается массив.

.. versionadded:: 1.2
False
Параметры
interaction_only interaction_only: bool, по умолчанию=False

Если `True`, создаются только признаки взаимодействия: признаки, являющиеся
произведениями не более чем `degree` *различных* входных признаков; то есть исключаются члены
со степенью 2 или выше для одного и того же входного признака:

- включены: `x[0]`, `x[1]`, `x[0] * x[1]` и т. д.
- исключены: `x[0] ** 2`, `x[0] ** 2 * x[1]` и т. д.
True
degree degree: int или кортеж (min_degree, max_degree), по умолчанию=2

Если задано одно целое число, оно определяет максимальную степень
полиномиальных признаков. Если передан кортеж `(min_degree, max_degree)`,
то `min_degree` задаёт минимальную, а `max_degree` — максимальную
степень полинома для создаваемых признаков. Обратите внимание: `min_degree=0`
и `min_degree=1` эквивалентны, поскольку включение члена нулевой степени
определяется параметром `include_bias`.
2
include_bias include_bias: bool, по умолчанию=True

Если `True` (значение по умолчанию), включается столбец смещения — признак, для которого
все полиномиальные степени равны нулю (то есть столбец из единиц, выполняющий роль
свободного члена в линейной модели).
True
order order: {'C', 'F'}, по умолчанию='C'

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

.. versionadded:: 0.21
'C'
Параметры
alphas 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 значения alphas должны быть строго положительными.

Пример влияния силы регуляризации на коэффициенты модели
см. в разделе :ref:`sphx_glr_auto_examples_linear_model_plot_ridge_coeffs.py`.
(0.1, ...)
fit_intercept fit_intercept: bool, по умолчанию=True

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

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

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

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

- None — использовать эффективную перекрёстную проверку Leave-One-Out
- целое число — задать количество блоков,
- :term:`разделитель CV`,
- итерируемый объект, возвращающий разбиения (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'}, по умолчанию='auto'

Флаг, указывающий, какую стратегию использовать при выполнении
перекрёстной проверки Leave-One-Out. Доступны следующие варианты::

'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, по умолчанию=False

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

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

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

.. versionadded:: 0.24
False
Параметры
random_state random_state: целое число, экземпляр RandomState или None, по умолчанию=None

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

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

.. versionchanged:: 0.23
Добавлен параметр 'poisson'.

.. versionchanged:: 1.1
Добавлен параметр 'quantile'.

.. versionchanged:: 1.3
Добавлен параметр 'gamma'.
'squared_error'
quantile quantile: число с плавающей точкой, по умолчанию=None

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

Скорость обучения, также известная как *сжатие*. Используется в качестве
множителя для значений листьев. Укажите ``1``, чтобы отключить
сжатие.
0.1
max_iter max_iter: целое число, по умолчанию=100

Максимальное число итераций процесса бустинга, то есть
максимальное число деревьев.
100
max_leaf_nodes max_leaf_nodes: целое число или None, по умолчанию=31

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

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

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

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

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

.. versionadded:: 1.4
1.0
max_bins max_bins: целое число, по умолчанию=255

Максимальное число бинов для непустых значений. Перед
обучением каждый признак входного массива `X` разбивается на бины
с целочисленными значениями, что значительно ускоряет этап обучения.
Для признаков с небольшим числом уникальных значений может использоваться меньше
``max_bins`` бинов. Помимо ``max_bins`` бинов всегда резервируется
еще один бин для пропущенных значений. Значение не должно превышать 255.
255
categorical_features categorical_features: массивоподобный объект типа {bool, int, str} формы (n_features) или формы (n_categorical_features,), по умолчанию='from_dtype'

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

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

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

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

.. versionadded:: 0.24

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

.. versionchanged:: 1.4
Добавлен параметр `"from_dtype"`.

.. versionchanged:: 1.6
Значение по умолчанию изменено с `None` на `"from_dtype"`.
'from_dtype'
monotonic_cst monotonic_cst: массивоподобный объект целых чисел формы (n_features) или словарь, по умолчанию=None

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

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

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

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

.. versionadded:: 0.23

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

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

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

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

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

См. :ref:`этот пример<ice-vs-pdp>`, где показано, как использовать `interaction_cst`.

.. versionadded:: 1.2
None
warm_start warm_start: логическое значение, по умолчанию=False

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

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

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

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

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

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

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

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

Уровень подробности вывода. Если значение не равно нулю, выводится информация о
процессе обучения. ``1`` выводит только сводную информацию, ``2`` — информацию для каждой
итерации.
0
Параметры
alphas alphas: массивоподобный объект формы (n_alphas,), по умолчанию=(0.1, 1.0, 10.0)

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

Пример влияния силы регуляризации на коэффициенты модели см.
в :ref:`sphx_glr_auto_examples_linear_model_plot_ridge_coeffs.py`.
(0.1, ...)
fit_intercept fit_intercept: логическое значение, по умолчанию=True

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

Метод оценки для перекрестной проверки. Доступные варианты:

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

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

- None — использовать эффективную перекрестную проверку Leave-One-Out;
- целое число — задать количество фолдов;
- :term:`разбиватель CV`;
- итерируемый объект, возвращающий разбиения (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'}, по умолчанию='auto'

Параметр, задающий используемую стратегию
перекрестной проверки Leave-One-Out. Возможные варианты::

'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: логическое значение, по умолчанию=False

Параметр, указывающий, нужно ли сохранять значения перекрестной проверки, соответствующие
каждому alpha, в атрибуте ``cv_results_`` (см.
ниже). Этот параметр совместим только с ``cv=None`` (то есть при использовании
перекрестной проверки Leave-One-Out).

.. versionchanged:: 1.5
Имя параметра изменено с `store_cv_values` на `store_cv_results`.
False
alpha_per_target alpha_per_target: логическое значение, по умолчанию=False

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

.. versionadded:: 0.24
False


Оценка и визуализация результатов

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

import matplotlib.pyplot as plt

X = X.reshape(-1, 1)
linear_ridge.fit(X, y)
spline_ridge.fit(X, y)
hgbt.fit(X, y)
stacking_regressor.fit(X, y)

x_plot = np.linspace(X.min() - 0.1, X.max() + 0.1, 500).reshape(-1, 1)
preds = {
    "Linear Ridge": linear_ridge.predict(x_plot),
    "Spline Ridge": spline_ridge.predict(x_plot),
    "HGBT": hgbt.predict(x_plot),
    "Stacking (Ridge final estimator)": stacking_regressor.predict(x_plot),
}

fig, axes = plt.subplots(2, 2, figsize=(10, 8), sharex=True, sharey=True)
axes = axes.ravel()
for ax, (name, y_pred) in zip(axes, preds.items()):
    ax.scatter(
        X[:, 0],
        y,
        s=6,
        alpha=0.35,
        linewidths=0,
        label="observed (sample)",
    )

    ax.plot(x_plot.ravel(), y_pred, linewidth=2, alpha=0.9, label=name)
    ax.set_title(name)
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.legend(loc="lower right")

plt.suptitle("Base Models Predictions versus Stacked Predictions", y=1)
plt.tight_layout()
plt.show()
Base Models Predictions versus Stacked Predictions, Linear Ridge, Spline Ridge, HGBT, Stacking (Ridge final estimator)

Можно также построить график ошибок прогнозирования и оценить качество отдельных предикторов и стека регрессоров.

import time

from sklearn.metrics import PredictionErrorDisplay
from sklearn.model_selection import cross_val_predict, cross_validate

fig, axs = plt.subplots(2, 2, figsize=(9, 7))
axs = np.ravel(axs)

for ax, (name, est) in zip(
    axs, estimators + [("Stacking Regressor", stacking_regressor)]
):
    scorers = {r"$R^2$": "r2", "MAE": "neg_mean_absolute_error"}

    start_time = time.time()
    scores = cross_validate(est, X, y, scoring=list(scorers.values()), n_jobs=-1)
    elapsed_time = time.time() - start_time

    y_pred = cross_val_predict(est, X, y, n_jobs=-1)
    scores = {
        key: (
            f"{np.abs(np.mean(scores[f'test_{value}'])):.2f}"
            r" $\pm$ "
            f"{np.std(scores[f'test_{value}']):.2f}"
        )
        for key, value in scorers.items()
    }

    display = PredictionErrorDisplay.from_predictions(
        y_true=y,
        y_pred=y_pred,
        kind="actual_vs_predicted",
        ax=ax,
        scatter_kwargs={"alpha": 0.2, "color": "tab:blue"},
        line_kwargs={"color": "tab:red"},
    )
    ax.set_title(f"{name}\nEvaluation in {elapsed_time:.2f} seconds")

    for name, score in scores.items():
        ax.plot([], [], " ", label=f"{name}: {score}")
    ax.legend(loc="upper left")

plt.suptitle("Prediction Errors of Base versus Stacked Predictors", y=1)
plt.tight_layout()
plt.subplots_adjust(top=0.9)
plt.show()
Prediction Errors of Base versus Stacked Predictors, Linear Ridge Evaluation in 0.02 seconds, Spline Ridge Evaluation in 0.03 seconds, HGBT Evaluation in 0.32 seconds, Stacking Regressor Evaluation in 1.48 seconds

Хотя после перекрестной проверки значения метрик заметно перекрываются, прогнозы стекингового регрессора немного лучше.

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

stacking_regressor.fit(X, y)
stacking_regressor.final_estimator_.coef_
array([-0.00446216,  0.44878552,  0.54762418])

Видно, что в данном случае преобладает модель HGBT, а сплайновая ridge-модель также вносит существенный вклад. Обычная линейная модель не добавляет полезной информации после включения этих двух моделей; если в качестве final_estimator используется RidgeCV, она не исключается, но получает небольшой отрицательный вес, корректирующий остаточное смещение.

Если использовать LassoCV в качестве final_estimator, этот небольшой бесполезный вклад становится равным нулю, и получается более простой ансамбль из сплайновой ridge-модели и HGBT.

from sklearn.linear_model import LassoCV

stacking_regressor = StackingRegressor(estimators=estimators, final_estimator=LassoCV())
stacking_regressor.fit(X, y)
stacking_regressor.final_estimator_.coef_
array([0.        , 0.41148006, 0.56187293])

Как воспроизвести SuperLearner с помощью scikit-learn

SuperLearner [Polley2010] — это стратегия стекинга, реализованная в виде пакета для R, но недоступная в Python в готовом виде. Она тесно связана с StackingRegressor, поскольку в обоих случаях метамодель обучается на прогнозах базовых оценщиков, полученных вне фолда.

Ключевое отличие состоит в том, что SuperLearner оценивает выпуклый набор мета-весов (неотрицательных и в сумме равных 1) и не использует свободный член; в отличие от этого, StackingRegressor по умолчанию использует неограниченную метамодель со свободным членом (и при необходимости может включать исходные признаки благодаря параметру passthrough).

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

from sklearn.linear_model import LinearRegression

linear_reg = LinearRegression(fit_intercept=False, positive=True)
super_learner_like = StackingRegressor(
    estimators=estimators, final_estimator=linear_reg
)
super_learner_like.fit(X, y)
super_learner_like.final_estimator_.coef_
array([2.41599723e-04, 4.48129539e-01, 5.49327451e-01])

Сумма мета-весов стекингового регрессора близка к 1.0, но не равна ей в точности:

super_learner_like.final_estimator_.coef_.sum()
np.float64(0.9976985896404182)

Помимо интерпретируемости, ограничение нормировки до 1.0 в SuperLearner дает следующие преимущества:

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

Наиболее простой способ обеспечить нормировку коэффициентов в scikit-learn — определить пользовательский оценщик, однако это выходит за рамки данного руководства.

Выводы

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

Литература

[Polley2010]

Polley, E. C. и van der Laan, M. J., Супер-обучение в прогнозировании, 2010.

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_stack_predictors.ipynb

Download Python source code: plot_stack_predictors.py

Download zipped: plot_stack_predictors.zip

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

График индивидуальных прогнозов и прогнозов регрессора голосования

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

Регрессия на основе дерева решений с AdaBoost

Основные нововведения scikit-learn 0.22

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

Spec-Zone.ru

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