Реализация дерева решений с использованием Python
Предварительные требования: Дерево решений, DecisionTreeClassifier, sklearn, numpy, pandas
Дерево решений - один из самых мощных и популярных алгоритмов. Алгоритм дерева решений подпадает под категорию алгоритмов обучения с учителем. Он работает как для непрерывных, так и для категориальных выходных переменных.
В этой статье мы собираемся реализовать алгоритм дерева решений в базе данных весов и расстояний весов и расстояний, представленной в UCI.
Описание набора данных:
Название: База данных весов и расстояний весов Количество экземпляров: 625 (49 сбалансированных, 288 слева, 288 справа) Количество атрибутов: 4 (числовых) + имя класса = 5 Информация об атрибутах:
- Имя класса (целевая переменная) : 3
- L [острие весов влево]
- B [сбалансировать шкалу]
- R [острие весов вправо]
- Левый вес : 5 (1, 2, 3, 4, 5)
- Расстояние влево : 5 (1, 2, 3, 4, 5)
- Правый вес : 5 (1, 2, 3, 4, 5)
- Расстояние вправо : 5 (1, 2, 3, 4, 5) Отсутствующие значения атрибутов : нет Распределение классов:
Вы можете найти более подробную информацию о наборе данных здесь.
- 46,08 процентов - L
- 07,84 процента - B
- 46,08 процента составляют R
Используемые пакеты Python:
- sklearn:
- В python sklearn - это пакет машинного обучения, который включает множество алгоритмов машинного обучения.
- Здесь мы используем некоторые из его модулей, такие как train_test_split, DecisionTreeClassifier и precision_score.
- NumPy:
- Это числовой модуль Python, который предоставляет быстрые математические функции для вычислений.
- Он используется для чтения данных в массивах numpy и для манипуляций.
- Панды:
- Используется для чтения и записи разных файлов.
- С помощью фреймов данных можно легко управлять данными.
Установка пакетов:
В Python sklearn - это пакет, который содержит все необходимые пакеты для реализации алгоритма машинного обучения. Вы можете установить пакет sklearn, следуя приведенным ниже командам.
используя pip:
pip install -U scikit-learn
Перед использованием указанной выше команды убедитесь, что у вас установлены пакеты scipy и numpy .
Если у вас нет pip. Вы можете установить его, используя
python get-pip.py
используя conda:
conda установить scikit-learn
Предположения, которые мы делаем при использовании дерева решений:
- Вначале мы рассматриваем весь обучающий набор как корень.
- Предполагается, что атрибуты являются категориальными для получения информации, а для индекса Джини атрибуты считаются непрерывными.
- На основе значений атрибутов записи распределяются рекурсивно.
- Мы используем статистические методы для упорядочивания атрибутов как корневого или внутреннего узла.
Псевдокод:
- Найдите лучший атрибут и поместите его в корневой узел дерева.
- Теперь разделите обучающий набор набора данных на подмножества. При создании подмножества убедитесь, что каждое подмножество набора обучающих данных должно иметь одинаковое значение атрибута.
- Найдите листовые узлы во всех ветвях, повторяя 1 и 2 для каждого подмножества.
При реализации дерева решений мы пройдем следующие два этапа:
- Фаза строительства
- Предварительно обработайте набор данных.
- Разделите набор данных из поезда и протестируйте с помощью пакета Python sklearn.
- Обучите классификатор.
- Операционная фаза
- Делать предсказания.
- Рассчитайте точность.
Импорт данных:
- Для импорта и обработки данных мы используем пакет pandas , представленный в python.
- Здесь мы используем URL-адрес, который напрямую получает набор данных с сайта UCI, нет необходимости загружать набор данных. Когда вы пытаетесь запустить этот код в своей системе, убедитесь, что система должна иметь активное подключение к Интернету.
- Поскольку набор данных разделен символом «», мы должны передать значение параметра sep как «,».
- Также следует отметить, что набор данных не содержит заголовка, поэтому мы передадим значение параметра Header как none. Если мы не передадим параметр заголовка, он будет рассматривать первую строку набора данных как заголовок.
Нарезка данных:
- Перед обучением модели мы должны разделить набор данных на набор данных для обучения и тестирования.
- Чтобы разделить набор данных для обучения и тестирования, мы используем модуль sklearn train_test_split.
- Прежде всего, мы должны отделить целевую переменную от атрибутов в наборе данных.
X = balance_data.values [:, 1: 5] Y = balance_data.values [:, 0]
- Выше приведены строки кода, разделяющие набор данных. Переменная X содержит атрибуты, а переменная Y содержит целевую переменную набора данных.
- Следующим шагом является разделение набора данных для целей обучения и тестирования.
X_train, X_test, y_train, y_test = train_test_split ( X, Y, test_size = 0,3, random_state = 100)
- Над строкой разделите набор данных для обучения и тестирования. Поскольку мы разделяем набор данных в соотношении 70:30 между обучением и тестированием, мы передаем значение параметра test_size как 0,3.
- Переменная random_state - это состояние генератора псевдослучайных чисел, используемое для случайной выборки.
Термины, используемые в коде:
Индекс Джини и получение информации - оба этих метода используются для выбора из n атрибутов набора данных, какой атрибут будет размещен в корневом узле или во внутреннем узле.
Индекс Джини - Индекс Джини - это показатель для измерения того, как часто случайно выбранный элемент может быть неправильно идентифицирован.
- Это означает, что предпочтение следует отдавать атрибуту с более низким индексом Джини.
- Sklearn поддерживает критерий «Джини» для индекса Джини и по умолчанию принимает значение «Джини».
Энтропия
- Энтропия - это мера неопределенности случайной величины, она характеризует нечистоту произвольного набора примеров. Чем выше энтропия, тем больше информации.
Получение информации
- Энтропия обычно изменяется, когда мы используем узел в дереве решений для разделения обучающих экземпляров на более мелкие подмножества. Прирост информации является мерой этого изменения энтропии.
- Sklearn поддерживает «энтропийные» критерии для получения информации, и если мы хотим использовать метод получения информации в sklearn, мы должны упомянуть об этом явно.
Оценка точности
- Оценка точности используется для расчета точности обученного классификатора.
Матрица путаницы
- Матрица неточностей используется для понимания поведения обученного классификатора в тестовом наборе данных или для проверки набора данных.
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Ниже приведен код Python для дерева решений.
# Run this program on your local python
# interpreter, provided you have installed
# the required libraries.
# Importing the required packages
import
numpy as np
import
pandas as pd
from
sklearn.metrics
import
confusion_matrix
from
sklearn.cross_validation
import
train_test_split
from
sklearn.tree
import
DecisionTreeClassifier
from
sklearn.metrics
import
accuracy_score
from
sklearn.metrics
import
classification_report
# Function importing Dataset
def
importdata():
balance_data
=
pd.read_csv(
'databases/balance-scale/balance-scale.data'
,
sep
=
','
, header
=
None
)
# Printing the dataswet shape
print
(
"Dataset Length: "
,
len
(balance_data))
print
(
"Dataset Shape: "
, balance_data.shape)
# Printing the dataset obseravtions
print
(
"Dataset: "
,balance_data.head())
return
balance_data
# Function to split the dataset
def
splitdataset(balance_data):
# Separating the target variable
X
=
balance_data.values[:,
1
:
5
]
Y
=
balance_data.values[:,
0
]
# Splitting the dataset into train and test
X_train, X_test, y_train, y_test
=
train_test_split(
X, Y, test_size
=
0.3
, random_state
=
100
)
return
X, Y, X_train, X_test, y_train, y_test
# Function to perform training with giniIndex.
def
train_using_gini(X_train, X_test, y_train):
# Creating the classifier object
clf_gini
=
DecisionTreeClassifier(criterion
=
"gini"
,
random_state
=
100
,max_depth
=
3
, min_samples_leaf
=
5
)
# Performing training
clf_gini.fit(X_train, y_train)
return
clf_gini
# Function to perform training with entropy.
def
tarin_using_entropy(X_train, X_test, y_train):
# Decision tree with entropy
clf_entropy
=
DecisionTreeClassifier(
criterion
=
"entropy"
, random_state
=
100
,
max_depth
=
3
, min_samples_leaf
=
5
)
# Performing training
clf_entropy.fit(X_train, y_train)
return
clf_entropy
# Function to make predictions
def
prediction(X_test, clf_object):
# Predicton on test with giniIndex
y_pred
=
clf_object.predict(X_test)
print
(
"Predicted values:"
)
print
(y_pred)
return
y_pred
# Function to calculate accuracy
def
cal_accuracy(y_test, y_pred):
print
(
"Confusion Matrix: "
,
confusion_matrix(y_test, y_pred))
print
(
"Accuracy : "
,
accuracy_score(y_test,y_pred)
*
100
)
print
(
"Report : "
,
classification_report(y_test, y_pred))
# Driver code
def
main():
# Building Phase
data
=
importdata()
X, Y, X_train, X_test, y_train, y_test
=
splitdataset(data)
clf_gini
=
train_using_gini(X_train, X_test, y_train)
clf_entropy
=
tarin_using_entropy(X_train, X_test, y_train)
# Operational Phase
print
(
"Results Using Gini Index:"
)
# Prediction using gini
y_pred_gini
=
prediction(X_test, clf_gini)
cal_accuracy(y_test, y_pred_gini)
print
(
"Results Using Entropy:"
)
# Prediction using entropy
y_pred_entropy
=
prediction(X_test, clf_entropy)
cal_accuracy(y_test, y_pred_entropy)
# Calling main function
if
__name__
=
=
"__main__"
:
main()
Информация о данных:
Длина набора данных: 625 Форма набора данных: (625, 5) Набор данных: 0 1 2 3 4 0 Б 1 1 1 1 1 К 1 1 1 2 2 К 1 1 1 3 3 К 1 1 1 4 4 К 1 1 1 5Результаты с использованием индекса Джини:
Прогнозируемые значения: ['R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'R' 'L' 'L' 'L' 'R' 'L' ' R '' L ' 'L' 'R' 'L' 'R' 'L' 'L' 'R' 'L' 'L' 'L' 'R' 'L' 'L' 'L' 'R' 'L' 'L 'L' 'L' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'R' 'L ' 'Р' 'R' 'L' 'R' 'R' 'L' 'L' 'R' 'R' 'L' 'L' 'L' 'L' 'L' 'R' 'R' 'L' 'L ' 'Р' 'R' 'L' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'R' 'R' 'L' 'R 'L' 'R' 'R' 'L' 'L' 'L' 'R' 'R' 'L' 'L' 'L' 'R' 'L' 'R' 'R' 'R' 'R' 'R ' 'Р' 'R' 'L' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L 'L' 'L' 'L' 'L' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'L ' 'Р' 'L' 'L' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'R ' 'Р' 'L' 'L' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'R ' 'Р' 'L' 'R' 'R' 'L' 'L' 'R' 'R' 'R'] Матрица неточностей: [[0 6 7] [0 67 18] [0 19 71]] Точность: 73.4042553191 Отчет : точный отзыв поддержка f1-score В 0,00 0,00 0,00 13 L 0,73 0,79 0,76 85 R 0,74 0,79 0,76 90 сред / всего 0,68 0,73 0,71 188Результаты с использованием энтропии:
Прогнозируемые значения: ['R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'R' 'R' 'L' 'L' 'R' 'L' ' R '' L ' 'L' 'R' 'L' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'L 'L' 'L' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'L' 'L' 'R' 'L' 'L' 'R' 'L 'L' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'L' 'R' 'L' 'L' 'R' 'L' 'L' 'L ' 'Р' 'R' 'L' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'R' 'R' 'L' 'R 'L' 'R' 'R' 'L' 'L' 'L' 'R' 'R' 'L' 'L' 'L' 'R' 'L' 'L' 'R' 'R' 'R' 'R ' 'Р' 'R' 'L' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'R' 'L 'L' 'L' 'L' 'L' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'L ' 'Р' 'L' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'R ' 'Р' 'R' 'L' 'R' 'L' 'R' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'L ' 'Р' 'R' 'R' 'L' 'L' 'L' 'R' 'R' 'R'] Матрица неточностей: [[0 6 7] [0 63 22] [0 20 70]] Точность: 70.7446808511 Отчет : точный отзыв поддержка f1-score В 0,00 0,00 0,00 13 L 0,71 0,74 0,72 85 0,71 0,78 0,74 90 рэнд сред / всего 0,66 0,71 0,68 188