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

В этом уроке вы затронете следующие темы:

  • Алгоритм дерева решений
  • Как работает алгоритм дерева решений?
  • Показатели выбора атрибутов
  • Получение информации
  • Коэффициент усиления
  • Индекс Джини
  • Оптимизация производительности дерева решений
  • Построение классификатора в Scikit-learn
  • Плюсы и минусы
  • Вывод

Алгоритм дерева решений

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

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

Как работает алгоритм дерева решений?

Основная идея любого алгоритма дерева решений заключается в следующем:

  1. Выберите лучший атрибут, используя меры выбора атрибутов (ASM), чтобы разделить записи.
  2. Сделайте этот атрибут узлом решения и разбейте набор данных на более мелкие подмножества.
  3. Запускает построение дерева, рекурсивно повторяя этот процесс для каждого дочернего элемента, пока не совпадет одно из условий:
  • Все кортежи принадлежат одному и тому же значению атрибута.
  • Оставшихся атрибутов больше нет.
  • Больше экземпляров нет.

1. Меры выбора атрибутов

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

2. Получение информации

Шеннон изобрел понятие энтропии, которая измеряет нечистоту входного множества. В физике и математике под энтропией понимают случайность или примесь в системе. В теории информации это относится к примеси в группе примеров. Прирост информации — это уменьшение энтропии. Прирост информации вычисляет разницу между энтропией до разделения и средней энтропией после разделения набора данных на основе заданных значений атрибутов. Алгоритм дерева решений ID3 (итеративный дихотомайзер) использует прирост информации.

Где Pi — вероятность того, что произвольный набор из D принадлежит классу Ci.

Где,

  • Info(D) — это среднее количество информации, необходимой для идентификации метки класса кортежа в D.
  • |Dj|/|D| действует как вес j-го раздела.
  • InfoA(D) — это ожидаемая информация, необходимая для классификации кортежа из D на основе разбиения с помощью A.

Атрибут A с наибольшим приростом информации, Gain(A), выбирается в качестве атрибута разделения в узле N().

3. Коэффициент усиления

Получение информации смещено для атрибута со многими результатами. Это означает, что он предпочитает атрибут с большим количеством различных значений. Например, рассмотрим атрибут с уникальным идентификатором, таким как customer_ID, имеет нулевую информацию (D) из-за чистого раздела. Это максимизирует прирост информации и создает бесполезное разделение.

C4.5, усовершенствование ID3, использует расширение для получения информации, известное как коэффициент усиления. Коэффициент усиления решает проблему смещения, нормализуя прирост информации с помощью Split Info. Java-реализация алгоритма C4.5, известная как J48, доступна в инструменте интеллектуального анализа данных WEKA.

Где,

  • |Dj|/|D| действует как вес j-го раздела.
  • v — количество дискретных значений в атрибуте A.

Коэффициент усиления можно определить как

В качестве атрибута разделения (Источник) выбирается атрибут с наибольшим коэффициентом усиления.

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

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

Где pi — вероятность того, что кортеж в D принадлежит классу Ci.

Индекс Джини учитывает двоичное разделение для каждого атрибута. Вы можете вычислить взвешенную сумму примеси каждого раздела. Если двоичное разделение по атрибуту A разбивает данные D на D1 и D2, индекс Джини D равен:

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

В качестве признака разделения выбирается признак с минимальным индексом Джини.

Построение классификатора дерева решений в Scikit-learn

Загрузить Jupter Notebook

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

Давайте сначала загрузим необходимые библиотеки.

# Load libraries
import pandas as pd
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculation

Загрузка данных

Давайте сначала загрузим необходимый набор данных Pima Indian Diabetes, используя функцию pandas read CSV. Скачать данные можно здесь.

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("pima-indians-diabetes.csv", header=None, names=col_names)

pima.head()

беременнаяглюкозаbpsкожаинсулинbmipedigreeagelabel061487235033.60.62750111856629026.60.35131028183640023.30.672321318966239428.10.16721040137403516843.12.288333

