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

Опубликовано: 26 Июля, 2021

Предварительные требования: Дерево решений, DecisionTreeClassifier, sklearn, numpy, pandas

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

В этой статье мы собираемся реализовать алгоритм дерева решений в базе данных весов и расстояний весов и расстояний, представленной в UCI.

Описание набора данных:

Название: База данных весов и расстояний весов
Количество экземпляров: 625 (49 сбалансированных, 288 слева, 288 справа)
Количество атрибутов: 4 (числовых) + имя класса = 5
Информация об атрибутах:
  1. Имя класса (целевая переменная) : 3
    • L [острие весов влево]
    • B [сбалансировать шкалу]
    • R [острие весов вправо]
  2. Левый вес : 5 (1, 2, 3, 4, 5)
  3. Расстояние влево : 5 (1, 2, 3, 4, 5)
  4. Правый вес : 5 (1, 2, 3, 4, 5)
  5. Расстояние вправо : 5 (1, 2, 3, 4, 5) Отсутствующие значения атрибутов : нет Распределение классов:
    1. 46,08 процентов - L
    2. 07,84 процента - B
    3. 46,08 процента составляют R
    Вы можете найти более подробную информацию о наборе данных здесь.

Используемые пакеты Python:

  1. sklearn:
    • В python sklearn - это пакет машинного обучения, который включает множество алгоритмов машинного обучения.
    • Здесь мы используем некоторые из его модулей, такие как train_test_split, DecisionTreeClassifier и precision_score.
  2. NumPy:
    • Это числовой модуль Python, который предоставляет быстрые математические функции для вычислений.
    • Он используется для чтения данных в массивах numpy и для манипуляций.
  3. Панды:
    • Используется для чтения и записи разных файлов.
    • С помощью фреймов данных можно легко управлять данными.

Установка пакетов:

В Python sklearn - это пакет, который содержит все необходимые пакеты для реализации алгоритма машинного обучения. Вы можете установить пакет sklearn, следуя приведенным ниже командам.
используя pip:

 pip install -U scikit-learn

Перед использованием указанной выше команды убедитесь, что у вас установлены пакеты scipy и numpy .

Если у вас нет pip. Вы можете установить его, используя

 python get-pip.py

используя conda:

 conda установить scikit-learn

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

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

    Псевдокод:

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

    При реализации дерева решений мы пройдем следующие два этапа:

    1. Фаза строительства
      • Предварительно обработайте набор данных.
      • Разделите набор данных из поезда и протестируйте с помощью пакета Python sklearn.
      • Обучите классификатор.
    2. Операционная фаза
      • Делать предсказания.
      • Рассчитайте точность.

    Импорт данных:

  • Для импорта и обработки данных мы используем пакет 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