Menu
CoddyTech

Mettre à l’échelle avant le clustering

Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 9 sur 51.

K-means regroupe en fonction de la distance, donc les unités les plus grandes dominent. Le poids des chats du refuge est en grammes et leur âge en années : un écart de 500 g l’emporte sur un écart de 10 ans.

Deux graphiques représentant 120 chats du refuge, l’âge en années sur l’axe horizontal et le poids en grammes sur l’axe vertical. À gauche, regroupés sans mise à l’échelle : les chats adultes sont répartis selon leur poids, les jeunes et les vieux étant mélangés. À droite, regroupés après mise à l’échelle : les chatons, les adultes et les seniors sont répartis selon leur âge

Standardisez d’abord, comme pour k-NN, afin que chaque caractéristique compte de la même manière :

X_scaled = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X_scaled)

make_pipeline(StandardScaler(), KMeans(...)) fait les deux dans un seul modèle. Examine ensuite chaque groupe en unités réelles : calcule la moyenne de ses lignes d’origine, X[km.labels_ == c].mean(axis=0).

challenge icon

Défi

Facile

Une application de recherche d’appartements regroupe 100 annonces selon le loyer et la distance jusqu’à la gare. Le code de départ regroupe les colonnes brutes, et tous ses groupes se trouvent à environ 3 km : les dollars éclipsent les kilomètres.

  1. Normalise les deux colonnes avec un StandardScaler.
  2. Regroupe plutôt les lignes normalisées. Conserve le rapport : il indique chaque groupe en unités réelles.

Pour une autre ville :

38 flats: $1820 a month, 0.9 km out
33 flats: $1130 a month, 4.2 km out
29 flats: $2760 a month, 1.5 km out

Essayez vous-même

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Une ligne par appartement : loyer mensuel en dollars, distance jusqu’à la gare en km
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]

# Ceci regroupe les colonnes brutes en clusters : corrigez cela
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)

# Affichez chaque groupe en unités réelles, du plus grand au plus petit
sizes = pd.Series(km.labels_).value_counts()
for c in sizes.index:
    group = flats[km.labels_ == c]
    print(f"{sizes[c]} flats: ${round(group['rent'].mean())} a month, {group['station_km'].mean():.1f} km out")
quiz iconTestez-vous

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 non supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne