Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью 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")

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()

Точность в зависимости от альфа для обучающей и тестовой выборок
Если 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()

Общее время выполнения скрипта: (0 минут 0.398 секунды)
Связанные примеры
© 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