Практика. Решающие деревья¶

In [ ]:
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)
In [ ]:
# Bot check

# HW_ID: phds_sem4
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.

# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше.
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.
# Никакие значения в этой ячейке не влияют на факт сдачи работы.

Классификация с использованием решающего дерева¶

Для классификации мы будем использовать датасет load_iris() из библиотеки sklearn.datasets. Посмотрим подробнее:

In [ ]:
data = datasets.load_iris()
print(data['DESCR'])
In [ ]:
X = data['data']
y = data['target']

Посмотрим, сколько всего у нас классов в датасете.

In [ ]:
np.unique(y)

Проверим, сколько элементов каждого класса есть в датасете.

In [ ]:
plt.hist(y, bins=len(np.unique(y)));

Получается, что мы имеем одинаковое кол-во элементов каждого класса. Предположите, чем будет плоха сильная дисбаллансировка классов.

Ответ:

Сопоставим каждому классу цвет.

In [ ]:
colors = ListedColormap(['#FF3300', '#0099CC', '#00CC66'])

Посмотрим на данные.

In [ ]:
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]);
In [ ]:
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]);

Какой вывод можно сделать из полученных графиков?

Ответ:

Разделим выборку на обучающую и тестовую

In [ ]:
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=777
)

Инициализируем и обучим решающее дерево для классификации.

In [ ]:
clf = DecisionTreeClassifier(random_state=42)
<...>

Выведите параметры дерева с помощью функции get_params().

In [ ]:
<...>

Сделаем предсказание и оценим качество модели.

In [ ]:
predictions = <...>
print('test accuracy:', accuracy_score(predictions, y_test))

Визуализируйте дерево с помощью sklearn.tree.plot_tree().

In [ ]:
plt.figure(figsize=(15, 10))
tree.plot_tree(clf)
plt.show()

Поменяйте параметр max_depth, заново обучите классификатор и визуализируйте получившееся дерево/деревья. Сделайте вывод - за что отвечает параметр?

In [ ]:
<...>

Ответ:

Сделайте то же для параметры min_samples_leaf. За что он отвечает?

In [ ]:
<...>

Ответ: