• Aucun résultat trouvé

Arbres de décision

N/A
N/A
Protected

Academic year: 2022

Partager "Arbres de décision"

Copied!
4
0
0

Texte intégral

(1)

Arbres de décision

Dans Scikit-learn c’est la classe sklearn.tree.DecisionTreeClassifier qui permet de faire une classification multi-classe sur un base de données. Cette classe a besoin en entrée d’une matrice X de taille [n_samples, n_features] contenant les données et d’un vecteur Y de taille On commence par importer les bons modules et construire l’objet arbre :

from sklearn import tree

clf = tree.DecisionTreeClassifier() Les données :

X = [[0, 0], [1, 1]]

Y = [0, 1]

Construction du modèle : clf = clf.fit(X, Y)

Prédiction sur de nouveaux échantillons : clf.predict([[2., 2.]])

On peut aussi prédire la probabilité de chaque classe pour un échantillon (qui est calculée comme la fraction de données d’apprentissage dans chaque feuille) :

clf.predict_proba([[2., 2.]])

Classification des données Iris

DecisionTreeClassifier est capable de gérer des problèmes de classification à plusieurs classes (par exemple, avec les étiquettes 0, 1, … K-1). Dans cet exemple nous allons travailler avec la base de données Iris, facilement accessible dans sklearn. Cette base contient 3 classes de 50 instances, chaque classe faisant référence à une variété d’iris (plante). Une des classes est linéairement séparable par rapport aux deux autres, mais les deux autres ne sont pas séparables une par rapport à l’autre. La variable à prédire est la variété d’iris.

Les attributs :

• longueur de sépale,

• largeur de sépale,

• longueur de pétale,

• largeur de pétale,

• classe : Iris Setosa, Iris Versicolor ou Iris Virginica.

Un échantillon : (4.9,3.6,1.4,0.1, “Iris-setosa”)

from sklearn.datasets import load_iris from sklearn import tree

iris = load_iris()

clf = tree.DecisionTreeClassifier() clf = clf.fit(iris.data, iris.target)

(2)

Une fois l’apprentissage terminé nous pouvons visualiser l’arbre crée en utilisant l’outil graphviz (commande dot). D’abord on génère un fichier .dot :

with open("iris.dot", 'w') as f:

f = tree.export_graphviz(clf, out_file=f)

Ensuite, en ligne de commande on génère la sortie pdf (commande shell) : dot -Tpdf iris.dot -o iris.pdf

Ou, sinon, on peut utiliser le module pyton pydotplus pour générer le fichier pdf : import pydotplus

dot_data = tree.export_graphviz(clf, out_file=None, feature_names=iris.feature_names,

class_names=iris.target_names, filled=True, rounded=True, special_characters=True)

graph = pydotplus.graph_from_dot_data(dot_data) graph.write_pdf("iris.pdf")

Après sa construction, le modèle peut être utilisé pour la prédiction :

>>> clf.predict(iris.data[:1, :]) array([0])

>>> clf.predict_proba(iris.data[:1, :]) array([[ 1., 0., 0.]])

Q1 :

Changez les valeurs de parametres max_depth et min_samples_leaf. Que constatez-vous ? Q2 :

Faites une partition aléatoire de base de données en apprentissage/test (70% apprentissage, 30%

test) et calculez le taux d’éléments mal classifiés sur l’ensemble de test. Faites varier les valeurs des paramètres max_depth et min_samples_leaf pour voir leur impact sur ce score.

Affichage de la surface de décision

Pour une paire d’attributs nous pouvons visualiser la surface de décision en 2 dimensions. D’abord on discrétise le domaine bidimensionnel avec un pas constant et ensuite on évalue le modèle sur chaque point de la grille.

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier

# Paramètres n_classes = 3

(3)

plot_colors = "bry" # blue-red-yellow plot_step = 0.02

# Charger les données iris = load_iris()

# Choisir les attributs longueur et largeur des pétales pair = [2, 3]

# Garder seulement les deux attributs X = iris.data[:, pair]

y = iris.target

# Apprentissage de l'arbre

clf = DecisionTreeClassifier().fit(X, y)

