APPRENTISSAGE AVEC PYTHON ET SICKIT LEARN
Master 1 Business Analytics & Data Science
TP5 : Les arbres de décision avec Scikit-learn : Régression
Mounira Ilahi Amri
Objectifs
Dans ce TP, nous allons étudier les arbres de décision pour la
régression.
La documentation en ligne de scikit-learn est complète et devra être
consultée chaque fois que nécessaire. En particulier, l'ensemble des
méthodes disponibles dans l'outil sont résumées ici : http://scikit-
learn.org/stable/modules/classes.html .
** Ce tp est insipré d'un travail de Marin FERECATU
- Ce TP est à rendre avant mercredi prochain 23h55
Enoncé du TP
la
les
avec
régression
scikit-learn offre
arbres de décision,
Documentation de sklearn : http://scikit-learn.org/stable/modules/tree.html .
Publicité
Pour
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.
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
1
blanc et nous allons apprendre un arbre de régression sur ces données d’apprentissage.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
Créer les données d'apprentissage
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel()
Publicité
fig = plt.figure(figsize=(12, 4))
fig.add_subplot(121)
plt.plot(X, y)
plt.title("Signal sinusoïdal pur")
On ajoute un bruit aléatoire tous les 5 échantillons
y[::5] += 3 * (0.5 - np.random.rand(16))
fig.add_subplot(122)
plt.plot(X, y)
plt.title("Signal sinusoïdal bruité")
L’objectif est de régresser ce signal y à partir des valeurs de x. Pour cela, nous utilisons
un arbre de régression.
Apprendre le modèle
reg = DecisionTreeRegressor(max_depth=2)
reg.fit(X, y)
Prédiction sur la même plage de valeurs
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_pred = reg.predict(X_test)
Affichage des résultats
plt.figure()
plt.scatter(X, y, c="darkorange", label="Exemples d'apprentissage")
plt.plot(X_test, y_pred, color="cornflowerblue", label="Prédiction", linewidth=2)
Publicité
plt.xlabel("x")
plt.ylabel("y")
plt.title("Régression par un arbre de décision")
2
plt.legend()
plt.show()
Question1:
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 ?
Question2:
Pour approfondir, chargez 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 régression 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.
3