Performance et validation des modèles ML

Objectif pédagogique : Introduction aux concepts de performance, surapprentissage et méthodes de validation des modèles prédictifs.

À la fin de ce chapitre, tu seras capable de…

  • Distinguer l’apprentissage supervisé de l’apprentissage non supervisé
  • Identifier les problèmes de surapprentissage et sous-apprentissage
  • Appliquer la division train-validation-test pour évaluer un modèle
  • Implémenter la séparation des données avec Scikit-Learn

💡 Prérequis : Notions de base en statistiques et familiarité avec Python. Connaissance des concepts fondamentaux du Machine Learning.

Mise en contexte

Vous développez un modèle qui prédit parfaitement vos données d’entraînement mais échoue lamentablement sur de nouvelles données ? C’est le piège du surapprentissage ! Dans ce chapitre, vous découvrirez comment éviter ce piège grâce au compromis biais-variance et maîtriserez la division train-test avec des données réelles comme le dataset diabetes. Vous comprendrez pourquoi 70% de vos données servent à l’entraînement et 30% au test.

1 – Introduction

Rappel

Le Machine Learning regroupe deux grands types de problématiques d’apprentissage:

  • L’apprentissage supervisé ou supervised learning : C’est lorsqu’il y a une variable cible : à partir de données labellisées, on cherche à prédire cette variable.
  • L’apprentissage non supervisé ou unsupervised learning : C’est lorsqu’il n’y a pas de variable cible à prédire : on cherche à découvrir les structures sous-jacentes au sein d’une base de données.

L’apprentissage non supervisé peut être subdivisé en deux principales techniques:

  • La réduction de dimension : On tranforme nos variables.
  • Le clustering : On cherche à regrouper nos observations au sein de groupes.

L’apprentissage supervisé peut être subdivisé en deux principales techniques:

  • La régression : On cherche à prédire une variable de type quantitatif.
  • La classification : On cherche à prédire une variable de type qualitatif.

Au sein de ce module de 6 notebooks nous verrons tour à tour l’ensemble de ces méthodes. Avant de se lancer dans le vif du sujet voici une liste non exhaustive des étapes à suivre pour mener à bien un projet de Machine Learning.

Structure de projet

  • Identifier la problématique d’apprentissage:
    • Supervisé
    • Non supervisé
  • Description du nombre d’observations et de variables;
  • Identification de l’échantillon à conserver;
  • Nettoyage et traitement des données (données manquantes, aberrantes);
  • Exploration des données (visualisations et statistiques descriptives);
  • Construction du modèle;
  • Evaluation de performance (pour les modèles prédictifs) et validation du modèle.

2 – Construction de modèles prédictifs et performance

Nous abordons dans ce premier notebook, la notion de performance de modèle puisqu’elle est au coeur de la problématique d’apprentissage supervisé. Elle est déterminée en grande partie par les données que nous avons à notre disposition. La performance d’un modèle se mesure à l’aide de métriques qui évaluent la qualité de la prédiction en comparant les valeurs prédites aux valeurs réelles : en d’autres termes on évalue dans quelle mesure nous pouvons généraliser ce modèle.

Surapprentissage

Lorsque l’on entraîne un modèle, il a tendance à surapprendre à partir de nos données. Le surapprentissage, ou overfitting, se produit lorsque notre modèle est parfaitement adapté à nos données si bien qu’il lui est difficile de performer sur d’autres données.

Sous-apprentissage

Il se peut également que le modèle ne parvienne pas à s’adapter aux données qu’on lui fournit, on parle alors de sous-apprentissage ou underfitting. Dans ce cas, le modèle n’est pas performant à la fois sur les données fournies et sur d’autres données.

Compromis Biais – Variance : En Machine Learning, on cherche à minimiser la variance de nos estimateurs tout en minimisant le biais qu’ils induisent. Plus la variance est élevée moins un modèle est généralisable (c’est ce que l’on appelle le surapprentissage) et plus le biais est élevé moins la prédiction de notre modèle va être précise (c’est ce que l’on appelle le sous-apprentissage). Puisque les deux jouent en sens inverse, il faut trouver le bon équilibre entre la variance et le biais pour maximiser les performances de notre modèle.

Train – Validation – Test Split

Pour palier à ce problème, la performance de prédiction des modèles doit être évaluée sur une partie de la base de données, ce qui nous permet d’obtenir les performances prédictives réelles d’un modèle. Ci-après la typologie utilisée et les définitions associées à chaque terme:

  • Base d’entraînement (Train set) : C’est la partie de la base de données sur laquelle le modèle va apprendre et s’entraîner. Les paramètres du modèle vont donc être estimés durant cette étape.
  • Partie validation (Validation set) : C’est une sous-partie de la base d’entraînement. Sur cette partie de la base, ce sont les hyperparamètres du modèle choisi qui sont optimisés. Cette étape n’est néanmoins pas indispensable pour évaluer un modèle.
  • Base de test (Test set) : C’est la partie de la base de données qui n’a jamais été étudié par le modèle, c’est donc sur cette partie des données que les performances sont évaluées.

Usuellement, la base d’entraînement du modèle représente 70 à 80% du volume total des données pour une base de test représentant 20 à 30%. Il n’y a pas de règle générale néanmoins, ces proportions peuvent varier selon la nature et le volume des données.

Les mesures de performance se font à l’aide de métriques qui dépendent du type de la variable que l’on prédit : régression ou classification. Leur nature et utilisation seront développées dans les notebooks correspondant à chaque problématique prédictive.

3 – Implémentation avec Scikit-Learn

Importation des librairies. La librairie pandas permet de manipuler les objets de type DataFrame ou Series :

import pandas as pd

A partir du module sklearn.datasets de la librarie scikit-learn on importe la fonction load_diabetes qui renvoie une base de données sous forme de dictionnaire où les variables explicatives et la target sont déjà séparés :

from sklearn.datasets import load_diabetes

A partir du module model_selection de la librairie scikit learn on importe la fonction train_test_split :

from sklearn.model_selection import train_test_split

Instanciation du dataframe contenant les variables explicatives :

X = pd.DataFrame(load_diabetes().data,
columns=load_diabetes().feature_names)

Instanciation de la series contenant la variable cible :

y = pd.Series(load_diabetes().target)

Nous avons importé ci-dessus la librairie pandas et les fonctions appartenant à différents modules scikit-learn dont nous avons besoin pour séparer notre base en une partie d’entraînement et une partie test. Nous avons également importer notre base de données pour laquelle les variables explicatives du modèle ont été attribuées à X et la variable cible à y.

  • A l’aide de la fonction train_test_split importée précédemment, séparez respectivement X et y en partie train et test. Vous renseignerez avec l’argument test_size = la proportion que vous souhaitez attribuer à la base test :

    X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size = 0.30,
    random_state = 42
    )

  • Affichez les dimensions de X_train, X_test, y_train et y_test à l’aide de l’attribut shape :

    print(X_test.shape)
    print(y_train.shape)
    print(y_test.shape)

Affichage de la dimension des 4 objets :

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

Nous constatons que X_train et X_test ont bien le même nombre de variables 10 mais un nombre différents d’observations, respectivement 309 et 133.

Nous réalisons les même observations entre y_train et y_test.

Nous remarquons que X_train et y_train ont le même nombre d’observations de la même façon que X_test et y_test.

💡 À retenir :

  • La séparation du jeu de données en une base d’entraînement et une base de test permet d’évaluer les performances et la capacité de généralisation d’un modèle.
  • L’évaluation des performances d’un modèle sur des données qui n’ont jamais été entraînées est essentielle, cela permet notamment de décéler un problème de surapprentissage.