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, если вы считаете, что это помогло или не помогло. У меня есть еще несколько статей, которые я пишу и буду публиковать их каждые пару недель. В основном это аккаунты из моего проектного опыта. Если у вас есть какие-либо другие вопросы или что-то еще, о чем вы хотели бы услышать, не стесняйтесь отправить запрос.