Des sortes de jours que personne n’a nommées
Le loueur veut trois plannings d’équipe : un pour les jours creux, un pour les jours ordinaires, un pour les jours de rush. Personne n’a jamais noté un jour comme creux ou rush.
Il n’y a pas de colonne de réponses dont apprendre. Les jours doivent se ranger seuls en groupes, et c’est à vous de juger si ces groupes ont du sens.
À la fin de cette leçon
Remarque
Je peux regrouper des données sans étiquettes avec les k-moyennes.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Données non étiquetées | des lignes sans colonne de réponses | |
| Groupe | un ensemble de lignes proches les unes des autres | cluster |
| Centroïde | le point moyen d’un groupe | |
| k-moyennes | une méthode qui déplace k centres jusqu’à ce que les groupes ne bougent plus | KMeans |
| Mise à l’échelle | donner la même dispersion à chaque variable avant de mesurer des distances | |
| Inertie | le total des distances au carré entre chaque point et son centroïde |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les k-moyennes répètent deux étapes
Choisissez k, le nombre de groupes. Placez k centres quelque part parmi les points.
Répétez ensuite deux étapes. Donnez chaque point au centre le plus proche. Déplacez chaque centre à la moyenne de ses points : il devient un centroïde. Arrêtez quand aucun point ne change de groupe. Des départs différents peuvent finir sur des groupes différents : scikit-learn en essaie plusieurs et garde le meilleur.
Une étape à la main
# Une étape des k-moyennes sur six jours, par les locations seules.
jours = [110, 140, 190, 290, 340, 410]
centres = [100, 400]
groupes = [[], []]
for valeur in jours:
if abs(valeur - centres[0]) <= abs(valeur - centres[1]):
groupes[0].append(valeur)
else:
groupes[1].append(valeur)
print("groupes :", groupes)
for n in range(2):
centres[n] = round(sum(groupes[n]) / len(groupes[n]), 1)
print("nouveaux centres :", centres)
# Relancez l'étape depuis les nouveaux centres.
# Un jour change-t-il de groupe ?
Mettre à l’échelle avant de mesurer
Les locations vont de 41 à 487 par jour. Les températures vont d’environ -1 à 25 degrés. Un écart de 10 locations est minuscule ; un écart de 10 degrés est énorme.
Une distance traite pourtant ces deux 10 de la même façon. Sans mise à l’échelle, les locations décident de tout. StandardScaler donne à chaque variable une moyenne de 0 et la même dispersion : chacune compte équitablement.
À taper dans votre carnet : sans échelle
import pandas as pd
from sklearn.cluster import KMeans
locations = pd.read_csv("hires.csv")
# Sans mise à l’échelle : des centaines de locations, environ 26 degrés d’écart.
locations["brut"] = KMeans(n_clusters=3, n_init=10, random_state=0).fit_predict(locations[["temp_c", "hires"]])
locations.groupby("brut")[["temp_c", "hires"]].agg(["min", "max"])
Regrouper les jours, mis à l’échelle
docker exec jupyter python3 steps/kmeans.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.
Une erreur fréquente
Attention
Beaucoup pensent que les k-moyennes découvrent combien de groupes les données ont vraiment. Elles rendent toujours exactement les k groupes demandés, même à partir de données sans aucun groupe. Choisir k, et nommer chaque groupe, reste votre jugement.
Le coude aide à choisir k
L’inertie est le total des distances au carré entre chaque point et son centroïde. Plus de groupes la font toujours baisser ; avec un groupe par point, elle tombe à 0.
Cherchez donc le coude : le k après lequel un groupe de plus apporte peu. Demandez-vous ensuite si les groupes servent au loueur.
L’inertie pour k de 1 à 6
docker exec jupyter python3 steps/elbow.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.
À taper dans votre carnet : voir les groupes
from sklearn.preprocessing import StandardScaler
echelle = StandardScaler().fit_transform(locations[["temp_c", "hires"]])
locations["groupe"] = KMeans(n_clusters=3, n_init=10, random_state=0).fit_predict(echelle)
# Une couleur par groupe.
locations.plot.scatter(x="temp_c", y="hires", c="groupe", colormap="viridis")
Pour aller plus loin
Dans votre carnet, regroupez sur trois variables mises à l’échelle : température, pluie et locations. Essayez k = 3 puis k = 4.
Pour chaque groupe, affichez sa taille et la moyenne de chaque variable. Donnez à chaque groupe un nom que comprendrait la personne qui fait les plannings. Dites quel k vous choisiriez, et pourquoi.