Tout savoir sur train_test_split

Durant le processus de développement de modèles de Machine Learning, il est essentiel d’en évaluer la performance sur des données inconnues. L’objectif est de vérifier que le modèle est capable de généraliser efficacement sur de nouvelles données. Une des pratiques les plus courantes s’appelle le train test split.

L’importance du train_test_split en apprentissage automatique

Le train_test_split a un rôle fondamental dans l’évaluation de la performance des modèles de Machine Learning. Un modèle peut présenter d’excellents résultats sur l’ensemble d’entraînement, mais se révéler inefficace face à de nouvelles données. On va alors réaliser une séparation en deux ensemble :

  • un ensemble d’entraînement ou training set, utilisé pour adapter, ou entraîner, le modèle sur une partie des données disponibles ;
  • un ensemble de test, test set, pour évaluer les performances du modèle sur une partie des données jamais rencontrée.

Les outils et bibliothèques disponibles pour faciliter le train_test_split

Il existe différentes ressources permettant de simplifier considérablement le processus de division des données.

Scikit-learn, ou Sklearn

C’est l’une des bibliothèques les plus utilisées pour le Machine Learning en Python. La fonction train_test_split de Scikit-learn permet de diviser facilement un ensemble de données. Elle permet de configurer différents paramètres, comme la taille de l’ensemble de test et la randomisation des données.

NumPy

NumPy est une autre bibliothèque en Python, surtout utilisée pour la manipulation des tableaux multidimensionnels. Elle offre toutefois des fonctionnalités pour diviser des ensembles de données en sous-ensembles d’entraînement et de test.

Pandas

Cette troisième bibliothèque Python est largement utilisée pour la manipulation et l’analyse de données. Elle propose notamment des fonctionnalités avancées pour charger, nettoyer et prétraiter les données avant de les diviser. Pandas offre une intégration fluide avec d’autres bibliothèques comme Scikit-learn.

Le train_test_split : une méthode efficace pour diviser les données

En premier lieu, vous devez procéder au prétraitement des données. Vous pourrez ainsi identifier et corriger les erreurs, les incohérences et les valeurs manquantes dans les données. Cette étape est cruciale pour garantir la qualité et la fiabilité des données qui seront utilisées pour l’entraînement des modèles.

Random Shuffle, ou randomisation aléatoire

Avant la division des données, il est recommandé de les mélanger de manière aléatoire. Le Random Shuffle réduit considérablement le risque d’introduire des schémas spécifiques à l’ordre des données. Dans la bibliothèque scikit-learn en Python, cette action est souvent effectuée à l’aide de la fonction « shuffle » du module « utils » :

from sklearn.utils import shuffleindices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]indices_shuffled = shuffle(indices, random_state=42)print(« Indices mélangés : », indices_shuffled)

Notez que la fonction « shuffle » ne modifie pas les données d’origine. Elle retourne une copie mélangée des données, ce qui permet de conserver la data d’origine intacte.

Division des données

Le train_test_split prend en entrée le dataset initial. Celui-ci se compose de caractéristiques et de cibles ou étiquettes. Il divise alors le set en deux sous-ensembles : celui d’entraînement et celui de test. Il est essentiel de choisir une proportion appropriée pour l’ensemble de test. Elle dépend de différents facteurs comme la taille du dataset ou encore la complexité du modèle. Une règle courante est de réserver environ 20 à 30 % des données pour l’ensemble de test. 

Prenons un exemple concret avec Sklearn de Python. Notre ensemble de données représente des caractéristiques de chiens et chats représentant leur poids, leur taille et leur âge.

from sklearn.model_selection import train_test_splitimport numpy as np

Importons les caractéristiques des animaux, à savoir leur poids, leur taille et leur âge. Nos variables cibles correspondent au type d’animal : 0 pour le chien et 1 pour le chat.

X = np.array([[50, 0.3, 2], [20, 0.1, 1], [100, 0.5, 4], [150, 0.7, 6], [80, 0.4, 3]])y = np.array([0, 1, 0, 1, 0])

Nous pouvons désormais diviser notre dataset avec train_test_split, puis afficher les sets d’entraînement et de test

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) print(« Ensemble d’entraînement – Caractéristiques des animaux: »)print(X_train)print(« Ensemble d’entraînement – Types d’animaux: »)print(y_train)print(« Ensemble de test – Caractéristiques des animaux: »)print(X_test)print(« Ensemble de test – Types d’animaux: »)print(y_test)

Évaluation du modèle

Une fois que les données ont été divisées, le modèle est entraîné sur l’ensemble d’entraînement et évalué sur l’ensemble de test. Cela permet d’évaluer la performance du modèle sur des données non vues et de déterminer s’il est capable de généraliser correctement.

Choisir la proportion appropriée pour le train_test_split

