Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Classer un point selon ses voisins (kNN)

Après cette leçon: Je peux classer un point d’après ses voisins et mesurer combien de fois la réponse est juste.

Leçon de 55 min2 commandesLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Appeler un second employé ou non ?

Chaque matin, le loueur décide s’il fait venir un second employé. Il n’a pas besoin d’un nombre exact de locations. Il lui faut un seul mot : plein ou calme.

Une bonne idée consiste à regarder les jours passés qui ressemblent le plus à aujourd’hui, et à voir ce qu’ils ont donné. C’est toute l’idée de cette leçon.

À la fin de cette leçon

Remarque

Je peux classer un point d’après ses voisins et mesurer combien de fois la réponse est juste.

Mots clés

MotCe que ça veut direExemple
Classificationle choix d’une étiquette pour une ligne
Étiquettela réponse qu’un modèle préditbusy
Variable explicativeune entrée dont le modèle se sert pour décidertemp_c
Plus proches voisinsles lignes d’entraînement les plus près d’un point nouveau
Exactitudela part des réponses justes
Matrice de confusionun tableau des vraies étiquettes face aux réponses

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Les voisins votent pour l’étiquette

Chaque jour est un point placé par ses variables explicatives, ici la température et la pluie. La distance entre deux jours est l’écart en ligne droite entre leurs points.

Pour étiqueter un jour nouveau, on cherche les k jours d’entraînement les plus proches. Chacun vote avec sa propre étiquette, et la majorité l’emporte. Avec deux étiquettes, un k impair évite toute égalité.

Exemple travaillé : 11 degrés et 2 mm

Jour d’entraînementÉtiquetteÉcartParmi le plus proche ?Parmi les 3 plus proches ?
10 degrés, 4 mmcalme2,24OuiOui
13 degrés, 0 mmplein2,83NonOui
15 degrés, 1 mmplein4,12NonOui
6 degrés, 1 mmcalme5,10NonNon
8 degrés, 8 mmcalme6,71NonNon

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Des écarts et un vote à la main

Code: python
# Un jour nouveau : 11 degrés et 2 mm de pluie.
nouveau = [11.0, 2.0]
jours = [[10.0, 4.0, "calme"], [13.0, 0.0, "plein"], [15.0, 1.0, "plein"],
         [6.0, 1.0, "calme"], [8.0, 8.0, "calme"]]
for jour in jours:
    ecart = ((jour[0] - nouveau[0]) ** 2 + (jour[1] - nouveau[1]) ** 2) ** 0.5
    print(jour[2], round(ecart, 2))
# Les trois plus petits écarts votent. Quelle étiquette gagne ?
# Changez nouveau en [7.0, 1.0] et votez de nouveau.

À taper dans votre carnet : les jours voisins

Code: python
import pandas as pd

locations = pd.read_csv("hires.csv")
# Le 14 juillet est la ligne 194, car on compte depuis 0.
jour = locations.loc[194, ["temp_c", "rain_mm"]]
ecart = ((locations[["temp_c", "rain_mm"]] - jour) ** 2).sum(axis=1) ** 0.5
locations.assign(ecart=ecart).sort_values("ecart").head(6)

Une exactitude se compare à quelque chose

knn.py dit qu’un jour est busy, plein, à 300 locations ou plus, et quiet, calme, sinon. Il apprend sur trois quarts de l’année et devine le reste avec k = 5.

L’exactitude est la part des réponses justes. Seule, elle dit peu de chose. Le script affiche donc aussi le score d’une règle paresseuse qui dit toujours « calme ». Un modèle n’est utile que s’il fait mieux.

Classer les jours gardés de côté

Commande
docker exec jupyter python3 steps/knn.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

La matrice de confusion montre les erreurs

Deux modèles de même exactitude peuvent se tromper différemment. Une matrice de confusion compte chaque paire de vérité et de réponse.

Dans knn.py, les lignes sont la vérité et les colonnes la réponse, busy en premier. Prendre un jour plein pour calme laisse un employé seul face à la file. Prendre un jour calme pour plein paie quelqu’un à attendre. Le loueur ne voit pas ces deux erreurs du même œil.

Exemple travaillé : la matrice de knn.py

Répondu pleinRépondu calmeTotal
Vraiment plein231033
Vraiment calme75259
Total306292

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une erreur fréquente

Attention

Beaucoup pensent qu’une forte exactitude fait un bon classifieur. Quand une étiquette est courante, la répondre à chaque fois rapporte beaucoup : 0,641 ici, sans aucun savoir-faire. Comparez toujours à ce score paresseux, et lisez la matrice pour les erreurs qui coûtent le plus.

Choisir k

Avec k = 1, le modèle recopie le seul jour le plus proche, avec tout son bruit. Il paraît presque parfait sur les jours appris et moins bon sur les nouveaux.

Un grand k lisse le bruit. Trop grand, il pousse chaque réponse vers l’étiquette la plus courante. knnk.py essaie six valeurs de k et note chacune sur les deux groupes de jours.

Essayer six valeurs de k

Commande
docker exec jupyter python3 steps/knnk.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Pour aller plus loin

Dans votre carnet, ajoutez au kNN une variable week-end de 1 et de 0. Notez-le sur le même découpage que knn.py. Mettez ensuite chaque variable à l’échelle avec StandardScaler, puis notez de nouveau.

Expliquez pourquoi la mise à l’échelle peut compter pour kNN. Indice : le week-end ne déplace un point que de 1, la température jusqu’à 26.

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.