Cross Validation – LE tutoriel pour savoir comment l’utiliser – sklearn

Dans ce tutoriel on va voir comment utiliser simplement la Cross Validation avec Scikit-Learn et comment l’utiliser pour la prédiction.

La Cross Validation est un moyen d’assurer que notre modèle de Machine Learning est au maximum de ses capacités.

Il y a seulement 4 étapes pour réaliser une Cross Validation :

  1. créer 5 sous-groupes de notre dataset
  2. entraîner un modèle sur 4 sous-groupes
  3. évaluer le modèle sur le dernier sous-groupes
  4. répéter les étapes 2 et 3 pour que tous les sous-groupes soient évalués

Ici, la Cross Validation nous donnera, en bout de chaîne, 5 modèle de Machine Learning différent.

Cette multiplicité de modèle va nous permettre d’avoir une diversité dans les prédictions finales.

En fait, la Cross Validation permet d’avoir l’avis de 5 experts (5 modèle) au lieu d’un seul.

Vous pouvez choisir le nombre de sous-groupes créés lors de la Cross Validation, que ce soient 2, 3, 5 ou 40. La seule contrainte est d’avoir assez de données dans chaque sous-groupe pour obtenir un modèle robuste.

Une fois qu’on a tous ces avis, il nous faudra décider quel expert suivre. C’est ce qu’on va voir dans cet article.

Commençons par charger nos données ! 🔥

Data

Ce tutoriel est une suite à notre article détaillé pour apprendre le Machine Learning.

Mais vous pouvez bien évidemment suivre ce tutoriel sans avoir suivi le précédent. Il vous suffit de télécharger le dataset winequality-white.csv depuis cet adresse Github.

Notre dataset classe des vins en fonction de leur qualité. L’objectif est de prédire le niveau de qualité des vins à partir de leurs features (acidité, taux d’alcool, pH, etc).

Une fois le dataset chargé dans votre environnement de travail, ouvrez-le avec la librairie Pandas :

import pandas as pd

df = pd.read_csv("winequality-white.csv", sep=";")
df.head(3)

La Cross Validation (CV pour les intimes) divise notre dataset en sous-groupes.

Pour que ces sous-groupes aient tous une distribution équitable, on mélange tout d’abord le dataset grâce à la fonction sample(frac=1):

df = df.sample(frac=1).reset_index(drop=True)

reset_index(drop=True) permet de réinitialiser l’index de chaque ligne après le mélange.

Ensuite, on prépare nos features (X) et label (Y) pour la Cross Validation :

X = df.drop(columns='quality')
y = df['quality']

Remarque : Nous n’avons pas besoin de données train et test. Effectivement dans la Cross Validation, chaque sous-groupe est utilisé une fois pour le test et N-1 fois pour l’entraînement. Il n’est donc pas nécessaire d’indiquer le train et le test car tous les sous-groupes passent par ces étapes.

Cross Validation score

Chargeons le modèle le plus performant de notre article pour apprendre le Machine Learning : le Decision Tree.

from sklearn import tree

decisionTree = tree.DecisionTreeClassifier()

Avec ce modèle nous avions obtenue une précision de 60%.

Pourrons-nous faire mieux ?

On peut voir ça directement grâce à la fonction cross_val_score de sklearn :

from sklearn.model_selection import cross_val_score

scores = cross_val_score(decisionTree, X, y, cv=10)

Pour cette évaluation on a choisis de faire une Cross Validation sur 10 sous-groupes en indiquant cv=10.

Cela nous permet d’entraîner 10 modèles différents de Decision Tree.

On affiche le résultat de ces 10 modèles :

scores

Sortie : array([0.63265306, 0.57959184, 0.64693878, 0.6122449 , 0.65510204, 0.62040816, 0.59183673, 0.63265306, 0.63599182, 0.58282209])

La plupart des modèles ont une précision supérieur à 60%. C’est très bon signe !

Calculons la moyenne pour connaître le potentiel réelle de cette Cross Validation :

scores.mean()

Sortie : 0.619

61.9% de de précision, c’est 1,9% de plus que le score obtenue à la base.

Le problème, c’est que cross_val_score ne permet pas de récupérer les modèles entraînés.

Cette fonction permet seulement de tester la Cross Validation sur notre dataset et notre modèle.

