После усечения деревьев решений

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В машинном обучении деревья решений являются широко используемыми моделями. Однако деревья решений имеют тенденцию к переобучению на обучающих данных, что может привести к их неэффективной работе на тестовых данных. Одним из способов предотвращения переобучения является усечение дерева решений. Затратная сложность усечения - популярный метод усечения деревьев решений. В этом практическом занятии мы будем использовать scikit - learn для демонстрации усечения деревьев решений по затратной сложности.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится полностью. Валидация операций не может быть автоматизирована из - за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/tree("Decision Trees") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/tree -.-> lab-49095{{"После усечения деревьев решений"}} sklearn/model_selection -.-> lab-49095{{"После усечения деревьев решений"}} sklearn/datasets -.-> lab-49095{{"После усечения деревьев решений"}} ml/sklearn -.-> lab-49095{{"После усечения деревьев решений"}} end

Загрузка данных

Мы будем использовать набор данных о раке груди из scikit - learn. Этот набор данных имеет 30 признаков и бинарную целевую переменную, которая показывает, имеет ли пациент злокачественный или доброкачественный рак.

from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)

Разделение данных

Мы разделим данные на обучающий набор и тестовый набор.

from sklearn.model_selection import train_test_split

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

Определение подходящих значений альфа

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

from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt

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

Обучение деревьев решений

Далее мы обучим дерево решений, используя каждое из эффективных значений альфа. Последнее значение в ccp_alphas - это значение альфа, которое усекает целое дерево, оставляя дерево с только одним узлом.

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

Удаление тривиальных деревьев

Мы удалим тривиальное дерево с только одним узлом из списка деревьев решений.

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

Определение наилучшего значения альфа

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

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

Резюме

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