2/2 содержит кодовую часть алгоритма классификатора деревьев решений.

Краткий обзор того, что мы узнали вДереве решений 1/2.

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

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

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

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

О наборе данных

Набор данных Iris использовался в R.A. Классическую статью Фишера 1936 года Использование множественных измерений в таксономических задачах, а также можно найти в Хранилище машинного обучения UCI.

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

Столбцы в этом наборе данных:

  • ЧашелистикДлинаСм
  • ЧашелистикШиринаСм
  • ЛепестокДлинаСм
  • ЛепестокШиринаСм
  • Цель

Какой в ​​этом смысл, если мы не покажем доказательства, Хватит Сказано.

Зажигаем рок-н-ролл 👇🏻

# Importing all the neccessary libraries

import pandas as pd  # to analyze data
import numpy as np  # to perform a wide variety of mathematical operations on arrays
import seaborn as sns # to visualize random distributions.
import matplotlib.pyplot as plt # to perform data visualization and graphical plotting
%matplotlib inline
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree

Загрузить и прочитать набор данных

# Load and read an inbuild 'iris' dataset

iris = load_iris()
data_f = pd.DataFrame(data = np.c_[iris["data"], iris["target"]],columns = iris.feature_names+["target"])
# print first 5 records

data_f.head()

# print last 5 records

data_f.tail()

# let's assign the value for each target  0:setosa, 1:versicolor, 2:virginica

print(np.unique(iris.target))
iris.target_names

# let's define and return output with the right set

def names(a):
    if(a==0): return "Iris-setosa"
    elif(a==1): return "Iris-Versicolor"
    else: return "Iris-Virginica"
    
data_f["target_name"] = data_f["target"].apply(names)

data_f.head()

# let's check the nulls if there are any

data_f.isnull().sum()

# print the shape of the dataset

data_f.shape   # 150 rows and 6 columns
(150, 6)
# let's separate independant variables and dependant variable

data = data_f.values

x = data[:,0:4]
y = data[:,4]
y_data = np.array([np.average(x[:,i][y==j]) for i in range(x.shape[1]) for j in (np.unique(y))])
y_data = y_data.reshape(4,3)
y_data = np.swapaxes(y_data, 0,1)

x_axis = np.arange(len(data_f.columns)-2)
width = 0.2

Визуальное представление

# let's visualize the length and width features

plt.figure(figsize =(12,8))
plt.bar(x_axis, y_data[0], width, label = "Setosa")
plt.bar(x_axis+width, y_data[1], width, label = "Versicolour")
plt.bar(x_axis+width*2, y_data[2], width, label = "Verginica")

plt.xticks(x_axis, ["Sepal length", "Sepal width", "Petal length", "Petal width"])
plt.xlabel("Features")
plt.ylabel("Value(cm).")
plt.legend(bbox_to_anchor=(1,1))

plt.show()

Тренировочный тестовый сплит

# let's split the data into train and test

x = data_f.drop(["target", "target_name"], axis = "columns")
y = data_f["target"]

from sklearn.model_selection import train_test_split

x_train, x_test, y_train , y_test = train_test_split(x, y, test_size = .2, random_state = 420)

Модель классификатора дерева решений

model_dt = DecisionTreeClassifier()


# let's fit the model
model_dt.fit(x_train, y_train)
DecisionTreeClassifier()
# let's set the prediction model

model_dt.predict(x_test)

# let's check the model score

model_dt.score(x_test, y_test)

Функция оценки перекрестной проверки

from sklearn.model_selection import cross_val_score, ShuffleSplit

cv = ShuffleSplit(n_splits=6, test_size = .2)

arr = cross_val_score(DecisionTreeClassifier(), x, y, cv= cv)

print(list(arr))
print("Average Score:", np.mean(arr))

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

fig = plt.figure(figsize=(25,20))
fig = plot_tree(model_dt, feature_names = iris.feature_names, class_names = iris.target_names,
               rounded = True,
               filled = True)

Интерпретация

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

Репозиторий GitHub: https://github.com/KVishwas98/TSF-Task6-Prediciton-using-Decision-Tree-Algorithm

Заключение

Если вы обнаружите какие-либо трудности при следовании части кода, укажите их в разделе комментариев.

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