Дерево решений

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

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

Основные понятия дерева решений

  • Узел: Каждая точка в дереве называется узлом. Корневой узел — это начальная точка дерева, внутренние узлы — это точки принятия решений, а листовые узлы — окончательные результаты решения.
  • Ветвь: Путь от одного узла к другому называется ветвью.
  • Разделение: Процесс разделения набора данных на несколько подмножеств на основе определённого признака.
  • Чистота: Измеряет, согласованы ли классы образцов в подмножестве. Чем выше чистота, тем более похожи образцы в подмножестве.

Как работают деревья решений

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

  1. Выбор лучшего признака: Выберите лучший признак для разделения на основе определённых критериев (таких как прирост информации, индекс Джини и т.д.).
  2. Разделение набора данных: Разделите набор данных на несколько подмножеств на основе выбранного признака.
  3. Рекурсивное построение поддеревьев: Повторяйте описанный выше процесс для каждого подмножества, пока не будет достигнуто условие остановки (например, все образцы принадлежат одному классу, достигнута максимальная глубина и т.д.).
  4. Создание листовых узлов: Когда условие остановки выполнено, создайте листовой узел и присвойте класс или значение.

Критерии построения дерева решений

При построении дерева решений необходимо выбрать лучший признак для разбиения. К распространённым критериям относятся:

1. Прирост информации

Используется для задач классификации; измеряет улучшение чистоты набора данных после выбора признака. Формула расчёта:

гдеЭнтропия— это энтропия набора данных, используемая для измерения неопределённости данных.

2. Индекс Джини

Также является критерием разбиения для задач классификации. Формула расчёта:

где pi— доля образцов класса i. Чем меньше индекс Джини, тем чище набор данных.

3. Среднеквадратичная ошибка (MSE)

Используется для задач регрессии; измеряет разницу между предсказанными значениями и фактическими значениями.

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


Преимущества и недостатки деревьев решений

Преимущества

  • Легко понять и интерпретировать: структура дерева решений интуитивно понятна, её легко понять и интерпретировать.
  • Обработка нескольких типов данных: может обрабатывать числовые и категориальные данные.
  • Не требуется стандартизация данных: решающие деревья не требуют стандартизации или нормализации данных.

Недостатки

  • Склонность к переобучению: решающие деревья склонны к переобучению, особенно когда набор данных мал или глубина дерева велика.
  • Чувствительность к шуму: решающие деревья чувствительны к зашумлённым данным, что может ухудшить качество модели.
  • Нестабильность: небольшие изменения в данных могут привести к совершенно другому дереву.

Реализация решающего дерева на Python

Далее мы будем использоватьscikit-learnбиблиотека для реализации простого классификатора на основе решающего дерева.

1. Установите необходимые библиотеки

Сначала убедитесь, что у вас установленаscikit-learnбиблиотека. Если нет, вы можете установить её с помощью следующей команды:

pip install scikit-learn

2. Импортируйте библиотеки и загрузите набор данных

Мы будем использоватьscikit-learnвстроенный набор данных Iris для демонстрации использования решающих деревьев.

Пример

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

# Загрузить набор данных Iris
iris = load_iris()
X = iris.data
y = iris.target

# Разделите набор данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

3. Обучение модели дерева решений

Далее мы используемDecisionTreeClassifierдля обучения модели дерева решений.

Пример

# Создайте классификатор дерева решений
clf = DecisionTreeClassifier()

# Обучаем модель
clf.fit(X_train, y_train)

4. Прогнозирование и оценка

Используйте обученную модель для прогнозирования на тестовом наборе и оценки точности модели.

Пример

# Выполните прогноз на тестовом наборе
y_pred = clf.predict(X_test)

# Вычислите точность
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность модели: {accuracy:.2f}")

Результат вывода:

模型准确率: 1.00

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

Чтобы более наглядно понять структуру дерева решений, можно использоватьgraphvizбиблиотеку для визуализации дерева решений.

Адрес для скачивания Graphviz:https://graphviz.org/download/

  • В Windows можно скачать установочный пакет для Windows (файл .msi).
  • В Linux можно установить с помощью команды менеджера пакетов, напримерapt install graphviz
  • Команда установки для macOSbrew install graphviz。

Кроме того, можно установить из исходного кода, скачав последний пакет с исходным кодом (файл .tar.gz).

tar -zxvf graphviz-<version>.tar.gz
cd graphviz-<version>
./configure
make
sudo make install

После установки можно проверить, успешно ли установлен Graphviz, с помощью следующей команды:

dot -V

Если вывод похож на следующий, установка прошла успешно:

dot - graphviz version 12.2.1 (20241206.2353)

Установкаgraphvizбиблиотека:

Пример

pip install graphviz

Затем используйте следующий код для создания визуализации дерева решений:

Пример

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import export_graphviz
import graphviz


# Загрузить набор данных Iris
iris = load_iris()
X = iris.data
y = iris.target

# Разделите набор данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Создайте классификатор дерева решений
clf = DecisionTreeClassifier()

# Обучаем модель
clf.fit(X_train, y_train)

# Выполните прогноз на тестовом наборе
y_pred = clf.predict(X_test)

# Вычислите точность
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность модели: {accuracy:.2f}")

# Экспортировать дерево решений как dot-файл
dot_data = export_graphviz(clf, out_file=None,
                           feature_names=iris.feature_names,  
                           class_names=iris.target_names,  
                           filled=True, rounded=True,  
                           special_characters=True)

# Отобразить дерево решений с помощью graphviz
graph = graphviz.Source(dot_data)
graph.render("iris_decision_tree")  # Сохранить как PDF-файл
graph.view()  # Просмотреть в браузере

Выполнение приведённого выше кода создаст файл iris_decision_tree.pdf, отображаемый следующим образом:

Другие расширения