Spec-Zone.ru › scikit-learn

Примечание

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

Расширенное построение графиков частичной зависимости

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

Примечание

См. также ROC-кривая с API визуализации

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

import matplotlib.pyplot as plt
import pandas as pd

from sklearn.datasets import load_diabetes
from sklearn.inspection import PartialDependenceDisplay
from sklearn.neural_network import MLPRegressor
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeRegressor

Обучение моделей на наборе данных о диабете

Сначала мы обучим дерево решений и многослойный перцептрон на наборе данных о диабете.

diabetes = load_diabetes()
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
y = diabetes.target

tree = DecisionTreeRegressor()
mlp = make_pipeline(
    StandardScaler(),
    MLPRegressor(hidden_layer_sizes=(100, 100), tol=1e-2, max_iter=500, random_state=0),
)
tree.fit(X, y)
mlp.fit(X, y)
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('mlpregressor',
                 MLPRegressor(hidden_layer_sizes=(100, 100), max_iter=500,
                              random_state=0, tol=0.01))])
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить представление HTML, или доверьте записной книжке.
На GitHub представление HTML отобразить невозможно; попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
steps steps: список кортежей

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

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

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

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

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

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

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

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

.. добавлено в версии:: 1.0
ndarray[object](10,) ['age','sex','bmi',...,'s4','s5','s6']
n_features_in_ n_features_in_: int

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

.. добавлено в версии:: 0.24
int 10
Параметры
copy copy: bool, по умолчанию True

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

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

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

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

.. добавлено в версии:: 1.0
ndarray[object](10,) ['age','sex','bmi',...,'s4','s5','s6']
mean_ mean_: ndarray формы (n_features,) или None

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

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

.. добавлено в версии:: 0.24
int 10
n_samples_seen_ n_samples_seen_: int или ndarray формы (n_features,)

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

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

.. добавлено в версии:: 0.17
*scale_*
ndarray[float64](10,) [0.05,0.05,0.05,...,0.05,0.05,0.05]
var_ var_: ndarray формы (n_features,) или None

Дисперсия каждого признака в обучающем наборе. Используется для вычисления
`scale_`. Равно ``None``, если ``with_mean=False`` и
``with_std=False``.
ndarray[float64](10,) [0.,0.,0.,...,0.,0.,0.]
10 признаков
age
sex
bmi
bp
s1
s2
s3
s4
s5
s6
Параметры
hidden_layer_sizes hidden_layer_sizes: массивоподобный объект формы (n_layers - 2,), значение по умолчанию=(100,)

i-й элемент задаёт количество нейронов в i-м
скрытом слое.
(100, ...)
max_iter max_iter: int, значение по умолчанию=200

Максимальное количество итераций. Оптимизатор выполняет итерации до сходимости
(определяемой параметром 'tol') или до достижения этого количества итераций. Для стохастических
оптимизаторов ('sgd', 'adam') обратите внимание: этот параметр задаёт количество эпох
(сколько раз будут использованы все точки данных), а не количество шагов
градиентного спуска.
500
random_state random_state: int, экземпляр RandomState, значение по умолчанию=None

Определяет генерацию случайных чисел для инициализации весов и
смещений, разделения на обучающую и тестовую выборки при использовании ранней остановки, а также формирования пакетов
при solver='sgd' или 'adam'.
Передайте целое число, чтобы получать воспроизводимые результаты при нескольких вызовах функции.
См. :term:`Глоссарий <random_state>`.
0
tol tol: float, значение по умолчанию=1e-4

Допуск для оптимизации. Если функция потерь или оценка не улучшается
как минимум на ``tol`` в течение ``n_iter_no_change`` последовательных итераций,
то, если для ``learning_rate`` не задано значение 'adaptive', считается, что
сходимость достигнута, и обучение останавливается.
0.01
loss loss: {'squared_error', 'poisson'}, значение по умолчанию='squared_error'

Функция потерь, используемая при обучении весов. Обратите внимание, что
функции потерь "squared error" и "poisson" фактически реализуют
"half squares error" и "half poisson deviance", чтобы упростить
вычисление градиента. Кроме того, функция потерь "poisson" внутри использует
логарифмическую связь (экспонента в качестве функции активации на выходе) и требует
``y >= 0``.