La répartition idéale recommandée est de 80:20 pour l’apprentissage et le test. Vous pouvez ensuite l’ajuster en fonction de différents paramètres. Ainsi, avec un grand ensemble, vous pouvez vous permettre de réserver une plus petite proportion pour le test. À l’inverse, avec un plus petit format de valeurs, réservez une plus grande proportion pour le test afin de disposer de suffisamment d’éléments pour en évaluer les performances.

Si votre modèle est complexe et a tendance à souffrir d’overfitting, vous pouvez réserver une proportion plus importante pour le test de manière à détecter plus facilement le problème.

Les avantages de l’utilisation d’un train_test_split

La séparation entre les données d’entraînement et de test permet une évaluation impartiale des performances du modèle. En testant le modèle sur le data set de test, vous pouvez évaluer sa capacité à généraliser et à produire des prédictions avec précision sur de nouvelles informations. 

Comme nous l’avons vu précédemment, lorsque l’on divise le data set, il devient plus facile de détecter un problème d’overfitting. Celui-ci se produit lorsque le modèle fonctionne exceptionnellement bien sur le dataset d’entraînement, mais échoue à se généraliser devant une data inconnue. En comparant les performances sur l’ensemble d’apprentissage et de celui de test, vous pouvez identifier si le modèle est en surapprentissage et prendre des mesures immédiates.

De plus, cette division entre données d’apprentissage et de test permet de régler plus efficacement les hyperparamètres. Ces paramètres de configuration influent directement sur les performances du modèle. En les ajustant en fonction des performances du modèle sur l’ensemble de validation, vous pouvez donc les optimiser avant l’étape d’évaluation finale.

Quelles sont les bonnes pratiques pour effectuer un train test split ?

Certaines bonnes pratiques peuvent permettre d’utiliser efficacement la méthode train_test_split.

Effectuer un échantillonnage aléatoire du dataset

Assurez-vous de diviser les données de manière aléatoire en ensembles d’entraînement et de test. La randomisation consiste à brouiller l’ordre des échantillons afin d’éviter tout biais potentiel lié à la structure initiale des données. Cette méthode garantit une évaluation impartiale des performances du modèle et contribue à une répartition équilibrée.

Maintenir la distribution des classes dans chaque division

La stratification est une pratique essentielle, surtout dans le contexte des tâches de classification où les données peuvent être déséquilibrées en termes de répartition des classes. En stratifiant la data, on s’assure que chaque classe est représentée proportionnellement dans les deux ensembles, évitant ainsi tout biais résultant d’un déséquilibre entre les classes.

Utiliser en complément la validation croisée k-fold

Cette méthode puissante permet d’évaluer la performance d’un modèle, en particulier dans les petits ensembles de données où la randomisation seule peut ne pas suffire. Les données sont divisées en k plis (sous-ensembles), puis itère sur chaque pli en utilisant k-1 plis pour l’entraînement et le pli restant pour la validation. La validation croisée permet une évaluation robuste et fiable du modèle, tout en réduisant le risque de surajustement ou de sous-ajustement.

Alternatives et extensions au train_test_split

En fonction des exigences spécifiques de votre problème de Machine Learning, plusieurs alternatives et extensions peuvent être utilisées.

La validation croisée, ou cross-validation

Cette technique divise les données en plusieurs plis. Chacun est utilisé à tour de rôle comme ensemble de test tandis que les autres sont utilisés pour l’entraînement. La méthode permet une évaluation robuste de la performance du modèle, en particulier pour les petits dataset. 

Une variante possible est la validation croisée k-fold stratifiée qui maintient la distribution des classes dans chaque pli, ce qui est particulièrement important pour les tâches de classification avec des classes déséquilibrées. Une autre extension est la validation croisée k-fold par groupe, ou Group k-fold cross-validation. Cette méthode garantit que les données appartenant à un même groupe sont toutes dans le même ensemble (entraînement ou test).

Le Leave-One-Out (LOO)

Cette méthode Leave-one-out (validation croisée) consiste à retenir un seul échantillon comme ensemble de test à chaque itération, et tous les autres comme ensemble d’entraînement. Le LOO peut être coûteux en termes de calcul, car il nécessite d’entraîner et d’évaluer le modèle pour chaque échantillon individuel. Il est donc utilisé avec prudence et réservé à certains cas précis.

Le split de séries temporelles (Time Series Split)

Conçue spécifiquement pour les données chronologiques, il s’agit de diviser les données en utilisant une approche basée sur le temps, en veillant à ce que les données futures ne soient pas utilisées pour prédire les données passées. Cette technique s’adapte particulièrement dans des domaines comme la finance, la météorologie, la santé et la prévision des ventes.

La méthode train_test_split est une pratique essentielle en apprentissage automatique. Elle offre une méthode objective pour évaluer la performance des modèles et garantir leur généralisation à de nouvelles données. Il s’agit d’un outil essentiel en data science, qui offre une approche rigoureuse et systématique pour évaluer, comparer et optimiser les modèles d’apprentissage automatique.