Uczenie maszynowe i sztuczne sieci neuronowe/DrzewaDecyzyjne cw
Wstęp
W bibliotece scikit-learn drzewa decyzyjne implementowane są przez klasę DecisionTreeClassifier
Aby nauczyć taki klasyfikator potrzebujemy tablicę X o rozmiarach [N_przykładów, N_cech] i wektor Y określający przynależność przykładów w X do klas.
Najprostszy przykład:
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
Po dopasowaniu można przewidywać przynależność nowych przykładów:
clf.predict([[2., 2.]])
Albo estymować prawdopodobieństwo przynależności do klas:
clf.predict_proba([[2., 2.]])
Przykład zbiór danych Iris
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
Po wytrenowaniu można zilustrować wynik za pomocą narzędzia Graphiz (wymaga to zainstalowania w systemie tego narzędzia), oraz doinstalowania do pythona biblioteki pydot:
from sklearn.externals.six import StringIO
import pydot
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris.pdf")
Można też podejrzeć wyniki w pythonie:
from IPython.display import Image
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data, feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())
Po dopasowaniu model ten może być zastosowany do przewidywania przynależności przykładów do klas:
clf.predict(iris.data[:1, :])
lub estymowania prawdopodobieństwa przynależności do klas:
clf.predict_proba(iris.data[:1, :])
Przykład klasyfikacji cyfr
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import classification_report, confusion_matrix, f1_score
from sklearn import tree
from sklearn.cross_validation import train_test_split
from scipy.io import loadmat
plt.close('all')
###############################################################################
# podglądanie obrazków cyfr
def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.05)
for i in range(n_row * n_col):
plt.subplot(n_row, n_col, i + 1)
plt.imshow(images[i].reshape((h, w)).T, cmap=plt.cm.gray)
plt.title(titles[i], size=12)
plt.xticks(())
plt.yticks(())
###############################################################################
# wczytywanie danych
dane = loadmat('cyfry.mat')
#przepisanie danych do osobnych tablic:
X = dane['X']
y = dane['y']
for i in range(X.shape[0]):
X[i,:] = X[i,:]/np.std(X[i,:])
y[np.where(y==10)]=0 # przekodoeanie cyfry 0 tak, żeby w wektorze y też odpowiadąło jej 0 (w oryginalnym zbiorze danych było 10)
# wysokość i szerokość obrazka z cyfrą
h = 20
w = 20
###############################################################################
# Wypisz dane o zbiorze cyfr
print("dane zawierają %d cyfr po %d pixli"
% (X.shape[0], X.shape[1]))
# Pokaż kilka przykładowych cyfr:
plot_gallery(X[0:5000:200,:], y[0:5000:200], h, w, n_row=5, n_col=5)
plt.show()
###############################################################################
# Podziel zbiór na dane treningowe i testowe
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
###############################################################################
DEPTH =8
MAX_FEAT=50
clf = tree.DecisionTreeClassifier(criterion='entropy',
splitter='best',
max_depth=DEPTH,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features=MAX_FEAT,
random_state=None,
max_leaf_nodes=None,
class_weight=None,
presort=False)
clf = clf.fit(X_train, y_train)
y_pred=clf.predict(X_test)
# Pokaż kilka przykładowych klasyfikacji:
plot_gallery(X_test[0:40,:], y_pred[0:40], h, w, n_row=5, n_col=8)
plt.show()
#F1[MAX_FEAT] = f1_score(y_test, y_pred,average='weighted')
print("confusion matrix:")
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred, labels=range(0,10)))