Введение
В машинном обучении деревья решений являются широко используемыми моделями. Однако деревья решений имеют тенденцию к переобучению на обучающих данных, что может привести к их неэффективной работе на тестовых данных. Одним из способов предотвращения переобучения является усечение дерева решений. Затратная сложность усечения - популярный метод усечения деревьев решений. В этом практическом занятии мы будем использовать scikit - learn для демонстрации усечения деревьев решений по затратной сложности.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится полностью. Валидация операций не может быть автоматизирована из - за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка данных
Мы будем использовать набор данных о раке груди из 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 для выполнения усечения по стоимостной сложности для деревьев решений. Мы разделили данные на обучающую и тестовую выборки, определили подходящие значения альфа для усечения, обучили деревья решений с использованием эффективных значений альфа, построили график количества узлов и глубины дерева и определили наилучшее значение альфа для усечения на основе точности обучающей и тестовой выборок.