Spec-Zone.ru › scikit-learn

Примечание

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

Регрессия с помощью дерева решений

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

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

Дерево решений для задачи регрессии с одним выходом

Здесь мы обучаем дерево для задачи регрессии с одним выходом.

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

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

Создание случайного одномерного набора данных

import numpy as np

rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(16))

Обучение модели регрессии

Здесь мы обучаем две модели с разными значениями максимальной глубины

from sklearn.tree import DecisionTreeRegressor

regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
DecisionTreeRegressor(max_depth=5)
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте выполнение ноутбука.
На GitHub HTML-представление не отображается; попробуйте открыть эту страницу на nbviewer.org.
Параметры
max_depth max_depth: int, default=None

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

Пример влияния ``max_depth`` на модель см. в разделе
:ref:`sphx_glr_auto_examples_tree_plot_tree_regression.py`.
5
criterion criterion: {"squared_error", "absolute_error", "poisson"}, default="squared_error"

Функция для измерения качества разбиения. Поддерживаются критерии
"squared_error" для среднеквадратичной ошибки, которая эквивалентна
уменьшению дисперсии при отборе признаков и минимизирует потери L2
с использованием среднего значения в каждом конечном узле, "absolute_error" для средней
абсолютной ошибки, которая минимизирует потери L1 с использованием медианы в каждом конечном
узле, и "poisson", использующий уменьшение девианса Пуассона для поиска разбиений,
также с использованием среднего значения в каждом конечном узле.

.. versionadded:: 0.18
Критерий средней абсолютной ошибки (MAE).

.. versionadded:: 0.24
Критерий девианса Пуассона.

.. versionchanged:: 1.9
Критерий `"friedman_mse"` объявлен устаревшим.
'squared_error'
splitter splitter: {"best", "random"}, default="best"

Стратегия выбора разбиения в каждом узле. Поддерживаются стратегии
"best" для выбора наилучшего разбиения и "random" для выбора
наилучшего случайного разбиения.
'best'
min_samples_split min_samples_split: int or float, default=2

Минимальное количество образцов, необходимое для разбиения внутреннего узла:

- Если задано целое число, `min_samples_split` задаёт минимальное количество образцов.
- Если задано число с плавающей точкой, `min_samples_split` является долей, а
`ceil(min_samples_split * n_samples)` задаёт минимальное
количество образцов для каждого разбиения.

.. versionchanged:: 0.18
Добавлена возможность задавать доли числами с плавающей точкой.
2
min_samples_leaf min_samples_leaf: int or float, default=1

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

- Если задано целое число, `min_samples_leaf` задаёт минимальное количество образцов.
- Если задано число с плавающей точкой, `min_samples_leaf` является долей, а
`ceil(min_samples_leaf * n_samples)` задаёт минимальное
количество образцов для каждого узла.

.. versionchanged:: 0.18
Добавлена возможность задавать доли числами с плавающей точкой.
1
min_weight_fraction_leaf min_weight_fraction_leaf: float, default=0.0

Минимальная взвешенная доля от общей суммы весов (всех
входных образцов), необходимая для листового узла. Если параметр sample_weight не задан,
все образцы имеют одинаковый вес.
0.0
max_features max_features: int, float or {"sqrt", "log2"}, default=None

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

- Если задано целое число, при каждом разбиении рассматривается `max_features` признаков.
- Если задано число с плавающей точкой, `max_features` является долей, и
при каждом разбиении рассматривается `max(1, int(max_features * n_features_in_))` признаков.
- Если задано значение "sqrt", то `max_features=sqrt(n_features)`.
- Если задано значение "log2", то `max_features=log2(n_features)`.
- Если задано значение None, то `max_features=n_features`.

Примечание: поиск разбиения не прекращается, пока не будет найдено хотя бы одно
допустимое разбиение образцов узла, даже если для этого потребуется
фактически проверить больше признаков, чем указано в ``max_features``.
None
random_state random_state: int, экземпляр RandomState или None, default=None

Управляет случайностью алгоритма. Признаки всегда
случайным образом переставляются при каждом разбиении, даже если для ``splitter`` задано
``"best"``. Если ``max_features < n_features``, алгоритм
случайным образом выбирает ``max_features`` признаков при каждом разбиении, прежде чем найти среди них наилучшее
разбиение. Однако наилучшее найденное разбиение может различаться в разных
запусках, даже если ``max_features=n_features``. Это происходит, если
критерий одинаково улучшается для нескольких разбиений и одно из них
необходимо выбрать случайным образом. Чтобы при обучении получить детерминированное поведение,
параметру ``random_state`` необходимо присвоить целое число.
Подробнее см. :term:`глоссарий <random_state>`.
None
max_leaf_nodes max_leaf_nodes: int, default=None

