Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для скачивания полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder

Обрезка деревьев решений с помощью обрезки по стоимости и сложности

Класс DecisionTreeClassifier предоставляет параметры, такие как min_samples_leaf и max_depth, чтобы предотвратить переобучение дерева. Обрезка по стоимости и сложности предоставляет дополнительный способ управления размером дерева. В DecisionTreeClassifier этот метод обрезки параметризуется параметром стоимости и сложности, ccp_alpha. Большие значения ccp_alpha увеличивают количество удаленных узлов. Здесь мы показываем только влияние ccp_alpha на регуляризацию деревьев и как выбрать ccp_alpha на основе результатов валидации.

См. также Минимальная обрезка по стоимости и сложности для получения подробной информации об обрезке.

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

import matplotlib.pyplot as plt

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

Полная неоднородность листьев против эффективных альфа-значений обрезки дерева

Минимальная обрезка по стоимости и сложности рекурсивно находит узел с «наименее прочной связью». Наименее прочная связь характеризуется эффективным альфа-значением, где узлы с наименьшими эффективными альфа-значениями обрезаются в первую очередь. Чтобы получить представление о подходящих значениях ccp_alpha, scikit-learn предоставляет DecisionTreeClassifier.cost_complexity_pruning_path, возвращающий эффективные альфа-значения и соответствующие суммарные неоднородности листьев на каждой стадии процесса обрезки. По мере увеличения альфа-значения обрезается больше частей дерева, что увеличивает общую неоднородность его листьев.

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

clf = DecisionTreeClassifier(random_state=0)
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities

На следующем графике удалено максимальное эффективное значение альфа, так как это тривиальное дерево с единственным узлом.

fig, ax = plt.subplots()
ax.plot(ccp_alphas[:-1], impurities[:-1], marker="o", drawstyle="steps-post")
ax.set_xlabel("effective alpha")
ax.set_ylabel("total impurity of leaves")
ax.set_title("Total Impurity vs effective alpha for training set")
Total Impurity vs effective alpha for training set
Text(0.5, 1.0, 'Total Impurity vs effective alpha for training set')

Далее мы обучаем дерево решений, используя эффективные альфа-значения. Последнее значение в ccp_alphas - это значение альфа, которое обрезает всё дерево, оставляя дерево, clfs[-1], с одним узлом.

clfs = []
for ccp_alpha in ccp_alphas:
    clf = DecisionTreeClassifier(random_state=0, ccp_alpha=ccp_alpha)
    clf.fit(X_train, y_train)
    clfs.append(clf)
print(
    "Number of nodes in the last tree is: {} with ccp_alpha: {}".format(
        clfs[-1].tree_.node_count, ccp_alphas[-1]
    )
)
Number of nodes in the last tree is: 1 with ccp_alpha: 0.3272984419327777

Для остальной части примера мы удаляем последний элемент в clfs и ccp_alphas, так как это тривиальное дерево с единственным узлом. Здесь мы демонстрируем, что количество узлов и глубина дерева уменьшаются по мере увеличения альфа-значения.

clfs = clfs[:-1]
ccp_alphas = ccp_alphas[:-1]

node_counts = [clf.tree_.node_count for clf in clfs]
depth = [clf.tree_.max_depth for clf in clfs]
fig, ax = plt.subplots(2, 1)
ax[0].plot(ccp_alphas, node_counts, marker="o", drawstyle="steps-post")
ax[0].set_xlabel("alpha")
ax[0].set_ylabel("number of nodes")
ax[0].set_title("Number of nodes vs alpha")
ax[1].plot(ccp_alphas, depth, marker="o", drawstyle="steps-post")
ax[1].set_xlabel("alpha")
ax[1].set_ylabel("depth of tree")
ax[1].set_title("Depth vs alpha")
fig.tight_layout()
Number of nodes vs alpha, Depth vs alpha

Точность против альфа для обучающей и тестовой выборок

При установке ccp_alpha в ноль и сохранении других значений параметров по умолчанию для DecisionTreeClassifier, дерево переобучается, что приводит к 100% точности на обучающей выборке и 88% на тестовой. По мере увеличения альфа-значения обрезается больше частей дерева, тем самым создаётся дерево решений, которое лучше обобщает. В этом примере установка ccp_alpha=0.015 максимизирует точность на тестовой выборке.

train_scores = [clf.score(X_train, y_train) for clf in clfs]
test_scores = [clf.score(X_test, y_test) for clf in clfs]

fig, ax = plt.subplots()
ax.set_xlabel("alpha")
ax.set_ylabel("accuracy")
ax.set_title("Accuracy vs alpha for training and testing sets")
ax.plot(ccp_alphas, train_scores, marker="o", label="train", drawstyle="steps-post")
ax.plot(ccp_alphas, test_scores, marker="o", label="test", drawstyle="steps-post")
ax.legend()
plt.show()
Accuracy vs alpha for training and testing sets

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_cost_complexity_pruning.ipynb

Download Python source code: plot_cost_complexity_pruning.py

Download zipped: plot_cost_complexity_pruning.zip

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

Понимание структуры дерева решений

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

График поверхности решений деревьев решений, обученных на наборе данных о цветах ириса

Обзор мета-эстиматоров для обучения многоклассовой классификации

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/tree/plot_cost_complexity_pruning.html

Spec-Zone.ru

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