En réalité, cross_val_score permet aux Data Scientists et Machine Learning Engineers de savoir si cela vaut le coup d’implémenter la Cross Validation.

Entraîner des modèles avec la Cross Validation

Maintenant qu’on sait que la Cross Validation améliorera notre modèle, on peut passer à la pratique !

Tout d’abord je vous propose de diviser notre dataset en deux :

  • Les données pour la Cross Validation, qu’on appellera train_test
  • Les données pour tester les modèles finaux, qu’on appellera gtest pour global test

Pour séparer notre dataset on utilise la fonction train_test_split (gtest sera composé de 10% de notre dataset) :

from sklearn.model_selection import train_test_split

X_train_test, X_gtest, y_train_test, y_gtest = train_test_split(X, y, test_size=0.10)

On peut initialiser notre classificateur :

from sklearn import tree

decisionTree = tree.DecisionTreeClassifier()

Et maintenant on peut implémenter la VRAIE Cross Validation.

Pour cela, c’est simple, on utilise la fonction cross_validate.

Cette fonction retourne plusieurs informations:

  • fit_time – la durée d’entraînement pour les N modèles
  • test_score – la précision des N modèles
  • score_time – la durée de scoring pour les N modèles
  • estimator (lorsque return_estimator=True) – les N modèles entraînés

Lançons la Cross Validation avec 10 sous-groupes :


CRÉER TON APPLICATION IA !


Reçois tes 5 JOURS De Formation GRATUITE Pour Apprendre À Créer Ton APPLICATION d’INTELLIGENCE ARTIFICIELLE !


Tous les fondamentaux de la création d’Application IA : les approches, les outils et techniques, les librairies et framework, et bien d'autres !

Découvres étape par étape la création d’application de Deep Learning (tu apprendras même à trouver des idées d’appli !).

En bonus, tu recevras notre Guide Ultime du Deep Learning !


from sklearn.model_selection import cross_validate

cv_results = cross_validate(decisionTree, X_train_test, y_train_test, cv=10, return_estimator=True)

On peut maintenant voir le score de chacun des 10 modèles entraînés :

cv_results['test_score']

Sortie :
array([0.6031746 , 0.59183673, 0.61904762, 0.59183673, 0.60997732,
0.63038549, 0.59637188, 0.58276644, 0.61136364, 0.65227273])

Et calculer la moyenne total :

cv_results['test_score'].mean()

Sortie : 0.608

On a gagné 0.8% pour les données de test. C’est peu mais c’est un score acceptable.

Quand est-il pour les données de test global que le modèle n’a jamais vu ?

Pour mesurer notre Cross Validation, on va parcourir chacun de nos modèles (stockés dans la variable cv_results['estimator']) et calculer le score pour X_gtest et y_gtest :

gtest_score = []
for i in range(len(cv_results['estimator'])):
  val_score.append(cv_results['estimator'][i].score(X_gtest, y_gtest))

Voilà le score final de la Cross Validation :

sum(gtest_score) / len(gtest_score)

Sortie : 0.618

On gagne 1.8% de précision par rapport à notre modèle de base ! C’est énorme ! 🎉

1.8% de précision en plus peut sembler insuffisant du point de vue d’un débutant en Machine Learning mais pour tout expert c’est une performance importante !

Effectivement, les compétitions de Machine Learning se joue parfois à 0.001% de différence de précision.

Prédire avec la Cross Validation

Comment utiliser les modèles pour faire des prédictions ?

Il y a différentes approches selon la personne :

  • Prendre le meilleur des N modèles et l’utiliser directement
  • Prendre le meilleur des N modèles et le ré-entraîner sur l’ensemble des données
  • Garder les N modèles et se fier à l’avis du plus grand nombre

Je tiens à préciser qu’il n’y pas de mauvaise manière de faire. Chaque méthode se vaut et sera utile selon votre contexte particulier. La meilleur option reste de tester par soi-même !

Avec notre article pour apprendre le Machine Learning, vous devriez être en mesure d’utiliser les deux premières options.

Je vous propose donc de détailler la 3ème qui reste la plus complexe, surtout qu’elle se divise en deux techniques.

Dans les parties suivantes, nous allons prédire le résultat pour le premier vin de X_gtest.

Calculer la prédiction pour les résultats bruts

