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

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

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

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

Давайте разберемся, как работает дерево решений, разбив его на узлы. Допустим, нам даны данные об автомобилях, и наша цель — выяснить, существует ли закономерность с мощностью, весом и типом автомобиля. Нашей целевой переменной будет Тип автомобиля с бинарными значениями L и S. (Рис. A)

Теперь, что делает дерево решений, так это то, что оно берет наш набор данных и применяет функцию к этому набору данных, который задается как (Вес›2000), на основе этого наша таблица будет разделена с данными на 2 разных таблицы, где первая таблица будет иметь вес больше 2000, а другая - меньше 2000.

Наша цель состоит в том, чтобы конечный узел, где наш Тип автомобиля, стал полностьюоднородным, чтобы достичь этого уровня, это дерево далее распределяет наши данные по на основе Horse-Power, после чего в приведенной ниже таблице мы видим, что наши данные не нуждаются в дальнейшем разделении, поскольку они совершенно однородны. Таким же образом работает наше дерево решений.

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

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

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

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

Чтобы понять функцию потерь, нам нужно понять, как она определяет чистоту/загрязненность целевого столбца. Есть 2 способа измерения примеси.

  1. Энтропия:- Энтропия заимствована из физики, в дереве решений энтропия в основном используется для выбора лучшего разделителя. Она помогает нам измерить чистоту разделения. Чистое разделение означает, что вы должны ответить да или нет.

Формула для энтропии дается как: -

Здесь p+ — вероятность положительного класса

p– вероятность отрицательного класса

S - подмножество обучающего примера

Как дерево решений использует энтропию?

Предположим, что у нас есть Режим доставки в данных, с помощью которого мы должны доставить посылку клиенту либо Обычным самолетом, либо Экспресс-авиакомпанией. В дереве ниже мы видим, что у нас есть сделал разделение, чтобы составить дерево решений.

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

Всегда помните, чем выше энтропия, тем ниже чистота и выше будет примесь. Обратите внимание, цель машинного обучения – снизить неопределенность или примесь в наборе данных. Для этого новая метрика под названием Прирост информации (Info Gain) на приведенном выше рисунке 2 показывает, насколько уменьшилась родительская энтропия после разделения функций.

ПРИМЕЧАНИЕ-:

Дополнительные математические концепции см. на странице ://towardsdatascience.com/entropy-how-decision-trees-make-decisions-2946b9c18c8.

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

Чистое разделение означает, что вы получаете либо Да, либо Нет.

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

Когда перестать разделяться?

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

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

Параметры регуляризации включают:-

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

2.min_sample_split — предел для остановки дальнейшего разделения узлов, когда количество наблюдений в узле меньше этого значения.

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

4.min_weight_fraction_leaf — то же, что и min_sample_leaf, но выражается в долях от общего количества взвешенных экземпляров.

5.max_leaf_nodes — максимальное количество листовых узлов в дереве.

6.max_feature_size — максимальное количество функций, которые оцениваются для разделения каждого узла.

Теперь давайте поработаем над Python, чтобы увидеть практическую реализацию дерева решений. Здесь, чтобы продемонстрировать вам, я использую набор данных о неплатежеспособных кредитных картах.

Для набора данных, пожалуйста, посетите:- https://www.kaggle.com/umangsaluja/credit-card-defaulters

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

%matplotlib inline
import numpy as np
import pandas as pd
# calculate accuracy measures and confusion matrix
from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier
from sklearn.feature_extraction.text import CountVectorizer
import pydotplus
from IPython.display import Image
from sklearn.metrics import classification_report

Загрузите набор данных и проверьте первые пять наблюдений.

# reading the dataset
credit_df = pd.read_csv("credit.csv")
credit_df.head()
Output:-

# data Info
credit_df.info()
# many columns are of type object, i.e., strings. These need to be converted to ordinal type.

После выполнения шагов EDA мы фиксируем целевой столбец («по умолчанию») в отдельные векторы для обучающего набора и тестового набора.

# capture the target column (“default”) into separate vectors for training set and test set
X = credit_df.drop("default" , axis=1)
y = credit_df.pop("default")

Используя («test_train_split»), мы разделили наши данные на 70:30 для обучения и тестирования.

# splitting data into training and test set for independent attributes
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=.30, random_state=1)

Наш следующий шаг — применить алгоритм дерева решений.

# invoking the decision tree classifier function. Using 'entropy' method of finding the split columns. Other option 
# could be gini index.  Restricting the depth of the tree to 5 (no particular reason for selecting this)
                                  
dt_model = DecisionTreeClassifier(criterion = 'entropy' )
DT=dt_model.fit(xtrain, ytrain)
Output:-
DecisionTreeClassifier(criterion='entropy')

Давайте построим дерево.

labels = xtrain.columns
# export a decision tree in DOT format
# pass the 'decision_tree' to export it to Graphviz
# pass the column names to 'feature_names'
# pass the required class labels to 'class_names'
dot_data = tree.export_graphviz(DT, feature_names = labels, class_names = ["0","1"])
# plot the decision tree using DOT format in 'dot_data'
graph = pydotplus.graph_from_dot_data(dot_data)
# display the decision tree
Image(graph.create_png())
Output:-

y_predict = DT.predict(xtrain)
print(dt_model.score(xtrain , ytrain))
print(dt_model.score(xtest , ytest))
Output:-
1.0    # Training 
0.6533333333333333 # Testing

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

Если вам понравилась эта статья, не забудьте хлопать, пока рука не начнет болеть :) Берегите себя, будьте здоровы, берегите себя и продолжайте учиться.

Спасибо.