Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Séparation Train-Test. Validation Croisée | Classificateur K-NN
Classification Avec Python
course content

Contenu du cours

Classification Avec Python

Classification Avec Python

1. Classificateur K-NN
2. Régression Logistique
3. Arbre de Décision
4. Forêt Aléatoire
5. Comparer les Modèles

book
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.

123456789101112131415161718
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))
copy

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 :

1234567891011121314151617
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())
copy

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.

Choisissez toutes les affirmations correctes.

Choisissez toutes les affirmations correctes.

Sélectionnez quelques réponses correctes

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 6
We're sorry to hear that something went wrong. What happened?
some-alt