Выращивать дерево с ``max_leaf_nodes`` в порядке наилучшего первого разбиения.
Наилучшие узлы определяются по относительному уменьшению неоднородности.
Если задано None, количество листовых узлов не ограничено.
None
min_impurity_decrease min_impurity_decrease: float, default=0.0

Узел будет разделён, если это разбиение уменьшает неоднородность
на величину, большую или равную этому значению.

Уравнение для взвешенного уменьшения неоднородности выглядит следующим образом::

N_t / N * (impurity - N_t_R / N_t * right_impurity
- N_t_L / N_t * left_impurity)

где ``N`` — общее количество образцов, ``N_t`` — количество
образцов в текущем узле, ``N_t_L`` — количество образцов в левом дочернем узле, а ``N_t_R`` — количество образцов в правом дочернем узле.

Если передан параметр ``sample_weight``, величины ``N``, ``N_t``, ``N_t_R`` и ``N_t_L``
обозначают взвешенные суммы.

.. versionadded:: 0.19
0.0
ccp_alpha ccp_alpha: неотрицательное число с плавающей точкой, default=0.0

Параметр сложности, используемый для отсечения по методу минимальной стоимости и сложности. Будет выбрано
поддерево с наибольшей стоимостью и сложностью, которая меньше
``ccp_alpha``. По умолчанию отсечение не выполняется. Подробнее см.
:ref:`minimal_cost_complexity_pruning`. Пример такого отсечения см.
в разделе :ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`.

.. versionadded:: 0.22
0.0
monotonic_cst monotonic_cst: массивоподобный объект из целых чисел формы (n_features), default=None

Задаёт ограничение монотонности для каждого признака.
- 1: монотонное возрастание
- 0: без ограничений
- -1: монотонное убывание

Если monotonic_cst равен None, ограничения не применяются.

Ограничения монотонности не поддерживаются для:
- регрессии с несколькими выходами (то есть когда `n_outputs_ > 1`).

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

.. versionadded:: 1.4
None
Обученные атрибуты
Имя Тип Значение
feature_importances_ feature_importances_: ndarray формы (n_features,)

Важности признаков.
Чем выше значение, тем важнее признак.
Важность признака вычисляется как
(нормированное) суммарное уменьшение критерия, обусловленное
этим признаком. Также этот показатель известен как важность Джини [4]_.

Предупреждение: важность признаков на основе неоднородности может быть недостоверной для
признаков с большим количеством категорий (множеством уникальных значений). В качестве альтернативы см.
:func:`sklearn.inspection.permutation_importance`.
ndarray[float64](1,) [1.]
max_features_ max_features_: int

Выведенное значение max_features.
int 1
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 1
n_outputs_ n_outputs_: int

Количество выходов при выполнении ``fit``.
int 1
tree_ tree_: экземпляр Tree

Объект Tree, лежащий в основе модели. Описание атрибутов объекта Tree см. в
``help(sklearn.tree._tree.Tree)``, а примеры их использования — в разделе
:ref:`sphx_glr_auto_examples_tree_plot_unveil_tree_structure.py`.
Tree <sklearn.tree...x784129e47280>


Предсказание

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

X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)

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

import matplotlib.pyplot as plt

plt.figure()
plt.scatter(X, y, s=20, edgecolor="black", c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()
Decision Tree Regression

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

Регрессия дерева решений с целевыми переменными с несколькими выходами

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

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

Создание случайного набора данных

rng = np.random.RandomState(1)
X = np.sort(200 * rng.rand(100, 1) - 100, axis=0)
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y[::5, :] += 0.5 - rng.rand(20, 2)

Обучение модели регрессии

regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_3 = DecisionTreeRegressor(max_depth=8)
regr_1.fit(X, y)
regr_2.fit(X, y)
regr_3.fit(X, y)
DecisionTreeRegressor(max_depth=8)
В среде Jupyter повторно выполните эту ячейку, чтобы отобразить HTML-представление, или доверьте этой записной книжке.
На GitHub HTML-представление отобразить невозможно; попробуйте открыть эту страницу с помощью nbviewer.org.
Параметры
max_depth max_depth: int, по умолчанию=None

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

Пример того, как ``max_depth`` влияет на модель, см. в разделе
:ref:`sphx_glr_auto_examples_tree_plot_tree_regression.py`.
8
criterion criterion: {"squared_error", "absolute_error", "poisson"}, по умолчанию="squared_error"

Функция для измерения качества разбиения. Поддерживаются критерии
"squared_error" для среднеквадратичной ошибки, которая эквивалентна
уменьшению дисперсии в качестве критерия отбора признаков и минимизирует
потери L2 с использованием среднего значения в каждом конечном узле,
"absolute_error" для средней абсолютной ошибки, которая минимизирует
потери L1 с использованием медианы в каждом конечном узле, и "poisson",
использующий уменьшение девианса Пуассона для поиска разбиений,
также с использованием среднего значения в каждом конечном узле.

.. versionadded:: 0.18
Критерий средней абсолютной ошибки (MAE).

.. versionadded:: 0.24
Критерий девианса Пуассона.

.. versionchanged:: 1.9
Критерий `"friedman_mse"` объявлен устаревшим.
'squared_error'
splitter splitter: {"best", "random"}, по умолчанию="best"

Стратегия выбора разбиения в каждом узле. Поддерживаются
стратегии "best" для выбора наилучшего разбиения и "random" для выбора
наилучшего случайного разбиения.
'best'
min_samples_split min_samples_split: int или float, по умолчанию=2

Минимальное количество образцов, необходимое для разбиения внутреннего узла:

- Если задано целое число, `min_samples_split` считается минимальным количеством.
- Если задано число с плавающей точкой, `min_samples_split` является долей, а
`ceil(min_samples_split * n_samples)` — минимальное
количество образцов для каждого разбиения.

.. versionchanged:: 0.18
Добавлена возможность задавать доли числами с плавающей точкой.
2
min_samples_leaf min_samples_leaf: int или float, по умолчанию=1

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

- Если задано целое число, `min_samples_leaf` считается минимальным количеством.
- Если задано число с плавающей точкой, `min_samples_leaf` является долей, а
`ceil(min_samples_leaf * n_samples)` — минимальное
количество образцов для каждого узла.

.. versionchanged:: 0.18
Добавлена возможность задавать доли числами с плавающей точкой.
1
min_weight_fraction_leaf min_weight_fraction_leaf: float, по умолчанию=0.0

Минимальная взвешенная доля от суммы весов (всех
входных образцов), необходимая для листового узла. Если sample_weight
не задан, образцы имеют одинаковые веса.
0.0
max_features max_features: int, float или {"sqrt", "log2"}, по умолчанию=None

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

- Если задано целое число, при каждом разбиении рассматривается `max_features` признаков.
- Если задано число с плавающей точкой, `max_features` является долей, и
при каждом разбиении рассматривается `max(1, int(max_features * n_features_in_))` признаков.
- Если задано "sqrt", то `max_features=sqrt(n_features)`.
- Если задано "log2", то `max_features=log2(n_features)`.
- Если задано None, то `max_features=n_features`.

Примечание: поиск разбиения не прекращается, пока не будет найдено хотя бы одно
допустимое разбиение образцов узла, даже если для этого потребуется
фактически проверить больше признаков, чем указано в ``max_features``.
None
random_state random_state: int, экземпляр RandomState или None, по умолчанию=None

Управляет случайностью оценивателя. Признаки всегда
случайным образом переставляются при каждом разбиении, даже если для ``splitter`` задано
``"best"``. Если ``max_features < n_features``, алгоритм
случайным образом выберет ``max_features`` признаков при каждом разбиении, а затем найдёт наилучшее
разбиение среди них. Однако наилучшее найденное разбиение может различаться в разных
запусках, даже если ``max_features=n_features``. Это происходит, если
улучшение критерия одинаково для нескольких разбиений и одно из них
выбирается случайным образом. Чтобы обеспечить детерминированное поведение
при обучении, для ``random_state`` необходимо задать целое число.
Подробности см. в :term:`Глоссарии <random_state>`.
None
max_leaf_nodes max_leaf_nodes: int, по умолчанию=None

Выращивает дерево с ``max_leaf_nodes`` в порядке наилучшего первого.
Наилучшие узлы определяются относительным уменьшением неоднородности.
Если задано None, количество листовых узлов не ограничено.
None
min_impurity_decrease min_impurity_decrease: float, по умолчанию=0.0

Узел разбивается, если это разбиение уменьшает неоднородность
на величину, превышающую это значение или равную ему.

Формула взвешенного уменьшения неоднородности выглядит следующим образом::

N_t / N * (impurity - N_t_R / N_t * right_impurity
- N_t_L / N_t * left_impurity)

где ``N`` — общее количество образцов, ``N_t`` — количество
образцов в текущем узле, ``N_t_L`` — количество образцов в
левом дочернем узле, а ``N_t_R`` — количество образцов в правом дочернем узле.

Если передан ``sample_weight``, то ``N``, ``N_t``, ``N_t_R`` и ``N_t_L``
обозначают взвешенные суммы.

.. versionadded:: 0.19
0.0
ccp_alpha ccp_alpha: неотрицательное число с плавающей точкой, по умолчанию=0.0

Параметр сложности, используемый для минимального отсечения с учётом стоимости и сложности. Будет выбрано
поддерево с наибольшей стоимостью сложности, меньшей, чем
``ccp_alpha``. По умолчанию отсечение не выполняется. Подробности см.
в разделе :ref:`minimal_cost_complexity_pruning`. Пример такого отсечения см.
в разделе :ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py`.

