Что такое обрезка?

Обычно обрезка - это процесс удаления выбранной части растения, такой как почка, ветви и корни. В дереве решений обрезка выполняет ту же задачу, что удаляет ветви дерева решений, чтобы преодолеть условие переобучения дерева решений. Это можно сделать двумя способами, мы подробно обсудим оба метода. Давайте начнем……….

1. После обрезки:

  • Этот прием используется после построения дерева решений.
  • Этот метод используется, когда дерево решений будет иметь очень большую глубину и покажет переоснащение модели.
  • Это также известно как обратная обрезка.
  • Этот метод используется, когда у нас есть бесконечно выросшее дерево решений.
  • Здесь мы будем управлять ветвями дерева решений max_depth и min_samples_split , используя cost_complexity_pruning

Я взял набор данных груди_cancer, который уже доступен в библиотеке sklearn.

я. Импорт библиотек

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import tree
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

ii. Моделирование без пост-обрезки

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)
clf.fit(X_train,y_train)
y_train_predicted=clf.predict(X_train)
y_test_predicted=clf.predict(X_test)
accuracy_score(y_train,y_train_predicted)
accuracy_score(y_test,y_test_predicted)
[out] >> 1.0  #Accuracy score of training dataset
         0.8811188811188811 #accuracy score of test dataset

Как мы видим, разница между оценкой точности поезда и теста слишком высока, значит, модель переоборудована (потому что она точна для обучающего набора, но дает большую ошибку, когда мы предоставляем тестовый набор для модели)

Визуализация дерева решений

plt.figure(figsize=(16,8))
tree.plot_tree(clf)
plt.show()

iii. Операция после обрезки:

Здесь мы используем технику cost_complexity_pruning, чтобы обрезать ветви дерева решений.

path=clf.cost_complexity_pruning_path(X_train,y_train)
#path variable gives two things ccp_alphas and impurities
ccp_alphas,impurities=path.ccp_alphas,path.impurities
print("ccp alpha wil give list of values :",ccp_alphas)
print("***********************************************************")
print("Impurities in Decision Tree :",impurities)
--------------------------------------------------------------------
[out]>> ccp alpha wil give list of values : [0.    0.00226647 0.00464743 0.0046598  0.0056338  0.00704225 0.00784194 0.00911402 0.01144366 0.018988   0.02314163 0.03422475 0.32729844]
********************************************************************
Impurities in Decision Tree : [0.    0.00453294 0.01847522 0.02313502 0.02876883 0.03581108 0.04365302 0.05276704 0.0642107  0.0831987  0.10634033 0.14056508  0.46786352]

ccp_alphas дает минимальное значение листа дерева решений, и каждый ccp_aphas будет создавать разные - разные классификаторы и выбирать из них лучший .ccp_alphas будет добавлен в качестве параметра в DecisionTreeClassifier().

clfs=[]   #will store all the models here
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("Last node in Decision tree is {} and ccp_alpha for last node is {}".format(clfs[-1].tree_.node_count,ccp_alphas[-1]))
[out] >> Last node in Decision tree is 1 and ccp_alpha for last node
         is 0.3272984419327777

Визуализация оценки точности для поезда и набора тестов.

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,02.

clf=DecisionTreeClassifier(random_state=0,ccp_alpha=0.02)
clf.fit(X_train,y_train)
plt.figure(figsize=(12,8))
tree.plot_tree(clf,rounded=True,filled=True)
plt.show()

Здесь мы можем обрезать бесконечно выросшее дерево. Давайте еще раз проверим показатель точности.

accuracy_score(y_test,clf.predict(X_test))
[out]>> 0.916083916083916

Следовательно, мы можем повысить точность нашей модели дерева решений с помощью отсечения.

2. Предварительная обрезка:

  • Этот прием используется перед построением дерева решений.
  • Предварительную обрезку можно выполнить с помощью настройки гиперпараметров.
  • Преодолейте проблему переобучения.
  • В этом блоге я буду использовать GridSearchCV для настройки гиперпараметров.

что такое настройка гиперпараметров?

Давайте возьмем пример дерева решений. Когда мы строим модель DT, мы не имеем никакого представления о том, какая _9 _ («джини» или «энтропия»), какая min_depth, какая min_samples_split и т. Д. Даст лучшую модель, поэтому, чтобы устранить эту двусмысленность, мы используем настройку гиперпараметров, в которой мы возьмите диапазон значений для каждого параметра, и какое бы значение параметра ни было лучше, мы передадим это конкретное значение в DecisionTreeClassifier().

grid_param={"criterion":["gini","entropy"],
             "splitter":["best","random"],
             "max_depth":range(2,50,1),
             "min_samples_leaf":range(1,15,1),
             "min_samples_split":range(2,20,1) 
            }
grid_search=GridSearchCV(estimator=clf,param_grid=grid_param,cv=5,n_jobs=-1)
grid_search.fit(X_train,y_train)

оценка - ›модель классификации, которую вы использовали, cv = 5 -› мы разделили наш набор данных на пять частей, n_jobs = -1 - ›мы выбрали итерацию по умолчанию

Теперь мы извлекаем из него лучший параметр, а затем этот параметр будет введен в DecisionTreeClassifier(), чтобы получить наиболее точную модель.

print(grid_search.best_params_)

Операция перед обрезкой:

clf=DecisionTreeClassifier(criterion= 'gini',max_depth= 17,min_samples_leaf= 3,min_samples_split= 12,splitter= 'random')
clf.fit(X_train,y_train)
plt.figure(figsize=(20,12))
tree.plot_tree(clf,rounded=True,filled=True)
plt.show()

Проверка оценки точности тестового набора данных после обрезки.

y_predicted=clf.predict(X_test)
accuracy_score(y_test,y_predicted)
[out]>> 0.9370629370629371

Вывод :

Это все с моей стороны, если у вас есть какие-либо предложения относительно этого блога, прокомментируйте их ниже. продолжайте учиться, продолжайте изучать ……