Accédez en illimité à
tous nos livres & vidéos, sur l'IA, le dev, les réseaux... Cliquez ici
Bibliothèque Numérique ENI :
tous nos livres & vidéos, en accès illimité 24h/24. Cliquez ici

L’apprentissage supervisé

Introduction

L’apprentissage supervisé vise à prédire une valeur ou l’appartenance à une catégorie en s’appuyant sur un large choix d’algorithmes dédiés. L’objet de ce chapitre est de faire connaissance avec ces différentes familles d’algorithmes et de les mettre, ensuite, en pratique dans un exemple complet de régression puis de classification.

Les familles d’algorithmes

Nous avons vu précédemment que les algorithmes de Scikit-Learn sont bien identifiés en fonction de leur finalité : les algorithmes dédiés à la régression ont tous un nom qui se termine par Regressor et ceux dédiés à la classification ont tous un nom se finissant par Classifier.

Nous allons ici dépasser cette notion de destination pour nous intéresser à l’esprit de chaque algorithme, indépendamment de sa finalité. Ce sera ainsi l’occasion de mieux connaître les caractéristiques de chacun et de les employer à meilleur escient.

Notre approche sera ainsi découpée en trois grandes familles : les algorithmes linéaires, semi-linéaires et non linéaires. Nous y aborderons chaque grande famille d’algorithmes, comment les installer et les paramètres externes à ajuster pour optimiser leurs performances. Ces paramètres externes sont qualifiés d’hyperparamètres.

1. Les algorithmes linéaires

Les algorithmes linéaires cherchent basiquement à établir une relation linéaire entre des caractéristiques et une variable cible. Ce type de lien, plutôt simple, les destine à expliquer des systèmes peu complexes. Ce sont donc des options à privilégier dès le début qui refléteront, suivant les résultats, la complexité du système et serviront de référence pour comparer les performances d’algorithmes gérant des relations plus complexes. Découvrons sans tarder les membres de cette famille.

a. Les régressions

La régression linéaire et la régression logistique sont des techniques linéaires où l’effet des variables indépendantes sur la variable cible est supposé être additif et proportionnel. Ce sont les seuls algorithmes de Scikit-learn dont le nom ne se termine pas par Regressor ou Classifier bien qu’elles représentent respectivement chacun d’entre eux. Avant de passer à l’étude particulière de chacune d’elle, notons qu’il peut y avoir une ou plusieurs variables explicatives. Dans le cas d’une seule, nous parlons de régression...

La régression en pratique

C’est le jeu de données des diamants qui sera utilisé ici pour expérimenter les étapes d’une modélisation de régression. Ce jeu possède 53 940 observations sur différentes caractéristiques des diamants comme les carats, la taille, la couleur, les dimensions ou le prix. Nous souhaiterions prédire le prix d’un diamant à partir de la table (largeur du sommet du diamant par rapport au point le plus large), du nombre de carats et de sa couleur.

Un travail préalable de feature engineering a été effectué, ce qui explique pourquoi certaines variables seront directement sélectionnées ou ignorées dans notre exemple. Le but étant de se concentrer ici uniquement sur la modélisation. 

1. Préparation des données

a. Import des données

Nous commençons par importer les données en prenant soin de supprimer les observations ayant des dimensions nulles ou extrêmement élevées. Cette suppression ne concerne que 23 observations.

import seaborn as sns 
 
df_brut = sns.load_dataset("diamonds") 
 
# Conservation des mesures valides et non aberrantes 
condition = 'x != 0 and 0 < y < 30 and 0 < z < 30' 
df = df_brut.query(condition).reset_index(drop=True) 
 
df.head() 
images/06El11.png

Avant d’aller plus loin, regardons la distribution de la variable price :

# Boxplot de price 
sns.boxplot(x=df['price'],color="#439CC8",width=0.5) 
plt.title("Boîte à moustaches des prix des diamants\n") 
plt.show() 
images/06El12.png

Les prix des diamants s’échelonnent de 326 à 18 823 euros avec un prix médian à 2401 et un prix moyen d’environ 3931 euros.

b. Séparation des variables explicatives de la variable cible

La première mesure après l’importation va consister à séparer les variables explicatives de la variable à expliquer en les plaçant dans deux tables différentes X et y.

X = df[["table","carat","color"]] # Variables explicatives 
y = df["price"]                   #...

La classification en pratique

Nous allons maintenant pratiquer une classification. Pour cela, nous reprendrons l’exemple des « diamonds » en essayant maintenant de déduire la qualité de la taille du diamant à partir d’autres variables.

1. Préparation des données

a. Import des données

Commençons par importer les données et supprimer directement les mesures inexistantes ou aberrantes :

import seaborn as sns 
import pandas as pd 
import numpy as np 
 
# Import du jeu de données 
df = sns.load_dataset("diamonds") 
 
# Suppression des mesures inexistantes ou aberrantes 
df = df_brut.query('x != 0 and 0 < y < 30 and 0 < z < 30') 
.reset_index(drop=True) 

b. Séparation entre les variables explicatives et la variable cible

Nous allons ensuite préparer les matrices X et y. Attention ici de bien passer la matrice y en type category :

# Préparation des matrices X et y 
X = df[["price","table","depth","color","clarity"]] 
y = pd.Series(df['cut'], dtype='category') 

c. Séparation entre données d’entraînement et de test

La séparation entre les données d’entraînement et de test s’effectue ensuite de la manière suivante :

from sklearn.model_selection import train_test_split 
 
# Division des données entre train et test 
X_train, X_test, y_train, y_test = train_test_split(X, y, 
test_size=0.2, random_state=42, stratify=y)  

L’usage de stratify dans la fonction train_test_split permet de maintenir les proportions des classes entre les ensembles d’entraînement et de test

d. Transformation des colonnes

Une fois les données séparées, nous allons les transformer de manière spécifique en fonction de leur type à l’aide de la fonction ColumnTransformer. Après avoir désigné les variables numériques et catégorielles, nous appliquerons respectivement une standardisation pour les unes et une binarisation pour les autres :

from sklearn.compose import ColumnTransformer 
 
# Identification des colonnes numériques et binaires 
numeric_columns = X.select_dtypes(include=['number']).columns ...

Conclusion

En conclusion, ce chapitre a introduit les principes fondamentaux de la modélisation supervisée en régression et en classification. Nous avons couvert les concepts essentiels tout en omettant certaines notions pour éviter une surcharge d’information. Il est important de souligner, à ce propos, que la gamme d’outils et de techniques disponibles est à la fois abondante et parfois complexe.

Pour véritablement maîtriser ces méthodes, une pratique régulière est indispensable. En approfondissant notre compréhension et en appliquant ces techniques dans divers domaines, nous pourrons affiner nos analyses, élargir notre boîte à outils, et développer des compétences plus avancées.

Le tableau ci-joint est un résumé des expérimentations abordées :

Aspect

Régression

Classification

Variable cible

Variable continue (quantitative)

Variable discrète (catégorielle)

Évaluation des performances

Erreur quadratique moyenne (MSE), Erreur absolue moyenne (MAE), R²

Matrice de confusion, Accuracy, Précision, Rappel, F-score

Hypothèses du modèle

Relation linéaire ou non, indépendance des observations et des variables

Prétraitement des données

Normalisation/Standardisation des variables

Détection des valeurs aberrantes

Encodage des variables...