0Pricing
Learn AI with Python · Урок

Деревья решений: теория и реализация

Неоднородность Джини, прирост информации, глубина дерева и переобучение — sklearn DecisionTreeClassifier.

«Деревья решений: теория и реализация» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.

Что такое дерево решений

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

Каждый внутренний узел проверяет один признак, каждая ветвь представляет результат, а каждый лист присваивает класс. Деревья легко интерпретировать, поскольку можно проследить путь принятых решений.

Нечистота Джини

Нечистота Джини показывает, насколько смешаны классы в узле. У чистого узла, содержащего только один класс, значение Джини равно 0.

Формула выглядит так: Gini = 1 - sum(p_i^2), где p_i — доля класса i. Дерево выбирает разбиения, которые сильнее всего уменьшают нечистоту.

import numpy as np

def gini(labels):
    classes, counts = np.unique(labels, return_counts=True)
    probs = counts / counts.sum()
    return 1 - np.sum(probs ** 2)

print(gini([0, 0, 1, 1]))   # 0.5 (max mix)
print(gini([0, 0, 0, 0]))   # 0.0 (pure)

Прирост информации и энтропия

Альтернативный критерий разбиения — прирост информации, основанный на энтропии. Энтропия вычисляется по формуле -sum(p_i * log2(p_i)).

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

import numpy as np

def entropy(labels):
    _, counts = np.unique(labels, return_counts=True)
    p = counts / counts.sum()
    return -np.sum(p * np.log2(p))

print(entropy([0, 0, 1, 1]))   # 1.0
print(entropy([0, 0, 0, 1]))   # ~0.81

Обучение DecisionTreeClassifier

Scikit-learn предоставляет DecisionTreeClassifier. Критерий разбиения выбирается с помощью параметра criterion (gini или entropy).

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)
Xtr, Xte, ytr, yte = train_test_split(X, y, random_state=0)

clf = DecisionTreeClassifier(criterion="gini", random_state=0)
clf.fit(Xtr, ytr)
print("Accuracy:", clf.score(Xte, yte))

Переобучение и max_depth

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

Параметр max_depth ограничивает глубину дерева и заставляет его обобщать закономерности. Меньшая глубина = более простая модель = меньшее переобучение.

from sklearn.tree import DecisionTreeClassifier

shallow = DecisionTreeClassifier(max_depth=3, random_state=0)
deep = DecisionTreeClassifier(max_depth=None, random_state=0)
# shallow generalizes better on unseen data;
# deep often overfits the training set

Другие параметры предварительного отсечения

Помимо max_depth, рост можно контролировать с помощью следующих параметров:

  • min_samples_split минимальное число образцов для разделения узла
  • min_samples_leaf минимальное число образцов в листе
  • max_leaf_nodes ограничение общего числа листьев

Все они уменьшают дисперсию и помогают бороться с переобучением.

from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier(
    max_depth=5,
    min_samples_split=10,
    min_samples_leaf=5,
    random_state=0,
)

Визуализация с помощью plot_tree

plot_tree отображает всё дерево, чтобы Вы могли изучить каждое разбиение, значение Джини и распределение классов в каждом узле.

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier(max_depth=3).fit(X, y)

plt.figure(figsize=(12, 6))
plot_tree(clf, filled=True, feature_names=load_iris().feature_names)
plt.show()

Важность признаков

После обучения feature_importances_ показывает, насколько каждый признак уменьшил нечистоту во всех разбиениях. Сумма значений равна 1.0.

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

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

data = load_iris()
clf = DecisionTreeClassifier(max_depth=3).fit(data.data, data.target)

for name, imp in zip(data.feature_names, clf.feature_importances_):
    print(f"{name}: {imp:.3f}")

Отсечение по сложности и стоимости (ccp_alpha)

Последующее отсечение сначала строит полное дерево, а затем удаляет слабые ветви. Параметр ccp_alpha управляет интенсивностью отсечения: большее значение альфа удаляет больше узлов.

Используйте cost_complexity_pruning_path, чтобы найти подходящие значения альфа.

from sklearn.tree import DecisionTreeClassifier

base = DecisionTreeClassifier(random_state=0)
path = base.cost_complexity_pruning_path(Xtr, ytr)
alphas = path.ccp_alphas

pruned = DecisionTreeClassifier(ccp_alpha=0.01, random_state=0)
pruned.fit(Xtr, ytr)

Выбор наилучшего значения альфа

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

from sklearn.tree import DecisionTreeClassifier

scores = []
for a in alphas:
    t = DecisionTreeClassifier(ccp_alpha=a, random_state=0)
    t.fit(Xtr, ytr)
    scores.append((a, t.score(Xte, yte)))

best = max(scores, key=lambda s: s[1])
print("Best alpha:", best[0])

Сильные и слабые стороны

Преимущества: понятность, отсутствие необходимости в масштабировании, обработка нелинейных границ и смешанных типов данных.

Недостатки: высокая дисперсия (небольшие изменения данных могут полностью изменить дерево), склонность к переобучению и только разбиения по осям. Эти недостатки служат причиной использовать ансамбли, например случайные леса.

Быстрая проверка

Проверьте, насколько Вы поняли концепции деревьев решений.

Итоги

Итоги: деревья решений разделяют данные с помощью нечистоты Джини или прироста информации. Контролируйте переобучение с помощью предварительного отсечения (max_depth, min_samples_leaf) или последующего отсечения (ccp_alpha). Анализируйте модели с помощью plot_tree и feature_importances_. Их высокая дисперсия служит причиной использовать ансамблевые методы.

Часто задаваемые вопросы

Урок «Деревья решений: теория и реализация» бесплатный?

Да — полный текст урока «Деревья решений: теория и реализация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.

Чему я научусь в уроке «Деревья решений: теория и реализация»?

Неоднородность Джини, прирост информации, глубина дерева и переобучение — sklearn DecisionTreeClassifier. Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn AI with Python?

Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Деревья решений: теория и реализация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn AI with Python?

Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Деревья решений: теория и реализация
  2. Случайные леса и бэггинг
  3. Градиентный бустинг: GBM и XGBoost
  4. LightGBM и CatBoost
← Назад к Learn AI with Python