# Affichage de la surface de décision

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step), np.arange(y_min, y_max, plot_step))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape)

cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired) plt.xlabel(iris.feature_names[pair[0]])

plt.ylabel(iris.feature_names[pair[1]]) plt.axis("tight")

# Affichage des points d'apprentissage

for i, color in zip(range(n_classes), plot_colors):

idx = np.where(y == i)

plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i], cmap=plt.cm.Paired) plt.axis("tight")

plt.suptitle("Decision surface of a decision tree using paired features")

plt.legend()

plt.savefig('fig.png') plt.show()

Q1 :

Refaire l’affichage pour les autres paires d’attributs. Sur quelle paire la séparation entre les classes est la plus marquée ?

Arbres de décision pour la régression

Pour la régression avec les arbres de décision, Scikit-learn offre la classe DecisionTreeRegressor. Comme pour la classification, la méthode fit(...) prend en entrée le paramètre X (attributs des observations). Attention : les y ne sont pas des étiquettes de classes mais des valeurs réelles.

(4)

from sklearn import tree X = [[0, 0], [2, 2]]

y = [0.5, 2.5]

clf = tree.DecisionTreeRegressor() clf = clf.fit(X, y)

clf.predict([[1, 1]])

Dans l’exemple suivant nous allons construire un signal sinusoïdal affecté par un bruit blanc et nous allons apprendre un arbre de régression sur ces données d’apprentissage.

import numpy as np

from sklearn.tree import DecisionTreeRegressor import matplotlib.pyplot as plt

# Créer les données d'apprentissage rng = np.random.RandomState(1)

X = np.sort(5 * rng.rand(80, 1), axis=0) y = np.sin(X).ravel()

y[::5] += 3 * (0.5 - rng.rand(16))

# Apprendre le modèle

regr_1 = DecisionTreeRegressor(max_depth=2) regr_1.fit(X, y)

# Prédiction

X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]

y_1 = regr_1.predict(X_test)

# Affichage des résultats plt.figure()

plt.scatter(X, y, c="darkorange", label="data")

plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2)

plt.xlabel("data") plt.ylabel("target")

plt.title("Decision Tree Regression") plt.legend()

plt.show()

Q1 :

Changer la valeur du parametre max_depth. Que se passe-t-il si on prend une valeur trop grande ? Trop petite ? Changer le taux d’éléménts affectés par le bruit (le y[::5]). Quand tous les éléments sont affectés par le bruit, faut-il préférer une valeur élevée ou faible pour max_depth ?

Q2 :

Charger la base de données Diabetes du module sklearn.datasets et faire une partition aléatoire en partie apprentissage et partie test (70% apprentissage, 30% test). Construire un modèle d’arbre de regression sur cette base. Calculer l’erreur quadratique moyenne sur l’ensemble de test.

Faire un grid search pour trouver la valeur du paramètre max_depth qui minimize cette erreur.

Références

Documents relatifs

avec le sq uels

temps de décisions collectives, des temps de régulation et d’organisa- tion, des temps de présentations et d’évaluations.La façon dont le groupe classe, par exemple lors

ment sevrés d'affectivité. Pour eux cette école n'avait aucun sens ni aucune portée dans les incidences de leur vie. Il faut, d'une façon ou d'une autre leur

1. Nous protesterons énergiquement auprès des pouvoirs publics pour qu'on nous accorde, à nous et à nos enfants, des locaux convenables, spacieux, aérés et bien

En plus d'une aide immédiate au plan didactique, se trouveraient ainsi banalisés et proposés par l'enseignant les usages qu'on peut attendre des infotechnologies, même pour ceux

Bien que l’étude de Strayer (2012) n’ait pas été retenue dans le cadre de cette revue systématique de recherches, il est intéressant de noter que ce chercheur

Dans le cadre d'un projet jardin que le collège aimerait réalisé, nous souhaitons équiper le collège d'une serre entièrement autonome sans dégagement de CO2. Nous ne souhaitons

SES pour mieux comprendre le monde actuel. • Pour les élèves curieux du fonctionnement de l’économie, de la société et du