Sé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 à quel point le modèle fonctionne bien 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 ensemble d'entraînement et ensemble de test.
Cela peut être réalisé à l'aide de la fonction train_test_split() de sklearn.
En général, le modèle est divisé entre 70-90 % pour l'ensemble d'entraînement et 10-30 % pour l'ensemble de test.
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.
123456789101112131415161718192021from 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, y_train) # Printing the accuracy on the test set print(knn.score(X_test, y_test))
Cependant, cette approche présente certaines limites :
- Nous n'utilisons pas toutes les données disponibles pour l'entraînement, ce qui pourrait améliorer notre modèle ;
- Puisque nous évaluons la précision du modèle sur une petite portion de données (ensemble de test), ce score de précision peut être peu fiable sur de petits ensembles de données. Vous pouvez exécuter le code ci-dessus plusieurs fois et 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. On peut la considérer comme une formation en classe pour votre modèle — elle aide le modèle à apprendre de manière plus équilibrée avant de passer le véritable test final.
Le principe consiste à mélanger l'ensemble des 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.
Gardez à l'esprit que la validation croisée ne remplace pas l'ensemble de test. Après avoir utilisé la validation croisée pour choisir et ajuster votre modèle, vous devez l'évaluer sur un ensemble de test séparé afin d'obtenir une évaluation impartiale de ses performances en conditions réelles.
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.
Cinq modèles sont entraînés avec des sous-ensembles légèrement différents. Pour chaque modèle, le taux de précision sur le jeu de test est calculé :
accuracy=predicted correctly+predicted incorrectlypredicted correctlyUne fois cette étape terminée, la moyenne des 5 scores de précision peut être calculée, ce qui constituera le score de précision de la validation croisée :
accuracyavg=5accuracy1+accuracy2+...+accuracy5C'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 :
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 :
12345678910111213141516171819from 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())
Le score utilisé par défaut pour la classification est l'exactitude.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion