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
Publicité
régression
scikit-learn offre
arbres de décision,
Documentation de sklearn : http://scikit-learn.org/stable/modules/tree.html .
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
Publicité
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()
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é")
Publicité
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)
plt.xlabel("x")
plt.ylabel("y")
plt.title("Régression par un arbre de décision")
2
plt.legend()
Publicité
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