.. versionadded:: 0.22
0.0
monotonic_cst monotonic_cst: объект, подобный массиву целых чисел формы (n_features), по умолчанию=None

Указывает ограничения монотонности, применяемые к каждому признаку.
- 1: монотонное возрастание
- 0: без ограничений
- -1: монотонное убывание

Если monotonic_cst равен None, ограничения не применяются.

Ограничения монотонности не поддерживаются для:
- регрессии с несколькими выходами (то есть когда `n_outputs_ > 1`).

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

.. versionadded:: 1.4
None
Обученные атрибуты
Имя Тип Значение
feature_importances_ feature_importances_: ndarray формы (n_features,)

Важность признаков.
Чем выше значение, тем важнее признак.
Важность признака вычисляется как
(нормированное) суммарное уменьшение критерия, обусловленное
этим признаком. Также известна как важность Джини [4]_.

Предупреждение: важность признаков, основанная на неоднородности, может вводить в заблуждение для
признаков с большим количеством уникальных значений. В качестве альтернативы см.
:func:`sklearn.inspection.permutation_importance`.
ndarray[float64](1,) [1.]
max_features_ max_features_: int

Выведенное значение max_features.
int 1
n_features_in_ n_features_in_: int

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

.. versionadded:: 0.24
int 1
n_outputs_ n_outputs_: int

