Kursinhalt
Clusteranalyse
Clusteranalyse
Verwendung von Clustering auf Echten Daten
Wir haben 4 Clustering-Algorithmen betrachtet und die Prinzipien ihrer Arbeit an einfachen Datensätzen untersucht. Jetzt versuchen wir, diese Clustering-Methoden zur Lösung eines realen Problems mit echten Daten zu verwenden.
Wir werden den Iris-Datensatz verwenden, der aus 50 Proben von jeweils drei Iris-Arten besteht (Iris setosa, Iris virginica und Iris versicolor); von jeder Probe wurden vier Merkmale gemessen: die Länge und die Breite der Kelchblätter und Blütenblätter, in Zentimetern. Die Aufgabe besteht darin, den Typ der Iris anhand dieser Merkmale zu bestimmen: Wir werden Clustering bereitstellen und annehmen, dass jeder Cluster eine der Iris-Arten repräsentiert.
Um verständliche Visualisierungen bereitzustellen, verwenden wir nur zwei Merkmale für das Clustering: die Länge der Kelchblätter und die Länge der Blütenblätter. Schauen wir uns unsere Daten an:
from sklearn.datasets import load_iris import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] plt.scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') plt.title('Iris data') plt.xlabel('Length of sepals') plt.ylabel('Length of petals') plt.show()
Verwenden wir K-means, um Clustering bereitzustellen und die Ergebnisse mit echten Daten zu vergleichen:
from sklearn.datasets import load_iris from sklearn.cluster import KMeans import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] kmeans = KMeans(n_clusters=3).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = kmeans.labels_, cmap='tab20b') axes[1].set_title('Clusters with K-means') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Versuchen wir nun den agglomerativen Algorithmus:
from sklearn.datasets import load_iris from sklearn.cluster import AgglomerativeClustering import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] agglomerative = AgglomerativeClustering(n_clusters = 3).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = agglomerative.labels_, cmap='tab20b') axes[1].set_title('Clusters with Agglomerative') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Hinweis
Wir haben im Kapitel über Agglomerative Clustering erwähnt, dass wir die Anzahl der Cluster manuell definieren können. Hier haben wir diese Fähigkeit genutzt, da wir Informationen über die Anzahl der Zielcluster haben (3 Iris-Arten = 3 Cluster).
Verwendung des Mean Shift Clustering-Algorithmus:
from sklearn.datasets import load_iris from sklearn.cluster import MeanShift import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] mean_shift= MeanShift(bandwidth=2).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = mean_shift.labels_, cmap='tab20b') axes[1].set_title('Clusters with Mean shift') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Schließlich versuchen wir, DBSCAN zu verwenden:
from sklearn.datasets import load_iris from sklearn.cluster import DBSCAN import numpy as np import matplotlib.pyplot as plt X_iris, y_iris = load_iris(return_X_y=True) X_iris = X_iris[:, [0,2]] dbscan = DBSCAN(eps=1, min_samples=10).fit(X_iris) fig, axes = plt.subplots(1, 2) fig.set_size_inches(10, 5) axes[0].scatter(X_iris[:, 0], X_iris[:, 1], c=y_iris, cmap='tab20b') axes[0].set_title('Real clusters') axes[1].scatter(X_iris[:, 0], X_iris[:, 1], c = dbscan.labels_, cmap='tab20b') axes[1].set_title('Clusters with DBSCAN') plt.setp(axes[0], xlabel='Length of sepals') plt.setp(axes[0], ylabel='Length of petals') plt.setp(axes[1], xlabel='Length of sepals') plt.setp(axes[1], ylabel='Length of petals')
Hinweis
Im obigen Code haben wir die Parameter für die Algorithmen manuell definiert (eps, min_samples für DBSCAN und bandwidth für Mean Shift). Bei realen Aufgaben ist es notwendig, zusätzliche Techniken (Cross-Validation, Grid Search usw.) zu verwenden, um optimale Werte dieser Parameter zu bestimmen.
Wir können sehen, dass K-means und Agglomerative Algorithmen die Aufgabe aufgrund der Visualisierungen lösen können. Gleichzeitig können Mean Shift und DBSCAN keine 3 verschiedenen Cluster extrahieren.
Daher können wir schließen, dass für jede einzelne Aufgabe ein individueller Ansatz erforderlich ist: die Wahl eines Algorithmus, die Auswahl der Parameter usw. Darüber hinaus ist es notwendig, bestimmte Metriken festzulegen, mit denen wir die Qualität der Clusterbildung bewerten können. Die Verwendung von Cluster-Plots ist aus zwei Gründen nicht der beste Indikator:
- Plots können die Verteilung in Cluster für multivariate Daten (Daten mit mehr als 3 Merkmalen können nicht richtig visualisiert werden) nicht angemessen zeigen;
- Plots können Algorithmen zeigen, die sehr schlechte Ergebnisse liefern (wie DBSCAN und Mean Shift im obigen Beispiel). Aber wenn die Ergebnisse gut sind, ist es sehr schwierig zu verstehen, wo die Clusterqualität besser ist (wie K-means und Agglomerative im obigen Beispiel).
Wir werden im nächsten Abschnitt über die Bewertung der Qualität der Clusterbildung sprechen.
Danke für Ihr Feedback!