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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Classification | le choix d’une étiquette pour une ligne | |
| Étiquette | la réponse qu’un modèle prédit | busy |
| Variable explicative | une entrée dont le modèle se sert pour décider | temp_c |
| Plus proches voisins | les lignes d’entraînement les plus près d’un point nouveau | |
| Exactitude | la part des réponses justes | |
| Matrice de confusion | un 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 | Écart | Parmi le plus proche ? | Parmi les 3 plus proches ? |
|---|---|---|---|---|
| 10 degrés, 4 mm | calme | 2,24 | Oui | Oui |
| 13 degrés, 0 mm | plein | 2,83 | Non | Oui |
| 15 degrés, 1 mm | plein | 4,12 | Non | Oui |
| 6 degrés, 1 mm | calme | 5,10 | Non | Non |
| 8 degrés, 8 mm | calme | 6,71 | Non | Non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Des écarts et un vote à la main
# 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
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é
docker exec jupyter python3 steps/knn.pyAffiché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 plein | Répondu calme | Total | |
|---|---|---|---|
| Vraiment plein | 23 | 10 | 33 |
| Vraiment calme | 7 | 52 | 59 |
| Total | 30 | 62 | 92 |
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
docker exec jupyter python3 steps/knnk.pyAffiché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.