Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Séparation Train-Test et Validation Croisée | Section
Fondamentaux de l'apprentissage supervisé

bookSéparation Train-Test et Validation Croisée

Dans les chapitres précédents, nous avons construit les modèles et prédit de nouvelles valeurs. Cependant, nous ne savons pas dans quelle mesure le modèle fonctionne ni si ces prédictions sont fiables.

Séparation entraînement-test

Pour évaluer la performance du modèle, il est nécessaire de disposer d'un sous-ensemble de données étiquetées que le modèle n'a pas vues. Ainsi, toutes les données étiquetées sont réparties aléatoirement en ensemble d'entraînement et ensemble de test.

Cela est réalisable à l'aide de la fonction train_test_split() de sklearn.

Arguments :

  • X — un tableau de valeurs de caractéristiques ;
  • y — un tableau de valeurs cibles ;
  • test_size — la proportion de l'ensemble de test ;

Retourne :

  • X_train, X_test, y_train, y_test — tableaux des mêmes types de données que X, y.

En général, on répartit le modèle avec 70-90 % pour l'ensemble d'entraînement et 10-30 % pour l'ensemble de test.

Note
Remarque

Lorsque votre jeu de données contient des millions d'instances, utiliser seulement quelques milliers pour les tests est généralement largement suffisant. Dans ces cas, il est possible de réserver même moins de 10 % des données pour les tests.

À présent, il est possible d'entraîner le modèle à l'aide de l'ensemble d'entraînement et d'évaluer sa précision sur l'ensemble de test.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Cependant, cette approche présente certaines limites :

  • Non-utilisation de l'ensemble des données disponibles pour l'entraînement, ce qui pourrait améliorer le modèle ;
  • Comme l'évaluation de la précision du modèle se fait sur une petite portion des données (ensemble de test), ce score de précision peut être peu fiable sur de petits ensembles de données. Il est possible d'exécuter le code ci-dessus plusieurs fois et d'observer comment la précision varie à chaque nouveau tirage de l'ensemble de test.

Validation croisée

La validation croisée est conçue pour résoudre le problème du surapprentissage et garantir que le modèle puisse bien se généraliser à de nouvelles données non vues. Il s'agit d'une formation en classe pour le modèle — cela permet au modèle d'apprendre de manière plus équilibrée avant de passer le véritable test final.

Le principe consiste à mélanger l'ensemble du jeu de données et à le diviser en n parties égales, appelées plis. Ensuite, le modèle effectue n itérations. À chaque itération, n-1 plis sont utilisés pour l'entraînement et 1 pli est utilisé pour la validation. Ainsi, chaque partie des données est utilisée une fois pour la validation, ce qui permet d'obtenir une estimation plus fiable des performances du modèle.

Il est important de noter que la validation croisée ne remplace pas l'ensemble de test. Après avoir utilisé la validation croisée pour choisir et ajuster le modèle, il convient de l'évaluer sur un ensemble de test séparé afin d'obtenir une évaluation impartiale de ses performances en conditions réelles.

Note
Remarque

Un choix courant pour le nombre de plis est 5. Dans ce cas, un pli sera utilisé comme jeu de test, et les 4 plis restants seront utilisés pour l'entraînement.

Nous entraînons cinq modèles avec des sous-ensembles légèrement différents. Pour chaque modèle, nous calculons la précision sur le jeu de test :

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Une fois cela fait, nous pouvons calculer la moyenne de ces 5 scores de précision, qui sera notre score de précision de validation croisée :

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

C'est plus fiable car nous avons calculé le score de précision en utilisant toutes nos données — simplement réparties différemment sur cinq itérations.

Maintenant que nous connaissons les performances du modèle, nous pouvons le réentraîner en utilisant l'ensemble du jeu de données.

Heureusement, sklearn fournit la fonction cross_val_score() pour évaluer le modèle à l'aide de la validation croisée, vous n'avez donc pas à l'implémenter vous-même :

Arguments :

  • estimator — l'objet du modèle ;
  • X — un tableau de valeurs de caractéristiques ;
  • y — un tableau de valeurs cibles ;
  • cv — le nombre de plis (5 par défaut) ;
  • scoring — la métrique (précision par défaut) ;

Retourne :

  • scores — un tableau de scores pour chaque itération.

Voici un exemple d'utilisation de la validation croisée avec un modèle k-NN entraîné sur le jeu de données des évaluations Star Wars :

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Le score utilisé par défaut pour la classification est l'exactitude.

question mark

Sélectionnez toutes les affirmations correctes.

Select all correct answers

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 19

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

bookSéparation Train-Test et Validation Croisée

Glissez pour afficher le menu

Dans les chapitres précédents, nous avons construit les modèles et prédit de nouvelles valeurs. Cependant, nous ne savons pas dans quelle mesure le modèle fonctionne ni si ces prédictions sont fiables.

Séparation entraînement-test

Pour évaluer la performance du modèle, il est nécessaire de disposer d'un sous-ensemble de données étiquetées que le modèle n'a pas vues. Ainsi, toutes les données étiquetées sont réparties aléatoirement en ensemble d'entraînement et ensemble de test.

Cela est réalisable à l'aide de la fonction train_test_split() de sklearn.

Arguments :

  • X — un tableau de valeurs de caractéristiques ;
  • y — un tableau de valeurs cibles ;
  • test_size — la proportion de l'ensemble de test ;

Retourne :

  • X_train, X_test, y_train, y_test — tableaux des mêmes types de données que X, y.

En général, on répartit le modèle avec 70-90 % pour l'ensemble d'entraînement et 10-30 % pour l'ensemble de test.

Note
Remarque

Lorsque votre jeu de données contient des millions d'instances, utiliser seulement quelques milliers pour les tests est généralement largement suffisant. Dans ces cas, il est possible de réserver même moins de 10 % des données pour les tests.

À présent, il est possible d'entraîner le modèle à l'aide de l'ensemble d'entraînement et d'évaluer sa précision sur l'ensemble de test.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Cependant, cette approche présente certaines limites :

  • Non-utilisation de l'ensemble des données disponibles pour l'entraînement, ce qui pourrait améliorer le modèle ;
  • Comme l'évaluation de la précision du modèle se fait sur une petite portion des données (ensemble de test), ce score de précision peut être peu fiable sur de petits ensembles de données. Il est possible d'exécuter le code ci-dessus plusieurs fois et d'observer comment la précision varie à chaque nouveau tirage de l'ensemble de test.

Validation croisée

La validation croisée est conçue pour résoudre le problème du surapprentissage et garantir que le modèle puisse bien se généraliser à de nouvelles données non vues. Il s'agit d'une formation en classe pour le modèle — cela permet au modèle d'apprendre de manière plus équilibrée avant de passer le véritable test final.

Le principe consiste à mélanger l'ensemble du jeu de données et à le diviser en n parties égales, appelées plis. Ensuite, le modèle effectue n itérations. À chaque itération, n-1 plis sont utilisés pour l'entraînement et 1 pli est utilisé pour la validation. Ainsi, chaque partie des données est utilisée une fois pour la validation, ce qui permet d'obtenir une estimation plus fiable des performances du modèle.

Il est important de noter que la validation croisée ne remplace pas l'ensemble de test. Après avoir utilisé la validation croisée pour choisir et ajuster le modèle, il convient de l'évaluer sur un ensemble de test séparé afin d'obtenir une évaluation impartiale de ses performances en conditions réelles.

Note
Remarque

Un choix courant pour le nombre de plis est 5. Dans ce cas, un pli sera utilisé comme jeu de test, et les 4 plis restants seront utilisés pour l'entraînement.

Nous entraînons cinq modèles avec des sous-ensembles légèrement différents. Pour chaque modèle, nous calculons la précision sur le jeu de test :

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Une fois cela fait, nous pouvons calculer la moyenne de ces 5 scores de précision, qui sera notre score de précision de validation croisée :

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

C'est plus fiable car nous avons calculé le score de précision en utilisant toutes nos données — simplement réparties différemment sur cinq itérations.

Maintenant que nous connaissons les performances du modèle, nous pouvons le réentraîner en utilisant l'ensemble du jeu de données.

Heureusement, sklearn fournit la fonction cross_val_score() pour évaluer le modèle à l'aide de la validation croisée, vous n'avez donc pas à l'implémenter vous-même :

Arguments :

  • estimator — l'objet du modèle ;
  • X — un tableau de valeurs de caractéristiques ;
  • y — un tableau de valeurs cibles ;
  • cv — le nombre de plis (5 par défaut) ;
  • scoring — la métrique (précision par défaut) ;

Retourne :

  • scores — un tableau de scores pour chaque itération.

Voici un exemple d'utilisation de la validation croisée avec un modèle k-NN entraîné sur le jeu de données des évaluations Star Wars :

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Le score utilisé par défaut pour la classification est l'exactitude.

question mark

Sélectionnez toutes les affirmations correctes.

Select all correct answers

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 19
some-alt