Cluster als Merkmale
Teil des Abschnitts Unüberwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 40 von 51.
Ein lineares Modell kann sich nicht krümmen. Das Telefonsignal in drei Dörfern nimmt mit der Entfernung zum Mast des jeweiligen Dorfs ab – eine Form, die sich allein anhand der Position nicht erfassen lässt:
k-means findet die Dörfer. km.transform liefert den Abstand jeder Zeile zu jedem Zentrum, und .min(axis=1) behält den nächstgelegenen Abstand:
km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X_train)
near_train = km.transform(X_train).min(axis=1)
near_test = km.transform(X_test).min(axis=1)
X_train2 = np.column_stack([X_train, near_train])
X_test2 = np.column_stack([X_test, near_test])Mit dieser einen zusätzlichen Spalte steigt das Test-R-Quadrat eines linearen Modells von 0.000 auf 0.886.
Führe k-Means nur für die Trainingszeilen aus, wie bei einem Scaler, und transformiere dann beide Datensätze.
Aufgabe
MittelDas Soundteam eines Festivals möchte wissen, wie laut es dort ist, wo die Menschen stehen. Das Startprogramm teilt crowd.csv auf, liest k ein und gibt den Wert nur anhand der Position aus.
- Führe k-means mit
kClustern auf den Trainingspositionen aus. - Füge in beiden Datensätzen jeder Zeile den Abstand zu ihrem nächsten Zentrum als dritte Spalte hinzu.
- Gib das neue Test-R-Quadrat und den Zugewinn mit 3 Dezimalstellen aus.
Für ein anderes Festival und k = 4:
Position only: R squared 0.097
With the nearest of 4 centers: R squared 0.734
Gain: 0.637Probier es selbst
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.cluster import KMeans
# 250 Festivalbesucher: wo sie standen (m) und der dortige Schallpegel (dB)
crowd = pd.read_csv("crowd.csv")
X = crowd[["x_m", "y_m"]].to_numpy()
y = crowd["sound_db"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())
# Passt eine lineare Regression an die Trainingsspalten an und gibt ihr R-Quadrat für die Testspalten zurück
def test_r2(A_train, A_test):
model = LinearRegression().fit(A_train, y_train)
return model.score(A_test, y_test)
before = test_r2(X_train, X_test)
print(f"Position only: R squared {before:.3f}")
# Schreibe deinen Code unten
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
1Gruppen finden
Lernen ohne LabelsÄhnlichkeit messenK-Means von HandK-Means mit scikit-learnRückblick: Fitnessstudiomitglieder4Hierarchisches Clustering
Schrittweises ZusammenführenAgglomerative ModelleDendrogrammeZusammenfassung: Hunderassen7PCA in der Praxis
64 Dimensionen sehenKomponenten als MusterKomprimieren und rekonstruierenPCA vor einem ModellRückblick: Gesichtsscanner10Projekt: Ziffern erkunden
Die Ziffern ansehenMit PCA verkleinernDie Ziffern gruppierenDie Gruppen benennenDie Ausreißer finden2k wählen
TrägheitDie Elbow-MethodeSilhouettenwerteVor dem Clustering skalierenRückblick: LieferzonenÜbe selbstständig: Online-Python-Compiler