.. versionchanged:: 1.7
Добавлены параметр `loss` и вариант 'poisson'.
'squared_error'
activation activation: {'identity', 'logistic', 'tanh', 'relu'}, значение по умолчанию='relu'

Функция активации для скрытого слоя.

- 'identity' — тождественная функция, полезная для реализации линейного узкого места,
возвращает f(x) = x

- 'logistic' — логистическая сигмоидная функция,
возвращает f(x) = 1 / (1 + exp(-x)).

- 'tanh' — гиперболический тангенс,
возвращает f(x) = tanh(x).

- 'relu' — функция линейного выпрямителя,
возвращает f(x) = max(0, x)
'relu'
solver solver: {'lbfgs', 'sgd', 'adam'}, значение по умолчанию='adam'

Оптимизатор для настройки весов.

- 'lbfgs' — оптимизатор из семейства квази-ньютоновских методов.

- 'sgd' означает стохастический градиентный спуск.

- 'adam' означает стохастический оптимизатор на основе градиента, предложенный
Кингмой, Дидериком и Джимми Ба

Сравнение оптимизатора Adam с SGD см. в разделе
:ref:`sphx_glr_auto_examples_neural_networks_plot_mlp_training_curves.py`.

Примечание. Оптимизатор 'adam', используемый по умолчанию, достаточно хорошо работает на относительно
больших наборах данных (с тысячами обучающих образцов или более) как с точки зрения
времени обучения, так и оценки на проверочной выборке.
Однако на небольших наборах данных 'lbfgs' может сходиться быстрее и работать
лучше.
'adam'
alpha alpha: float, значение по умолчанию=0.0001

Сила члена L2-регуляризации. При добавлении к функции потерь член L2-регуляризации
делится на размер выборки.
0.0001
batch_size batch_size: int, значение по умолчанию='auto'

Размер мини-пакетов для стохастических оптимизаторов.
Если используется solver 'lbfgs', регрессор не будет использовать мини-пакеты.
При значении "auto" используется `batch_size=min(200, n_samples)`.
'auto'
learning_rate learning_rate: {'constant', 'invscaling', 'adaptive'}, значение по умолчанию='constant'

Расписание изменения скорости обучения при обновлении весов.

- 'constant' — постоянная скорость обучения, задаваемая параметром
'learning_rate_init'.

- 'invscaling' — постепенное уменьшение скорости обучения ``learning_rate_``
на каждом временном шаге 't' с использованием показателя обратного масштабирования 'power_t'.
effective_learning_rate = learning_rate_init / pow(t, power_t)

- 'adaptive' — скорость обучения остаётся равной
'learning_rate_init', пока функция потерь на обучении продолжает уменьшаться.
Если на протяжении двух последовательных эпох функция потерь на обучении не уменьшается как минимум на
tol или оценка на проверочной выборке не увеличивается как минимум на tol при включённом
'early_stopping', текущая скорость обучения делится на 5.

Используется только при solver='sgd'.
'constant'
learning_rate_init learning_rate_init: float, значение по умолчанию=0.001

Начальная скорость обучения. Она задаёт размер шага
при обновлении весов. Используется только при solver='sgd' или 'adam'.
0.001
power_t power_t: float, значение по умолчанию=0.5

Показатель степени для обратного масштабирования скорости обучения.
Используется для обновления эффективной скорости обучения, когда для learning_rate
задано значение 'invscaling'. Используется только при solver='sgd'.
0.5
shuffle shuffle: bool, значение по умолчанию=True

Перемешивать ли образцы на каждой итерации. Используется только при
solver='sgd' или 'adam'.
True
verbose verbose: bool, значение по умолчанию=False

Выводить ли сообщения о ходе выполнения в stdout.
False
warm_start warm_start: bool, значение по умолчанию=False

Если задано значение True, результат предыдущего
вызова fit повторно используется в качестве начальной точки; в противном случае предыдущий результат
сбрасывается. См. :term:`Глоссарий <warm_start>`.
False
momentum momentum: float, значение по умолчанию=0.9

Импульс при обновлении градиентного спуска. Должен находиться в диапазоне от 0 до 1. Используется только
при solver='sgd'.
0.9
nesterovs_momentum nesterovs_momentum: bool, значение по умолчанию=True

Использовать ли импульс Нестерова. Используется только при solver='sgd' и
momentum > 0.
True
early_stopping early_stopping: bool, значение по умолчанию=False

