Практика. Решающие деревья¶
from sklearn import datasets
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import numpy as np
import pandas as pd
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(font_scale=1.5)
# Bot check
# HW_ID: phds_sem4
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.
Классификация с использованием решающего дерева¶
Для классификации мы будем использовать датасет load_iris()
из библиотеки sklearn.datasets
. Посмотрим подробнее:
data = datasets.load_iris()
print(data['DESCR'])
X = data['data']
y = data['target']
Посмотрим, сколько всего у нас классов в датасете.
np.unique(y)
Проверим, сколько элементов каждого класса есть в датасете.
plt.hist(y, bins=len(np.unique(y)));
Получается, что мы имеем одинаковое кол-во элементов каждого класса. Предположите, чем будет плоха сильная дисбаллансировка классов.
Ответ:
Сопоставим каждому классу цвет.
colors = ListedColormap(['#FF3300', '#0099CC', '#00CC66'])
Посмотрим на данные.
plt.figure(figsize=(8, 6))
grid_x1 = X[:, 0]
grid_x2 = X[:, 1]
plt.scatter(grid_x1, grid_x2, c=y, cmap=colors, s=100, alpha=0.7)
plt.xlabel(data['feature_names'][0])
plt.ylabel(data['feature_names'][1]);
plt.figure(figsize=(8, 6))
grid_x1 = X[:, 2]
grid_x2 = X[:, 3]
plt.scatter(grid_x1, grid_x2, c=y, cmap=colors, s=100, alpha=0.7)
plt.xlabel(data['feature_names'][2])
plt.ylabel(data['feature_names'][3]);
Какой вывод можно сделать из полученных графиков?
Ответ:
Разделим выборку на обучающую и тестовую
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=777
)
Инициализируем и обучим решающее дерево для классификации.
clf = DecisionTreeClassifier(random_state=42)
<...>
Выведите параметры дерева с помощью функции get_params()
.
<...>
Сделаем предсказание и оценим качество модели.
predictions = <...>
print('test accuracy:', accuracy_score(predictions, y_test))
Визуализируйте дерево с помощью sklearn.tree.plot_tree()
.
plt.figure(figsize=(15, 10))
tree.plot_tree(clf)
plt.show()
Поменяйте параметр max_depth, заново обучите классификатор и визуализируйте получившееся дерево/деревья. Сделайте вывод - за что отвечает параметр?
<...>
Ответ:
Сделайте то же для параметры min_samples_leaf. За что он отвечает?
<...>
Ответ: