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 :
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.
Défi
MoyenVotre 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.
- Effectuez une recherche par grille sur ces valeurs avec 5 plis, à partir des lignes d’entraînement.
- Affichez la meilleure valeur de k et sa précision en validation croisée, avec 3 décimales.
- 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.009Essayez 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
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é
1Votre premier modèle
Apprendre à partir d’exemplesJeux d’entraînement et de testAjuster et prédireÉvaluer un modèleRécapitulatif : trieur de graines4Régression logistique
Prédictions oui ou nonLe seuil de décisionLes poids comme indicesPlusieurs classesRécapitulatif : filtre anti-spam2Plus proches voisins
Comment k-NN prend ses décisionsChoisir kFrontières de décisionMettre les voisins à l’échelleRécapitulatif : voisins et vin5Évaluer les classificateurs
La matrice de confusionPrécision et rappelLe score F1Classes déséquilibréesCourbes ROCRécapitulatif : test de dépistage8Validation croisée
Validation K-foldComparer les modèles équitablementRecherche par grilleRécapitulatif : réparations de skateboard11Projet : espèces de manchots
À la rencontre des manchotsPréparer les donnéesChoisir un modèleOptimiser le modèle gagnantDéployer le modèle3Régression linéaire
Prédire des nombresPlusieurs caractéristiquesMesurer les erreursGraphiques des résidusRécapitulatif : locations de vélos6Arbres de décision
Les arbres posent des questionsLire un arbreProfondeur de l’arbreImportance des caractéristiquesRécapitulatif : décisions de prêtEntraînez-vous par vous-même : Compilateur Python en ligne