Sé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 à quel point le modèle fonctionne bien ni si ces prédictions sont fiables.
Séparation entraînement-test
Pour mesurer 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.
Ceci est réalisable en utilisant la fonction train_test_split() de sklearn.
En général, le modèle est divisé à environ 70-90 % pour l'ensemble d'entraînement et 10-30 % pour l'ensemble de test.
Lorsque votre ensemble 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 moins de 10 % des données pour les tests.
Nous pouvons maintenant entraîner le modèle à l'aide de l'ensemble d'entraînement et é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))
Mais cette approche présente certaines faiblesses :
- Nous n'utilisons pas toutes les données disponibles pour l'entraînement, ce qui pourrait améliorer notre modèle ;
- Comme 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 généraliser sur 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 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.
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, il faut 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 ensemble de test, et les 4 plis restants seront utilisés pour l'entraînement.
Entraînement de cinq modèles avec des sous-ensembles légèrement différents. Pour chaque modèle, calcul de la précision sur l'ensemble de test :
accuracy=predicted correctly+predicted incorrectlypredicted correctlyAprès cette étape, calcul de la moyenne des 5 scores de précision, qui correspond au 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 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 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())
La mesure utilisée par défaut pour la classification est la précision.
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