Menu
CoddyTech

Vor dem Clustering skalieren

Teil des Abschnitts Unüberwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 9 von 51.

K-means gruppiert nach Abstand, daher geben die größten Einheiten den Ausschlag. Tierheimkatzen nach Gewicht in Gramm und Alter in Jahren: Ein Abstand von 500 g übertrumpft einen von 10 Jahren.

Zwei Diagramme mit 120 Tierheimkatzen, Alter in Jahren auf der horizontalen und Gewicht in Gramm auf der vertikalen Achse. Links, mit Rohdaten geclustert: Die erwachsenen Katzen werden nach Gewicht aufgeteilt, wobei junge und alte Katzen vermischt werden. Rechts, nach der Skalierung geclustert: Kitten, erwachsene Katzen und Senioren, aufgeteilt nach Alter

Standardisiere zuerst wie bei k-NN, damit jedes Merkmal gleich gewichtet wird:

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(...)) erledigt beides in einem Modell. Lies anschließend jede Gruppe in realen Einheiten aus: Bilde den Durchschnitt ihrer ursprünglichen Zeilen, X[km.labels_ == c].mean(axis=0).

challenge icon

Aufgabe

Einfach

Eine Wohnungssuch-App gruppiert 100 Inserate nach Miete und Entfernung zum Bahnhof. Die Ausgangslösung clustert die Rohspalten, und ihre Gruppen liegen alle etwa 3 km entfernt: Dollarwerte überdecken Kilometer.

  1. Skaliere die beiden Spalten mit einem StandardScaler.
  2. Cluster stattdessen die skalierten Zeilen. Behalte die Ausgabe bei: Sie liest jede Gruppe in realen Einheiten aus.

Für eine andere Stadt:

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

Probier es selbst

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

# Eine Zeile pro Wohnung: Monatsmiete in Dollar, Entfernung zum Bahnhof in km
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]

# Das gruppiert die unskalierten Spalten: Korrigiere es
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)

# Gib jede Gruppe in tatsächlichen Einheiten aus, die größte zuerst
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unüberwachtes Lernen

Übe selbstständig: Online-Python-Compiler