Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Séparation Entraînement-Test et Validation Croisée | Classificateur k-NN
Classification avec Python

bookSéparation Entraînement-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, nous divisons aléatoirement l'ensemble des données étiquetées en un ensemble d'entraînement et un ensemble de test.

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

En général, il est recommandé d’allouer environ 70-90 % des données au jeu d’entraînement et 10-30 % au jeu 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 ce cas, il est possible de réserver moins de 10 % des données pour les tests.

À présent, il est possible d’entraîner le modèle à l’aide du jeu d’entraînement et d’évaluer sa précision sur le jeu 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 = scaler.fit_transform(X_train) X_test = 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 faiblesses :

  • Non-utilisation de l'ensemble des données disponibles pour l'entraînement, ce qui pourrait améliorer le modèle ;
  • L'évaluation de la précision du modèle sur une petite portion de données (ensemble de test) rend ce score de précision 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 nouvel échantillonnage 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 d'affronter 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.

À noter, 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, il est possible de le réentraîner en utilisant l'ensemble du jeu de données.

Heureusement, sklearn propose la fonction cross_val_score() pour évaluer le modèle à l'aide de la validation croisée, ce qui évite d'avoir à l'implémenter soi-même :

Voici un exemple d'utilisation de la validation croisée avec un modèle k-NN entraîné sur le jeu de données d'é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

Choisissez toutes les affirmations correctes.

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 6

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

Suggested prompts:

Can you explain the difference between train-test split and cross-validation?

How do I choose the right number of folds for cross-validation?

What are some common pitfalls when using cross-validation?

Awesome!

Completion rate improved to 4.17

bookSéparation Entraînement-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, nous divisons aléatoirement l'ensemble des données étiquetées en un ensemble d'entraînement et un ensemble de test.

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

En général, il est recommandé d’allouer environ 70-90 % des données au jeu d’entraînement et 10-30 % au jeu 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 ce cas, il est possible de réserver moins de 10 % des données pour les tests.

À présent, il est possible d’entraîner le modèle à l’aide du jeu d’entraînement et d’évaluer sa précision sur le jeu 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 = scaler.fit_transform(X_train) X_test = 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 faiblesses :

  • Non-utilisation de l'ensemble des données disponibles pour l'entraînement, ce qui pourrait améliorer le modèle ;
  • L'évaluation de la précision du modèle sur une petite portion de données (ensemble de test) rend ce score de précision 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 nouvel échantillonnage 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 d'affronter 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.

À noter, 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, il est possible de le réentraîner en utilisant l'ensemble du jeu de données.

Heureusement, sklearn propose la fonction cross_val_score() pour évaluer le modèle à l'aide de la validation croisée, ce qui évite d'avoir à l'implémenter soi-même :

Voici un exemple d'utilisation de la validation croisée avec un modèle k-NN entraîné sur le jeu de données d'é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

Choisissez toutes les affirmations correctes.

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 6
some-alt