Menu
CoddyTech

Optimiser le modèle gagnant

Fait partie de la section Apprentissage supervisé du Journey Machine Learning de Coddy. Leçon 53 sur 58.

k-NN a gagné avec sa valeur par défaut de 5 voisins. Une autre valeur de k permettrait-elle de mieux classer les manchots ? Une recherche sur grille évalue chaque valeur de k que tu indiques par validation croisée, comme ici pour des scanners tumoraux :

Précision moyenne de k-NN en validation croisée sur des scanners tumoraux pour k de 1 à 29 : elle atteint un pic à k = 3 avec 0.974, marqué par une étoile, puis diminue jusqu’à 0.946 à k = 29

Comme pour le réglage d’un pipeline, k est nommé d’après son étape :

{"kneighborsclassifier__n_neighbors": [3, 5, 7]}

Un gain inférieur à l’écart-type des plis peut être dû à la chance. Et le réglage, lui aussi, n’utilise que les lignes d’entraînement.

challenge icon

Défi

Moyen

Votre pipeline k-NN est pipe, et default contient sa précision en validation croisée avec k = 5. Le programme lit les valeurs de k à essayer dans ks.

  1. Effectuez une recherche par grille sur ces valeurs avec 5 plis, à partir des lignes d’entraînement.
  2. Affichez la meilleure valeur de k et sa précision en validation croisée, avec 3 décimales.
  3. Affichez le gain par rapport à k = 5, avec 3 décimales.

Pour une autre colonie et la grille 3, 5, 9 :

Best k: 3
CV accuracy: 0.969
Gain over k = 5: 0.009

Essayez ensuite uniquement de grandes valeurs, comme 21 à 27. Le réglage améliore-t-il toujours les résultats ?

Essayez vous-même

import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.neighbors import KNeighborsClassifier

# La colonie de « Rencontre avec les manchots », ses caractéristiques et son étiquette
penguins = pd.read_csv("penguins.csv")
numbers = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
text = ["island", "sex"]
X = penguins[numbers + text]
y = penguins["species"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=0)

# De « Préparer les données » : les deux voies
number_steps = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
text_steps = make_pipeline(SimpleImputer(strategy="constant", fill_value="unknown"), OneHotEncoder())
prep = ColumnTransformer([("numbers", number_steps, numbers), ("words", text_steps, text)])

# De « Choisir un modèle » : le gagnant, k-NN avec sa valeur par défaut k = 5
pipe = make_pipeline(prep, KNeighborsClassifier())
default = cross_val_score(pipe, X_train, y_train, cv=5).mean()

# Les valeurs de k à essayer
n = int(input())
ks = []
for i in range(n):
    ks.append(int(input()))

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne