🤔 Как делается прунинг деревьев?



Прунинг деревьев (или обрезка деревьев решений) — это процесс удаления ненужных ветвей в дереве, чтобы упростить модель и предотвратить переобучение. Обычно это делается путем удаления или сокращения узлов, которые добавляют мало полезной информации, что уменьшает сложность дерева без значительных потерь в точности. Существует несколько методов прунинга, включая предобрезку (pruning during tree construction) и постобрезку (pruning after tree construction), которые помогают сбалансировать общее количество узлов и глубину дерева, улучшая его обобщающую способность.



🚩До обрезки (Pre-pruning)



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



🟠Максимальная глубина дерева (max depth)

Останавливает рост дерева, если оно достигает определенной глубины.

🟠Минимальное количество образцов в листе (min samples leaf)

Останавливает рост дерева, если в узле меньше определенного количества образцов.

🟠Минимальное количество образцов для разбиения (min samples split)

Останавливает рост дерева, если меньше определенного количества образцов в узле для разбиения.

🟠Минимальная информационная выгода (min impurity decrease)

Останавливает рост дерева, если уменьшение неопределенности после разбиения меньше определенного порога.



🚩После обрезки (Post-pruning)



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



🟠Обрезка на основе ошибки на валидационном наборе

Дерево сначала обучается до полной глубины, а затем на валидационном наборе данных удаляются ветви, которые увеличивают ошибку.

🟠Обрезка на основе критерия минимальной ошибки (cost complexity pruning)

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



🚩Пример обрезки деревьев



До обрезки

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier

from sklearn.model_selection import train_test_split



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

data = load_iris()

X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)



# Модель с параметрами до обрезки

model_pre_pruning = DecisionTreeClassifier(max_depth=3, min_samples_split=4, min_samples_leaf=2)

model_pre_pruning.fit(X_train, y_train)



# Оценка модели

print(f"Точность на тестовом наборе (до обрезки): {model_pre_pruning.score(X_test, y_test)}")




После обрезки

from sklearn.tree import DecisionTreeClassifier

from sklearn.tree import plot_tree

import matplotlib.pyplot as plt



# Создание и обучение дерева без обрезки

model = DecisionTreeClassifier()

model.fit(X_train, y_train)



# Построение полного дерева

plt.figure(figsize=(20,10))

plot_tree(model, filled=True)

plt.show()



# Применение после обрезки с помощью параметра cost_complexity_pruning

path = model.cost_complexity_pruning_path(X_train, y_train)

ccp_alphas, impurities = path.ccp_alphas, path.impurities



# Обучение моделей для каждого значения alpha

models = []

for ccp_alpha in ccp_alphas:

model = DecisionTreeClassifier(ccp_alpha=ccp_alpha)

model.fit(X_train, y_train)

models.append(model)



# Выбор лучшей модели на основе валидационного набора

best_model = None

best_score = 0

for model in models:

score = model.score(X_test, y_test)

if score > best_score:

best_model = model

best_score = score



# Оценка лучшей модели

print(f"Точность на тестовом наборе (после обрезки): {best_score}")




Ставь 👍 и забирай 📚 Базу знаний