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

Regrouper des données sans étiquettes (k-moyennes)

Après cette leçon: Je peux regrouper des données sans étiquettes avec les k-moyennes.

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

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

MotCe que ça veut direExemple
Données non étiquetéesdes lignes sans colonne de réponses
Groupeun ensemble de lignes proches les unes des autrescluster
Centroïdele point moyen d’un groupe
k-moyennesune méthode qui déplace k centres jusqu’à ce que les groupes ne bougent plusKMeans
Mise à l’échelledonner la même dispersion à chaque variable avant de mesurer des distances
Inertiele 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

Code: python
# 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

Code: python
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

Commande
docker exec jupyter python3 steps/kmeans.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.

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

Commande
docker exec jupyter python3 steps/elbow.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.

À taper dans votre carnet : voir les groupes

Code: python
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.

À 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.