Количество выходов при выполнении ``fit``.
int 2
tree_ tree_: экземпляр Tree

Базовый объект Tree. Описание атрибутов объекта Tree см.
в ``help(sklearn.tree._tree.Tree)``, а примеры использования этих атрибутов —
в разделе :ref:`sphx_glr_auto_examples_tree_plot_unveil_tree_structure.py`.
Tree <sklearn.tree...x784129e472f0>


Прогнозирование

Получение прогнозов для тестового набора

X_test = np.arange(-100.0, 100.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)

Визуализация результатов

plt.figure()
s = 25
plt.scatter(y[:, 0], y[:, 1], c="yellow", s=s, edgecolor="black", label="data")
plt.scatter(
    y_1[:, 0],
    y_1[:, 1],
    c="cornflowerblue",
    s=s,
    edgecolor="black",
    label="max_depth=2",
)
plt.scatter(y_2[:, 0], y_2[:, 1], c="red", s=s, edgecolor="black", label="max_depth=5")
plt.scatter(y_3[:, 0], y_3[:, 1], c="blue", s=s, edgecolor="black", label="max_depth=8")
plt.xlim([-6, 6])
plt.ylim([-6, 6])
plt.xlabel("target 1")
plt.ylabel("target 2")
plt.title("Multi-output Decision Tree Regression")
plt.legend(loc="best")
plt.show()
Multi-output Decision Tree Regression

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

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_tree_regression.ipynb

Download Python source code: plot_tree_regression.py

Download zipped: plot_tree_regression.zip

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

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

Сравнение случайных лесов и метаоценивателя с несколькими выходами

Преобразования признаков с помощью ансамблей деревьев

Поверхности решений ансамблей деревьев на наборе данных iris

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

Spec-Zone.ru

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