Scikit-Learn offre deux options pour prédire :

  • predict() – les résultat brutes, dans notre cas la qualité du vin: 3, 4, 5, 6, 7, 8 ou 9
  • predict_proba() – les résultats sous forme de probabilités

Dans cette partie, on utilise l’option predict().

On prédit, pour chacun des 10 modèles, la qualité du premier vin de nos données X_gtest :

result = []
for i in range(len(cv_results['estimator'])):
  result.append(int(cv_results['estimator'][i].predict(X_gtest.iloc[:1])))

Chacun de ces résultat sont mis dans une liste, qu’on peut afficher :

result

Sortie : [5, 5, 5, 5, 5, 6, 6, 6, 5, 5]

L’objectif maintenant est de prendre la prédiction qui est sortie la plus souvent.

On voit ici que la plupart de nos modèles on conclut que le vin est de qualité 5, quand trois d’entre eux on prédit 6.

On extrait la valeur prédite le plus souvent…

max(set(result), key=result.count)

Sortie : 5

… que l’on peut comparer à la valeur réelle :

y_gtest.iloc[0]

Sortie : 5

Ici la valeur réelle est bien prédite ! La majorité a eu raison !

Calculer la prédiction pour les probabilités

Finalement, je vous propose d’utiliser l’option predict_proba() qui est la plus complexe d’entre toutes.

Pour le modèle de Machine Learning, 7 niveaux de qualité de vin sont possibles : 3, 4, 5, 6, 7, 8 ou 9.

Avec predict_proba() on obtient la probabilité que notre vin soient de chacune des qualités. Par exemple : 20% que le vin soit de qualité 3, 8% pour la qualité 4, 58% pour la 5, etc.

Avec notre Cross Validation, on obtiendra 10 listes de probabilités.

Pour calculer la prédiction de la Cross Validation, on va alors sommer toutes ces probabilités entre elles et diviser le résultat par le nombre de sous-groupes, 10.

En fait, on fait une moyenne de toutes nos probabilités pour déterminer la qualité avec la plus grande probabilité globale.

Tout d’abord, on additionne les probabilités entre elles :

import numpy as np

result_proba = cv_results['estimator'][0].predict_proba(X_gtest.iloc[:1])
for i in range(1, len(cv_results['estimator'])):
  result_proba =+ np.add(result_proba, cv_results['estimator'][i].predict_proba(X_gtest.iloc[:1]))

Puis on calcule la moyenne :

result_proba = result_proba/10

On extrait l’index ayant la plus forte probabilité :

np.argmax(result_proba)

Sortie : 2

Ici, l’index est 2, cela indique une qualité de 5.

Effectivement, si on prend notre liste de résultats possibles [3, 4, 5, 6, 7, 8, 9], le premier index étant 0, la qualité 3, le deuxième correspond à la qualité 5 :

wine_quality = [3, 4, 5, 6, 7, 8, 9]
wine_quality[np.argmax(result_proba)]

Sortie : 5

Ici, le résultat final pour la prédiction brute et la prédiction probabiliste reste la même mais, gardez en tête que ce n’est pas toujours le cas.

Conclusion

Dans cet article, nous avons appris comment améliorer la précision de notre modèle de Machine Learning de 1,8 % et comment utiliser la Cross Validation pour la prédiction.

D’autres méthodes existent pour améliorer un modèle de Machine Learning comme :

Une dernière chose : la Cross Validation n’est pas à prendre à la légère. C’est une technique utilisée en 2022 par les meilleurs experts pour pousser les modèles de Machine Learning au maximum de leurs performances.

La Cross Validation est même utilisée pour le Deep Learning !

Bientôt, un article sortira sur le sujet.

En attendant, si vous souhaitez rester informé, n’hésitez pas à vous abonnez à notre newsletter 😉


CRÉER TON APPLICATION IA !


Reçois tes 5 JOURS De Formation GRATUITE Pour Apprendre À Créer Ton APPLICATION d’INTELLIGENCE ARTIFICIELLE !


Tous les fondamentaux de la création d’Application IA : les approches, les outils et techniques, les librairies et framework, et bien d'autres !

Découvres étape par étape la création d’application de Deep Learning (tu apprendras même à trouver des idées d’appli !).

En bonus, tu recevras notre Guide Ultime du Deep Learning !


Tom Keldenich
Tom Keldenich

Data Engineer & passionné d'Intelligence Artificielle !

Fondateur du site Inside Machine Learning

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.