Contenu du cours
Classification Avec Python
Classification Avec Python
Séparation Train-Test. Validation Croisée
Dans les chapitres précédents, nous avons construit les modèles et prédit de nouvelles valeurs. Mais nous n'avons aucune idée de la performance du modèle et si ces prédictions sont fiables.
Division train-test
Pour mesurer la performance du modèle, nous avons besoin du sous-ensemble de données étiquetées que le modèle n'a pas vu. Nous divisons donc aléatoirement toutes les données étiquetées en ensemble d'entraînement et ensemble de test.
Ceci est réalisable en utilisant la fonction train_test_split()
de sklearn
.
Habituellement, vous divisez le modèle entre 70-90% pour l'ensemble d'entraînement et 10-30% pour l'ensemble de test. Cependant, des dizaines de milliers d'instances de test sont plus que suffisantes, donc il n'est pas nécessaire d'utiliser même 10% si votre ensemble de données est grand (millions d'instances).
Maintenant, nous pouvons entraîner le modèle en utilisant l'ensemble d'entraînement et calculer sa précision sur l'ensemble de test.
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[['StarWars4_rate', 'StarWars5_rate']] # Store feature columns as `X` y = df['StarWars6'] # Store target column as `y` # Split the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # Scale the data scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # Note that we use only transform for `X_test` # Initialize a model knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Print the accuracy on the test set print(knn.score(X_test_scaled, y_test))
Mais cette approche présente quelques défauts :
- 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 des ensembles de données plus petits (vous pouvez exécuter le code ci-dessus plusieurs fois et voir comment la précision change chaque fois qu'un nouvel ensemble de test est échantillonné).
Validation croisée
La validation croisée est conçue pour lutter contre ces problèmes. Son idée est de mélanger l'ensemble complet, de le diviser en 5 parties égales (folds), et d'exécuter 5 itérations où vous utiliserez 4 parties pour l'entraînement et 1 comme ensemble de test.
Ainsi, nous entraînons cinq modèles avec des ensembles de données légèrement différents. À chaque fois, nous calculons la précision de l'ensemble de test. Une fois cela fait, nous pouvons prendre une moyenne de ces 5 scores de précision, qui sera notre score de précision de validation croisée. Il est plus fiable puisque nous avons calculé le score de précision sur toutes nos données, en utilisant simplement cinq itérations pour cela.
Maintenant, nous savons à quel point le modèle fonctionne bien et nous pouvons réentraîner le modèle en utilisant l'ensemble complet de données.
Remarque
Vous pouvez utiliser un nombre de plis différent de cinq. Disons un certain nombre n. Ensuite, vous utiliserez un pli pour le jeu de test et n-1 pour le jeu d'entraînement. La fonction suivante facilite la configuration de telles choses.
Voici un exemple d'utilisation :
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[['StarWars4_rate', 'StarWars5_rate']] # Store feature columns as `X` y = df['StarWars6'] # Store target column as `y` # Scale the data scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # Initialize a model knn = KNeighborsClassifier(n_neighbors=3) # Print the accuracy on the test set scores = cross_val_score(knn, X_scaled, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
Le score utilisé par défaut pour la classification est l'exactitude :
Donc, seulement environ 75 % des prédictions sont correctes. Mais peut-être qu'avec un n_neighbors
différent, la précision sera meilleure ? Oui, ce sera le cas ! Le chapitre suivant couvre le choix du n_neighbors
(ou k) avec la précision de validation croisée la plus élevée.
Merci pour vos commentaires !