Использовать ли раннюю остановку для завершения обучения, когда оценка на проверочной
выборке не улучшается. Если задано значение True, доля ``validation_fraction`` обучающих данных автоматически
откладывается для проверки, и обучение прекращается, если оценка на проверочной выборке не улучшается как минимум на
``tol`` в течение ``n_iter_no_change`` последовательных эпох.
Действует только при solver='sgd' или 'adam'.
False
validation_fraction validation_fraction: float, значение по умолчанию=0.1

Доля обучающих данных, выделяемая в проверочную выборку
для ранней остановки. Должна находиться в диапазоне от 0 до 1.
Используется только при значении early_stopping=True.
0.1
beta_1 beta_1: float, значение по умолчанию=0.9

Коэффициент экспоненциального затухания оценок вектора первого момента в Adam;
должен находиться в диапазоне [0, 1). Используется только при solver='adam'.
0.9
beta_2 beta_2: float, значение по умолчанию=0.999

Коэффициент экспоненциального затухания оценок вектора второго момента в Adam;
должен находиться в диапазоне [0, 1). Используется только при solver='adam'.
0.999
epsilon epsilon: float, default=1e-8

Значение для численной стабильности в adam. Используется только при solver='adam'.
1e-08
n_iter_no_change n_iter_no_change: int, default=10

Максимальное число эпох, в течение которых не достигается улучшение ``tol``.
Эффективно только при solver='sgd' или 'adam'.

.. versionadded:: 0.20
10
max_fun max_fun: int, default=15000

Используется только при solver='lbfgs'. Максимальное число вызовов функции.
Оптимизатор выполняет итерации до сходимости (определяемой ``tol``), достижения числа
итераций max_iter или указанного числа вызовов функции.
Обратите внимание: число вызовов функции будет больше или равно
числу итераций для MLPRegressor.

.. versionadded:: 0.22
15000
Обученные атрибуты
Имя Тип Значение
best_loss_ best_loss_: float

Минимальное значение функции потерь, достигнутое оптимизатором в процессе обучения.
Если `early_stopping=True`, этому атрибуту присваивается значение `None`. Вместо него см. обученный атрибут
`best_validation_score_`.
Доступен только при solver='sgd' или 'adam'.
float64 1110
best_validation_score_ best_validation_score_: float or None

Наилучшая оценка на валидационной выборке (то есть оценка R2), которая привела к
ранней остановке. Доступна только при `early_stopping=True`; в противном случае
атрибуту присваивается значение `None`.
Доступен только при solver='sgd' или 'adam'.
NoneType None
coefs_ coefs_: list of shape (n_layers - 1,)

