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.398 секунды)

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

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

Изучение структуры дерева решений

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

Построение поверхности решений деревьев решений, обученных на наборе данных iris

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

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

Spec-Zone.ru

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