La validation croisée en Machine Learning

Temps de lecture : 5 minutes

Dans cet article, petit coup de projecteur sur l’un des concepts fondamentaux du Machine Learning : la validation croisée ou « cross-validation » en anglais. A en juger par son occurrence dans mes autres articles, tu as surement pu remarquer que c’est un incontournable en traitement de données. Et rassure-toi, loin du nom pimpant, le principe est simple ! Aller, trop de paroles, regardons tout ça sur un exemple pratique simple 😀.

Le cas d’étude loufoque

Comme je suis d’humeur maussade aujourd’hui (oui, c’est rare, je sais 😒), parlons d’un sujet tristounet : l’échec scolaire. Disons que je veux prédire si un élève réussira à atteindre le niveau lycée (Y =1) ou non (Y =0), en fonction de son origine sociale (X_1) et du lieu où il a grandi (X_2). Je fais ma petite enquête et je réussis à recueillir des données sur 100 individus ! Il s’agit désormais, à partir de cette base de données, d’établir un modèle M qui pourra prédire tout seul l’échec scolaire à l’avenir. Et ce, pour toutes les nouvelles données ultérieures X_1, X_2. La grande question, comment fait-on ?

Protocole de base d’établissement d’un modèle : le petit rappel
Données d’apprentissage et données de validation

Pour simplifier les choses, disons qu’on a rapidement flairé qu’un modèle type forêt aléatoire était adapté au problème. Génial, déjà une belle avancée 😀. Désormais, il faut le régler c’est-à-dire trouver les paramètres optimaux de la forêt. Pour ce faire, il est d’usage de séparer avant tout, nos données en 2 tas : l’un pour l’apprentissage (80% des données) et l’autre pour la validation (20% des données). Le but est d’essayer de trouver les paramètres optimaux sur les données d’apprentissage et d’utiliser les données de validation pour être certain que nos paramètres font véritablement le boulot. Jusque là, rien de bien compliqué… quel est donc le problème ?

Le problème : un manque de représentativité !

Le problème, c’est que cette séparation est un peu arbitraire. Quelles données réserve-t-on pour l’apprentissage et lesquelles sont à garder pour la validation ? Et même si par une magie noire, on arrive à se mettre d’accord sur cette première interrogation, un hic démeure… En effet, certaines données ne participeront jamais à l’apprentissage ou inversement à la validation. Puisqu’on a les a, à priori, toutes figées dans des cases ! Par conséquent, si on arrive à trouver des parmètres optimaux avec cette première séparation, il y aura toujours cette petite voix dans nos têtes pour nous demander : « est-ce qu’on aurait pu mieux faire avec une autre séparation ? 😐 ». Et tu sais comme c’est désagréable cette petite voix…. Eh bien, on peut la taire en utilisant la validation croisée !

Le principe de base de la validation croisée

Tu l’as peut-être deviné, l’objectif de la validation croisée est de faire intervenir toutes les données tant en apprentissage qu’en validation. Comment ? On commence par séparer désormais nos données en K tas. Couramment K = 5. Dans un premier temps, on garde le premier tas pour la validation et on entraine le modèle sur les 4 tas restants. Cette première étape nous permet ainsi d’avoir nos premiers paramètres (« Paramètres 1 »). Puis, on recommence la procédure mais cette fois-ci en gardant le deuxième tas pour la validation et le reste pour l’entrainement. On obtient « Paramètres 2 ». Et ainsi de suite, jusqu’à parcourir nos K tas. Tu vois, je t’avais dit que le principe était direct 😉.

Désormais, pour prédire l’échec scolaire Y = 1 ou Y = 0 à partir d’une donnée (X_1, X_2), on peut regarder les prédictions de chacune des 5 paramètres établis précédemment et retenir la réponse majoritaire (démocratie oblige). L’avantage, en procédant de cette façon, c’est qu’on est certain que toutes les données ont eu leur mot à dire. La confiance dans le résultat s’en trouve ainsi accrue. Mais on peut tout aussi décider de partir sur les paramètres qui permettent d’obtenir le score le plus élevé sur les données de validation. C’est d’ailleurs une façon très courante d’employer la technique de validation croisée.

Spécificités de la validation croisée
Cas d’usage

Comme tu as pu le voir plus haut, le premier usage de la validation croisée est probablement la recherche de paramètres optimaux pour un modèle donné. Et ça, tu comprends qu’on ne peut le faire que si on a déjà une idée du modèle qu’on désire utiliser pour résoudre notre problème : quelle profondeur pour une forêt aléatoire ? combien de classes pour un K-means ? …etc. Mais parfois, ou même très souvent, on peut avoir déjà du mal à choisir un modèle. Dans ce cas, on peut aussi utiliser la validation croisée pour estimer des moyennes de performance pour chacun de nos modèles. On garde ensuite naturellement le modèle qui performe le mieux.

Types de validation croisée

La validation croisée consistant à diviser les données en K tas n’est de fait qu’un cas particulier. Dans le jargon, il porte le nom de « KFold validation », K symbolisant le nombre de tas. Pour ta culture générale, il existe un cas particulier du KFold qui s’appelle le « Leave-one-out cross-validation »…. Oulà, beaucoup de mots anglais mais pas de panique 😛. Cela veut juste dire qu’à chaque itération, on ne garde qu’une seule donnée pour la validation et on entraine le modèle sur tout le reste des données. Bien sûr, ça prend par conséquent beaucoup de temps de calcul. Je te le recommande donc si tu ne sais pas quoi faire de tes prochaines vacances.

Il existe d’autres types de validation croisée comme par exemple le « shuffleSplit ». Dans cette dernière, on ne fait que deux tas à chaque itération (apprentissage et entrainement), mais on prend garde à mélanger à chaque itération pour avoir des répartitions aléatoires. On peut aussi citer le « StratifiedKFold » qui permet, si on a plusieurs classes dans la population de données, d’assurer la représentativité originale dans tous les tas (en termes de proportion). Je t’invite à regarder cette superbe vidéo de Machine Learnia si tu veux en savoir plus sur ces types de validation croisée.

Implémentation du KFold validation sur Python

Et maintenant, la traditionnelle étape de fin : l’implémentation sur Python 😀 ! Toutes les variantes de la validation croisée se trouvent de fait dans la librairie sklearn.model_selection. Pour le KFold par exemple, dans son usage le plus simple, il suffit de spécifier le nombre de tas qu’on désire : model_selection.KFold(K). Puis dans la même librairie, on dispose d’une fonction pour évaluer le score (performance) pour toutes les itérations de la validation croisée : model_selection.cross_val_score(). Pour qu’elle soit contente, il faut lui spécifier notre modèle (dans notre exemple, c’est la forêt aléatoire i.e RandomForestClassifier), nos données (variables X et résultats y), et aussi les tas pour la validation croisée.

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

validation_croisee = KFold(5) # Pour avoir les données pour une validation croisée avec 5 tas

#Evaluation des scores à chaque itération
scores_iterations = cross_val_score(RandomForestClassifier(), X, y, cv = validation_croisee)

Voilà, désormais, tu sais te servir de la validation croisée… je l’espère en tout cas parce que tu risques d’en entendre parler encore très longtemps 🙂.

Partager

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *