Рубрики
Без рубрики

Классификация и регрессионный анализ с деревьями решений

Понимая фундаментальные концепции и математику, стоящую за деревьями решений, научитесь создавать деревья классификации и регрессии!. Tagged MachineLearning, Luctireed, Beginters, Python.

Следующие курсы xyz (11 серии деталей)

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

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

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

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

В этом уроке мы обсудим, как построить модель дерева решений с Python’s Scikit-learn библиотека. Мы будем покрывать:

  • Фундаментальные концепции деревьев решений
  • Математика, стоящая за алгоритмом обучения дерева решений
  • Информационная выгода и меры нечистоты
  • Классификационные деревья
  • Регрессионные деревья

Давайте начнем!

Этот учебник адаптирован из серии Python Machine Learning Next Tech, которая проходит через машинное обучение и алгоритмы глубокого обучения с Python от 0 до 100. Он включает в себя среду в песочнице в браузере со всем необходимым программным обеспечением и библиотеками, предварительно установленными, и проектами с использованием публичных наборов данных. Вы можете начать здесь!

Основы деревьев решений

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

Например, глядя на изображение выше, корневой узел – Работа, которую нужно сделать? и расщепляется в детские узлы Остаться в и Outlook Исходя из того, есть ли работа. Outlook Узел дополнительно разделяется на три дочерних узла.

Итак, как мы узнаем, какова оптимальная точка разделения в каждом узле?

Начиная с корня, данные разделены на функцию, которая приводит к наибольшему Информационная выгода ( ig ) (объяснено более подробно ниже). В итеративном процессе мы повторяем эту процедуру разделения на каждом Детский узел Пока листья не станут чистыми – то есть образцы в каждом узле, все принадлежат к одному классу.

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

Максимизация прироста информации

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

Здесь, f это функция для выполнения разделения, D p , D слева и D Правильно набор данных родительских и дочерних узлов, I это Мера примесей , N P это общее количество образцов в родительском узле и N слева и Не справа количество образцов в детских узлах.

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

Обратите внимание, что приведенное выше уравнение предназначено для бинарных деревьев решений – каждый родительский узел разделен только на два дочерних узла. Если у вас есть дерево решений с несколькими узлами, вы просто суммируете нечистоту всех узлов.

Классификационные деревья

Мы начнем с разговора о деревьях решений о классификации (также известны как Классификационные деревья ). Для этого примера мы будем использовать Радужная оболочка Набор данных, классика в области машинного обучения. Он содержит измерения 150 Радужная оболочка Цветы из трех разных видов – Setosa , Versicolor и Виригика . Это будет наш цели . Наша цель – предсказать какую категорию Радужная оболочка Цветок принадлежит. Длина и ширина лепестка в сантиметрах хранятся в виде столбцов, которые мы также называем Особенности набора данных.

Давайте сначала импортируем набор данных и назначим функции как X и цель как y :

from sklearn import datasets

iris = datasets.load_iris()                        # Load iris dataset

X = iris.data[:, [2, 3]]                           # Assign matrix X
y = iris.target                                    # Assign vector y

Используя Scikit-learn Теперь мы будем обучать дерево решений с максимальной глубиной 4. Код заключается в следующем:

from sklearn.tree import DecisionTreeClassifier    # Import decision tree classifier model

tree = DecisionTreeClassifier(criterion='entropy', # Initialize and fit classifier
    max_depth=4, random_state=1)
tree.fit(X, y)

Заметьте, что мы установили Критерий как ‘ энтропия ‘ Этот критерий известен как мера примесей (упомянутая в предыдущем разделе). В классификации энтропия является наиболее распространенной мерой примесей или критериями разделения. Это определено:

Здесь, P (i | t) это доля образцов, которые принадлежат классу C Для конкретного узла t . Следовательно, энтропия равен 0, если все образцы в узле принадлежат к одному классу, а энтропия максимальна, если у нас есть равномерное распределение классов.

Для более визуального понимания энтропии давайте построим индекс примеси для диапазона вероятностей [0, 1] для класса 1. Код заключается в следующем:

import numpy as np
import matplotlib.pyplot as plt

def entropy(p):
    return - p * np.log2(p) - (1 - p) * np.log2(1 - p)

x = np.arange(0.0, 1.0, 0.01)                      # Create dummy data
e = [entropy(p) if p != 0 else None for p in x]    # Calculate entropy

plt.plot(x, e, label='entropy', color='r')         # Plot impurity indices
for y in [0.5, 1.0]:
    plt.axhline(y=y, linewidth=1,
                color='k', linestyle='--')
plt.xlabel('p(i=1)')
plt.ylabel('Impurity Index')
plt.legend()
plt.show()

Как видите, энтропия равен 0, если P (i = 1 | T) Анкет Если классы распределены равномерно с P (i = 1 | T) .5 , энтропия 1.

Теперь возвращение к нашему Радужная оболочка Например, мы визуализируем наше обученное дерево классификации и посмотрим, как энтропия решает каждое разделение.

Хорошая функция в Scikit-learn это то, что это позволяет нам экспортировать дерево решений как .dot Файл после обучения, который мы можем визуализировать, используя Graphviz , Например. В дополнение к Graphviz мы будем использовать библиотеку Python под названием pydotplus , который имеет возможности, аналогичные GraphViz и позволяет нам преобразовать .dot Файлы данных в файл изображения дерева решений.

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