i-й элемент списка представляет матрицу весов, соответствующую
слою i.
list [array([[ 2.26...1628603e-01]]), array([[ 0.16...pe=(100, 100)), array([[ 0.22... 0.43165108]])]
intercepts_ intercepts_: list of shape (n_layers - 1,)

i-й элемент списка представляет вектор смещения, соответствующий
слою i + 1.
list [array([ 0.369... 0.27554867]), array([ 0.313... 0.03395789]), array([0.3372181])]
loss_ loss_: float

Текущее значение функции потерь, вычисленное с помощью функции потерь.
float64 1110
loss_curve_ loss_curve_: list of shape (`n_iter_`,)

Значение функции потерь, вычисленное в конце каждого шага обучения.
i-й элемент списка представляет значение функции потерь на i-й итерации.
Доступен только при solver='sgd' или 'adam'.
list [np.float64(14432.825030436637), np.float64(14372.921005126946), np.float64(14311.387710317184), np.float64(14245.964671913125), ...]
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 10
n_iter_ n_iter_: int

Число итераций, выполненных оптимизатором.
int 500
n_layers_ n_layers_: int

Количество слоёв.
int 4
n_outputs_ n_outputs_: int

Количество выходов.
int 1
out_activation_ out_activation_: str

Название функции активации выходного слоя.
str 'id...ty'
t_ t_: int

Количество обучающих образцов, обработанных оптимизатором в процессе обучения.
Математически равно `n_iters * X.shape[0]`; это значение
`time_step`, используемое планировщиком скорости обучения оптимизатора.
int 221000
validation_scores_ validation_scores_: list of shape (`n_iter_`,) or None

Оценка на отложенной валидационной выборке на каждой итерации. Указывается
оценка R2. Доступен только при `early_stopping=True`;
в противном случае атрибуту присваивается значение `None`.
Доступен только при solver='sgd' или 'adam'.
NoneType None


Построение графиков частичной зависимости для двух признаков

Мы строим графики частичной зависимости для признаков «age» и «bmi» (индекс массы тела) для дерева решений. При использовании двух признаков from_estimator должна построить две кривые. В этом примере функция построения графика размещает сетку из двух графиков, используя пространство, заданное ax .

fig, ax = plt.subplots(figsize=(12, 6))
ax.set_title("Decision Tree")
tree_disp = PartialDependenceDisplay.from_estimator(tree, X, ["age", "bmi"], ax=ax)
Decision Tree

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

fig, ax = plt.subplots(figsize=(12, 6))
ax.set_title("Multi-layer Perceptron")
mlp_disp = PartialDependenceDisplay.from_estimator(
    mlp, X, ["age", "bmi"], ax=ax, line_kw={"color": "red"}
)
Multi-layer Perceptron

Совместное построение графиков частичной зависимости для двух моделей

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

Один из способов построить кривые — разместить их на одном рисунке, поместив кривые каждой модели в отдельную строку. Сначала создадим рисунок с двумя осями, расположенными в двух строках и одном столбце. Эти оси передаются функциям plot объектов tree_disp и mlp_disp. Функция построения графика использует переданные оси для отображения частичной зависимости. На полученном графике кривые частичной зависимости дерева решений располагаются в первой строке, а кривые многослойного перцептрона — во второй.

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
tree_disp.plot(ax=ax1)
ax1.set_title("Decision Tree")
mlp_disp.plot(ax=ax2, line_kw={"color": "red"})
ax2.set_title("Multi-layer Perceptron")
Decision Tree, Multi-layer Perceptron
Text(0.5, 1.0, 'Multi-layer Perceptron')

Другой способ сравнить кривые — наложить их друг на друга. Здесь мы создаём рисунок с одной строкой и двумя столбцами. Оси передаются функции plot в виде списка; в результате кривые частичной зависимости каждой модели будут построены на одних и тех же осях. Длина списка осей должна быть равна числу строящихся графиков.

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 6))
tree_disp.plot(ax=[ax1, ax2], line_kw={"label": "Decision Tree"})
mlp_disp.plot(
    ax=[ax1, ax2], line_kw={"label": "Multi-layer Perceptron", "color": "red"}
)
ax1.legend()
ax2.legend()
plot partial dependence visualization api
<matplotlib.legend.Legend object at 0x784116e5f230>

tree_disp.axes_ — это контейнер-массив numpy с осями, используемыми для построения графиков частичной зависимости. Его можно передать в mlp_disp, чтобы аналогичным образом наложить графики друг на друга. Кроме того, mlp_disp.figure_ хранит рисунок, что позволяет изменить его размер после вызова plot. В данном случае tree_disp.axes_ имеет два измерения, поэтому plot будет отображать подпись оси y и деления оси y только на самом левом графике.

tree_disp.plot(line_kw={"label": "Decision Tree"})
mlp_disp.plot(
    line_kw={"label": "Multi-layer Perceptron", "color": "red"}, ax=tree_disp.axes_
)
tree_disp.figure_.set_size_inches(10, 6)
tree_disp.axes_[0, 0].legend()
tree_disp.axes_[0, 1].legend()
plt.show()
plot partial dependence visualization api

Построение графика частичной зависимости для одного признака

Здесь мы строим кривые частичной зависимости для одного признака — «возраст» — на одних и тех же осях. В этом случае tree_disp.axes_ передаётся во вторую функцию построения графика.

tree_disp = PartialDependenceDisplay.from_estimator(tree, X, ["age"])
mlp_disp = PartialDependenceDisplay.from_estimator(
    mlp, X, ["age"], ax=tree_disp.axes_, line_kw={"color": "red"}
)
plot partial dependence visualization api

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_partial_dependence_visualization_api.ipynb

Download Python source code: plot_partial_dependence_visualization_api.py

Download zipped: plot_partial_dependence_visualization_api.zip

Похожие примеры

Графики частичной зависимости и индивидуального условного математического ожидания

Монотонные ограничения

Дискретизация непрерывных признаков с помощью KBinsDiscretizer

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

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

Spec-Zone.ru

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