Розглянемо побудову дерева для класифікації набору даних ірисів.
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
print('Атрибути даних:',data.target_names)
print('Форма даних:', X.shape)
Атрибути даних:
['setosa' 'versicolor' 'virginica']
Форма даних:
(150,4)
Розбиваємо данні на навчальну та тестову вибірки
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 67, test_size = 0.25)
Імпортуємо Decision tree класифікатор з бібліотеки sklearn, встановлюємо критерій переходу entropy. За умовчанням використовується критерій Джині.
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(criterion = 'entropy')
Навчаємо дерево на навчальному наборі
clf.fit(X_train, y_train)
DecisionTreeClassifier(ccp_alpha=0.0,class_weight=None,criterion='entropy',
max_depth=None, max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort='deprecated',
random_state=None, splitter='best')
Виконуємо прогнозування міток на тестових даних
y_pred = clf.predict(X_test)
Знаходимо оцінки точності класифікації
from sklearn.metrics import accuracy_score
print('Точність на тренувальних даних: ', accuracy_score(y_true=y_train, y_pred=clf.predict(X_train)))
print('Точність на тестових даних: ', accuracy_score(y_true=y_test, y_pred=y_pred))
#Output:
Точність на тренувальних даних: 1.0
Точність на тестових даних: 0.9473684210526315
Будуємо матрицю невідповідностей
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(y_test, y_pred, labels=clf.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm,display_labels=clf.classes_)
disp.plot()
plt.show()
Як бачимо, на тестовому наборі допущено лише дві помилки.
Візуалізуємо дерево
from matplotlib.pyplot import figure
figure(figsize=(8,10))
from sklearn import tree
tree.plot_tree(clf)
plt.show()
В вузлах дерева знаходяться предикати, які керують процесом класифікації
Визначаємо важливість ознак
print("Важливість ознак: {}".format(clf.feature_importances_))
Важливість ознак: [0.03417269 0.02454685 0.90530355 0.0359769 ]
Бачимо, що дві останні ознаки вносять найбільший вклад в класифікацію. Тому навчаємо нову модель відкинувши ознаки з меншим вкладом. РОбота з двома ознаками дозволяє візуалізувати області прийняття рішень
from mlxtend.plotting import plot_decision_regions # Потрібно встановити пакет mlxtend
X = iris.data[:, [2, 3]]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3)
clf = DecisionTreeClassifier(criterion='entropy')
clf.fit(X_train, y_train)
plot_decision_regions(X_train, y_train, clf)
plt.xlabel('petal length [cm]')
plt.ylabel('petal width [cm]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()