pip3 install pydotplus
apt install graphviz

Следующий код создаст изображение нашего дерева решений в формате PNG:

from pydotplus.graphviz import graph_from_dot_data
from sklearn.tree import export_graphviz

dot_data = export_graphviz(                           # Create dot data
    tree, filled=True, rounded=True,
    class_names=['Setosa', 'Versicolor','Virginica'],
    feature_names=['petal length', 'petal width'],
    out_file=None
)

graph = graph_from_dot_data(dot_data)                 # Create graph from dot data
graph.write_png('tree.png')                           # Write graph to PNG image

Глядя на полученную фигуру дерева решений, сохраненную в файле изображения Tree.png Теперь мы можем хорошо отследить разрывы, которые дерево решений определено из нашего набора учебных данных. Мы начали с 150 образцов в корне и разделили их на два дочерних узла с 50 и 100 образцами, используя Ширина лепестки отсечение ≤ 1,75 см. После первого разделения мы видим, что левый детский узел уже чист и содержит только образцы из setosa класс). Дальнейшие разделения справа затем используются для отделения образцов от Versicolor и Виригика класс.

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

Регрессионные деревья

Мы будем использовать Бостонское жилье Набор данных для нашего примера регрессии. Это еще один очень популярный набор данных, который содержит информацию о домах в пригороде Бостона. Есть 506 образцов и 14 атрибутов. В целях простоты и визуализации мы будем использовать только два – Medv (Средняя стоимость домов, занятых владельцем, за 1000 долларов США) в качестве цели и Lstat (процент более низкого статуса населения) в качестве этой особенности.

Давайте сначала импортируем необходимые атрибуты из Scikit-learn в Панды DataFrame.

import pandas as pd
from sklearn import datasets

boston = datasets.load_boston()            # Load Boston Dataset
df = pd.DataFrame(boston.data[:, 12])      # Create DataFrame using only the LSAT feature
df.columns = ['LSTAT']
df['MEDV'] = boston.target                 # Create new column with the target MEDV
df.head()

Давайте использовать Deciestreeregressor реализовано в Scikit-learn Чтобы тренировать дерево регрессии:

from sklearn.tree import DecisionTreeRegressor    # Import decision tree regression model

X = df[['LSTAT']].values                          # Assign matrix X
y = df['MEDV'].values                             # Assign vector y

sort_idx = X.flatten().argsort()                  # Sort X and y by ascending values of X
X = X[sort_idx]
y = y[sort_idx]

tree = DecisionTreeRegressor(criterion='mse',     # Initialize and fit regressor
                             max_depth=3)         
tree.fit(X, y)

Заметьте, что наш Критерий отличается от того, что мы использовали для нашего дерева классификации. Энтропия как мера примеси является полезным критерием для классификации. Однако, чтобы использовать дерево решений для регрессии, нам нужна метрика примесей, которая подходит для непрерывных переменных, поэтому мы определяем меру примесей, используя Средняя средняя квадратная ошибка ( mse ) вместо этого узлов детей:

Здесь, N t это количество тренировочных образцов в узле Т , D t это обучающее подмножество в узле t , y (i) это истинное целевое значение, и ŷ t является прогнозируемым целевым значением (среднее значение):

Теперь давайте моделируем отношения между Medv и Lstat Чтобы увидеть, как выглядит линия дерева регрессии:

plt.figure(figsize=(16, 8))
plt.scatter(X, y, c='steelblue',                  # Plot actual target against features
            edgecolor='white', s=70)
plt.plot(X, tree.predict(X),                      # Plot predicted target against features
         color='black', lw=2)
plt.xlabel('% lower status of the population [LSTAT]')
plt.ylabel('Price in $1000s [MEDV]')
plt.show()

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

Надеюсь, вам понравился этот урок по деревьям решений! Мы обсудили фундаментальные концепции деревьев решений, алгоритмы для минимизации примесей и того, как построить деревья решений как для классификации, так и для регрессии.

На практике важно знать, как выбрать подходящее значение для глубины дерева, чтобы не переполнять или недооценивать данные. Зная, как объединить деревья решений, чтобы сформировать ансамбль Случайный лес Также полезно, поскольку обычно он имеет лучшую производительность обобщения, чем отдельное дерево решений из -за случайности, что помогает уменьшить дисперсию модели. Он также менее чувствителен к выбросам в наборе данных и не требует большой настройки параметров.

Мы освещаем эти методы в нашем Python Machine Learning Серия, а также погружение в другие модели машинного обучения, такие как персептроны, адалина, линейная и полиномиальная регрессия, логистическая регрессия, SVM, ядра SVM, K-nearest-neighbors, модели для анализа настроений, кластеризация K-средних, DBSCAN, Convroteration Neur Сети и повторяющиеся нейронные сети.

Мы также рассмотрим другие темы, такие как регуляризация, обработка данных, выбор функций и извлечение, сокращение размерности, оценка модели, методы обучения ансамбля и развертывание модели машинного обучения.

Вы можете начать здесь !

Следующие курсы xyz (11 серии деталей)

Оригинал: “https://dev.to/nexttech/classification-and-regression-analysis-with-decision-trees-jgp”