Алгоритмы классификации - дерево решений

Введение в дерево решений

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

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

В приведенном выше дереве решений вопрос - это узлы решения, а окончательные результаты - это листья. У нас есть следующие два типа деревьев решений:

  • Classification decision trees- В этом виде деревьев решений переменная решения категориальна. Приведенное выше дерево решений является примером дерева решений по классификации.

  • Regression decision trees - В таких деревьях решений переменная решения является непрерывной.

Реализация алгоритма дерева решений

Индекс Джини

Это имя функции стоимости, которая используется для оценки двоичных разбиений в наборе данных и работает с категориальной целевой переменной «Успех» или «Неудача».

Чем выше значение индекса Джини, тем выше однородность. Идеальное значение индекса Джини равно 0, а худшее - 0,5 (для задачи 2 класса). Индекс Джини для сплита можно рассчитать с помощью следующих шагов -

  • Сначала рассчитайте индекс Джини для подузлов, используя формулу p ^ 2 + q ^ 2, которая представляет собой сумму квадрата вероятности успеха и неудачи.

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

Алгоритм дерева классификации и регрессии (CART) использует метод Джини для создания двоичных разбиений.

Разделить создание

Разделение в основном включает атрибут в наборе данных и значение. Мы можем создать разделение в наборе данных с помощью следующих трех частей:

  • Part1: Calculating Gini Score - Мы только что обсуждали эту часть в предыдущем разделе.

  • Part2: Splitting a dataset- Это может быть определено как разделение набора данных на два списка строк, имеющих индекс атрибута и разделенное значение этого атрибута. После получения двух групп - правой и левой из набора данных, мы можем вычислить значение разделения, используя показатель Джини, рассчитанный в первой части. Значение разделения будет определять, в какой группе будет находиться атрибут.

  • Part3: Evaluating all splits- Следующая часть после нахождения показателя Джини и разделения набора данных - это оценка всех разделений. Для этого, во-первых, мы должны проверить каждое значение, связанное с каждым атрибутом, как возможное разбиение. Затем нам нужно найти наилучшее возможное разделение, оценив его стоимость. Лучшее разбиение будет использоваться в качестве узла в дереве решений.

Строим дерево

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

Часть 1: Создание терминального узла

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

  • Maximum Tree Depth- Как следует из названия, это максимальное количество узлов в дереве после корневого узла. Мы должны прекратить добавление конечных узлов, как только дерево достигнет максимальной глубины, т.е. когда дерево получит максимальное количество конечных узлов.

  • Minimum Node Records- Его можно определить как минимальное количество обучающих шаблонов, за которые отвечает данный узел. Мы должны прекратить добавление конечных узлов, как только дерево достигнет этого минимального количества записей узлов или ниже этого минимума.

Терминальный узел используется для окончательного прогноза.

Часть 2: Рекурсивное разделение

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

Предсказание

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

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

Предположения

Ниже приведены некоторые предположения, которые мы делаем при создании дерева решений.

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

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

  • На основе значений атрибутов записи распределяются рекурсивно.

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

Реализация на Python

пример

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

Сначала начнем с импорта необходимых пакетов Python -

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

Затем загрузите набор данных iris по его веб-ссылке следующим образом:

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
pima = pd.read_csv(r"C:\pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()
pregnant    glucose  bp    skin  insulin  bmi   pedigree    age   label
0       6         148      72    35     0       33.6    0.627     50      1
1       1         85       66    29     0       26.6    0.351     31      0
2       8         183      64     0     0       23.3    0.672     32      1
3       1         89       66    23     94      28.1    0.167     21      0
4       0         137      40    35     168     43.1    2.288     33      1

Теперь разделите набор данных на функции и целевую переменную следующим образом:

feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

Далее мы разделим данные на тренировочную и тестовую. Следующий код разделит набор данных на 70% данных обучения и 30% данных тестирования.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

Затем обучите модель с помощью класса DecisionTreeClassifier из sklearn следующим образом:

clf = DecisionTreeClassifier()
clf = clf.fit(X_train,y_train)

Наконец-то нам нужно сделать прогноз. Это можно сделать с помощью следующего скрипта -

y_pred = clf.predict(X_test)

Затем мы можем получить оценку точности, матрицу путаницы и отчет о классификации следующим образом:

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

Вывод

Confusion Matrix:
[[116 30]
[ 46 39]]
Classification Report:
            precision   recall   f1-score    support
      0       0.72      0.79       0.75     146
      1       0.57      0.46       0.51     85
micro avg     0.67      0.67       0.67     231
macro avg     0.64      0.63       0.63     231
weighted avg  0.66      0.67       0.66     231

Accuracy: 0.670995670995671

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

Приведенное выше дерево решений можно визуализировать с помощью следующего кода -

from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus

dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
      filled=True, rounded=True,
      special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('Pima_diabetes_Tree.png')
Image(graph.create_png())