Прунинг деревьев (или обрезка деревьев решений) — это процесс удаления ненужных ветвей в дереве, чтобы упростить модель и предотвратить переобучение. Обычно это делается путем удаления или сокращения узлов, которые добавляют мало полезной информации, что уменьшает сложность дерева без значительных потерь в точности. Существует несколько методов прунинга, включая предобрезку (pruning during tree construction) и постобрезку (pruning after tree construction), которые помогают сбалансировать общее количество узлов и глубину дерева, улучшая его обобщающую способность.
До обрезки включает остановку роста дерева раньше, чем оно полностью обучится. В процессе построения дерева принимаются решения о прекращении роста текущей ветви, если выполнение одного из критериев остановки.
Останавливает рост дерева, если оно достигает определенной глубины.
Останавливает рост дерева, если в узле меньше определенного количества образцов.
Останавливает рост дерева, если меньше определенного количества образцов в узле для разбиения.
Останавливает рост дерева, если уменьшение неопределенности после разбиения меньше определенного порога.
После обрезки включает создание полного дерева и затем удаление некоторых его ветвей. Этот метод часто считается более эффективным, так как позволяет создать дерево с максимальной сложностью и затем упрощать его
Дерево сначала обучается до полной глубины, а затем на валидационном наборе данных удаляются ветви, которые увеличивают ошибку.
Включает расчет ошибки для каждого поддерева и удаление тех, которые увеличивают общую ошибку меньше всего.
До обрезки
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}")
Ставь 👍 и забирай 📚 Базу знаний