Dans ce tutoriel, on va voir comment utiliser simplement la Cross Validation avec Scikit-Learn et réaliser des prédictions.
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 :
- créer 5 sous-groupes de notre dataset
- entraîner un modèle sur 4 sous-groupes
- évaluer le modèle sur le dernier sous-groupes
- 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èlestest_score
– la précision des N modèlesscore_time
– la durée de scoring pour les N modèlesestimator
(lorsquereturn_estimator=True
) – les N modèles entraînés
Lançons la Cross Validation avec 10 sous-groupes :
Au fait, si ton objectif est d'apprendre le Deep Learning - j’ai préparé pour toi le Plan d’action pour Maîtriser les Réseaux de neurones.
7 jours de conseils gratuits d’un ingénieur spécialisé en Intelligence Artificielle pour apprendre à maîtriser les réseaux de neurones à partir de zéro :
- Planifie ton apprentissage
- Structure tes projets
- Développe tes algorithmes d’Intelligence Artificielle
J’ai basé ce programme sur des faits scientifiques, des approches éprouvées par des chercheurs mais également mes propres techniques que j'ai conçues au fil de mes expériences dans le domaine du Deep Learning.
Pour y accéder, clique ici :
À présent, on peut revenir à ce que je mentionnais précédemment.
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 9predict_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 :
- Normaliser nos données
- Changer les hyperparamètres des modèles
- La Data Augmentation
- Les méthodes d’ensemble
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 😉
Un dernier mot, si tu veux aller plus loin et apprendre le Deep Learning - j’ai préparé pour toi le Plan d’action pour Maîtriser les Réseaux de neurones.
7 jours de conseils gratuits d’un ingénieur spécialisé en Intelligence Artificielle pour apprendre à maîtriser les réseaux de neurones à partir de zéro :
- Planifie ton apprentissage
- Structure tes projets
- Développe tes algorithmes d’Intelligence Artificielle
J’ai basé ce programme sur des faits scientifiques, des approches éprouvées par des chercheurs mais également mes propres techniques que j'ai conçues au fil de mes expériences dans le domaine du Deep Learning.
Pour y accéder, clique ici :