Выбор функции

Здесь вам нужно разделить заданные столбцы на два типа зависимых переменных (или целевых переменных) и независимых переменных (или переменных признаков).

#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

Разделение данных

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

Давайте разделим набор данных с помощью функции train_test_split(). Вам нужно передать 3 параметра: feature, target и test_set size.

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 70% training and 30% test

Построение модели дерева решений

Давайте создадим модель дерева решений, используя Scikit-learn.

# Create Decision Tree classifer object
clf = DecisionTreeClassifier()

# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)

#Predict the response for test dataset
y_pred = clf.predict(X_test)

Оценка модели

Оценим, насколько точно классификатор или модель может предсказать тип сортов.

Точность можно вычислить путем сравнения фактических значений набора тестов и прогнозируемых значений.

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

Accuracy: 0.6753246753246753

Ну, вы получили классификацию 67,53%, что считается хорошей точностью. Вы можете повысить эту точность, настроив параметры в алгоритме дерева решений.

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

Вы можете использовать функцию Scikit-learn export_graphviz для отображения дерева в блокноте Jupyter. Для построения дерева вам также необходимо установить graphviz и pydotplus.

pip install graphviz

pip install pydotplus

Функция export_graphviz преобразует классификатор дерева решений в точечный файл, а pydotplus преобразует этот точечный файл в png или отображаемую форму на Jupyter.

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('diabetes.png')
Image(graph.create_png())

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

Здесь результирующее дерево не обрезается. Это необрезанное дерево необъяснимо и нелегко понять. В следующем разделе давайте оптимизируем его путем обрезки.

Оптимизация производительности дерева решений

  • критерий: необязательный (по умолчанию=”gini”) или выберите меру выбора атрибута: этот параметр позволяет нам использовать меру выбора различных атрибутов. Поддерживаемые критерии: «джини» для индекса Джини и «энтропия» для получения информации.
  • splitter: строка, необязательная (по умолчанию = «лучшая») или стратегия разделения: этот параметр позволяет нам выбрать стратегию разделения. Поддерживаемые стратегии: «лучшие» для выбора наилучшего разделения и «случайные» для выбора наилучшего случайного разделения.
  • max_depth : целое число или None, необязательно (по умолчанию = None) или максимальная глубина дерева: максимальная глубина дерева. Если None, то узлы расширяются до тех пор, пока все листья не будут содержать выборок меньше, чем min_samples_split. Большее значение максимальной глубины вызывает переоснащение, а меньшее — недообучение (Источник).

В Scikit-learn оптимизация классификатора дерева решений выполняется только путем предварительной обрезки. Максимальная глубина дерева может использоваться как управляющая переменная для предварительной обрезки. В следующем примере вы можете построить дерево решений для тех же данных с max_depth=3. Помимо параметров предварительной обрезки, вы также можете попробовать другие меры выбора атрибута, такие как энтропия.

# Create Decision Tree classifer object
clf = DecisionTreeClassifier(criterion="entropy", max_depth=3)

# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)

#Predict the response for test dataset
y_pred = clf.predict(X_test)

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

Accuracy: 0.7705627705627706

Что ж, скорость классификации увеличилась до 77,05%, что лучше, чем у предыдущей модели.

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

from sklearn.externals.six import StringIO
from IPython.display import Image
from sklearn.tree import export_graphviz
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('diabetes.png')
Image(graph.create_png())

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

Плюсы

  • Деревья решений легко интерпретировать и визуализировать.
  • Он может легко захватывать нелинейные шаблоны.
  • Требует меньше предварительной обработки данных от пользователя, например, нет необходимости нормализовать столбцы.
  • Его можно использовать для разработки функций, таких как прогнозирование отсутствующих значений, подходящих для выбора переменных.
  • В дереве решений нет предположений о распределении из-за непараметрического характера алгоритма. ("Источник")

Минусы

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