Kursinhalt
Clusteranalyse
Clusteranalyse
Interne Bewertung
Wie bei jeder Aufgabe im maschinellen Lernen verlassen wir uns auf spezifische Metriken, um die Qualität der Clusterbildung zu bewerten: Eine der Klassen solcher Metriken sind interne Metriken.
Interne Metriken in der Clusteranalyse werden verwendet, um die Qualität der Clusterergebnisse basierend auf den Daten zu bewerten, ohne externe Informationen oder Labels zu verwenden. Diese Metriken bieten ein quantitatives Maß dafür, wie gut ein Clusteralgorithmus die Datenpunkte basierend auf den intrinsischen Eigenschaften der Daten in Cluster gruppiert hat: insbesondere intra- und intercluster Distanzen.
Häufig verwendete interne Metriken
Silhouette-Score misst, wie gut ein Datenpunkt in seinen zugewiesenen Cluster im Vergleich zu anderen Clustern passt.
Der Silhouette-Score wird wie folgt berechnet:
Schritt 1. Für jeden Datenpunkt werden zwei Metriken berechnet:
- a: Der durchschnittliche Abstand zwischen dem Datenpunkt und allen anderen Punkten im selben Cluster;
- b: Der durchschnittliche Abstand zwischen dem Datenpunkt und allen Punkten im nächstgelegenen Cluster (d. h. dem Cluster, der dem Datenpunkt am ähnlichsten ist).
Schritt 2. Berechnen Sie den Silhouette-Score für jeden Datenpunkt mit der folgenden Formel:
Silhouette-Score = (b - a) / max(a, b)
Schritt 3. Berechnen Sie den gesamten Silhouette-Score für die Clusterbildung, indem Sie den Durchschnitt aller Scores für alle Punkte nehmen.
import matplotlib.pyplot as plt from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans from sklearn.datasets import make_moons, make_blobs, make_circles import warnings warnings.filterwarnings('ignore') # Create subplots for visualizations fig, axes = plt.subplots(1, 3) fig.set_size_inches(15, 5) # Adjusted figure size # Load circles dataset X_circles, y = make_circles(n_samples=500, factor=0.2) # Provide K-means clustering for circles dataset clustering_circles = KMeans(n_clusters=2).fit(X_circles) # Provide visualization and show silhouette for circles dataset axes[0].scatter(X_circles[:, 0], X_circles[:, 1], c=clustering_circles.labels_, cmap='tab20b') axes[0].set_title('Silhouette is: ' + str(round(silhouette_score(X_circles, clustering_circles.labels_), 3))) # Load blobs dataset X_blobs, y = make_blobs(n_samples=500, centers=2) # Provide K-means clustering for blobs dataset clustering_blobs = KMeans(n_clusters=2).fit(X_blobs) # Provide visualization and show silhouette for blobs dataset axes[1].scatter(X_blobs[:, 0], X_blobs[:, 1], c=clustering_blobs.labels_, cmap='tab20b') axes[1].set_title('Silhouette is: ' + str(round(silhouette_score(X_blobs, clustering_blobs.labels_), 3))) # Load moons dataset X_moons, y = make_moons(n_samples=500) # Provide K-means clustering for moons dataset clustering_moons = KMeans(n_clusters=2).fit(X_moons) # Provide visualization and show silhouette for moons dataset axes[2].scatter(X_moons[:, 0], X_moons[:, 1], c=clustering_moons.labels_, cmap='tab20b') axes[2].set_title('Silhouette is: ' + str(round(silhouette_score(X_moons, clustering_moons.labels_), 3))) # Display the plots plt.show()
Der Silhouettenkoeffizient variiert zwischen -1 und 1, wobei:
-
-1 darauf hinweist, dass der Datenpunkt nicht dem richtigen Cluster zugeordnet ist;
-
0 darauf hinweist, dass sich die Cluster überlappen;
-
1 darauf hinweist, dass der Cluster dicht und gut getrennt ist (daher der wünschenswerte Wert).
Der Davies-Bouldin-Index (DBI) ist eine interne Clustering-Bewertungsmetrik, die die Qualität des Clusterings bewertet, indem sowohl die Trennung zwischen Clustern als auch die Kompaktheit der Cluster berücksichtigt wird.
Der DBI wird wie folgt berechnet:
Schritt 1. Für jeden Cluster berechnen Sie den durchschnittlichen Abstand zwischen seinem Schwerpunkt und allen Datenpunkten in diesem Cluster. Dies misst die Ähnlichkeit des Clusters;
Schritt 2. Für jedes Clusterpaar berechnen Sie den Abstand zwischen ihren Schwerpunkten. Dies misst die Unähnlichkeit zwischen den Clustern;
Schritt 3. Für jeden Cluster finden Sie den Cluster mit der größten Ähnlichkeit zu ihm (ohne sich selbst);
Schritt 4. Für jeden Cluster berechnen Sie die Summe der Ähnlichkeit zwischen diesem Cluster und seinem nächsten Nachbarn und teilen Sie sie durch die Anzahl der Datenpunkte im Cluster. Dies ergibt den DBI-Wert für diesen Cluster;
Schritt 5. Schließlich berechnen Sie den gesamten DBI-Wert, indem Sie die durchschnittlichen DBI-Werte für alle Cluster nehmen.
import matplotlib.pyplot as plt from sklearn.metrics import davies_bouldin_score from sklearn.cluster import KMeans from sklearn.datasets import make_moons, make_blobs, make_circles import warnings warnings.filterwarnings('ignore') fig, axes = plt.subplots(1, 3) fig.set_size_inches(10, 5) X_circles, y = make_circles(n_samples=500, factor=0.2) clustering = KMeans(n_clusters=2).fit(X_circles) # Provide visualization and show DBI for circles dataset axes[0].scatter(X_circles[:, 0], X_circles[:, 1], c=clustering.labels_, cmap='tab20b') axes[0].set_title('DBI is: '+ str(round(davies_bouldin_score(X_circles, clustering.labels_), 3))) X_blobs, y = make_blobs(n_samples=500, centers=2) clustering = KMeans(n_clusters=2).fit(X_blobs) # Provide visualization and show DBI for blobs dataset axes[1].scatter(X_blobs[:, 0], X_blobs[:, 1], c=clustering.labels_, cmap='tab20b') axes[1].set_title('DBI is: '+ str(round(davies_bouldin_score(X_blobs, clustering.labels_), 3))) X_moons, y = make_moons(n_samples=500) clustering = KMeans(n_clusters=2).fit(X_moons) # Provide visualization and show DBI for moons dataset axes[2].scatter(X_moons[:, 0], X_moons[:, 1], c=clustering.labels_, cmap='tab20b') axes[2].set_title('DBI is: '+ str(round(davies_bouldin_score(X_moons, clustering.labels_), 3)))
Ein niedrigerer DBI-Wert weist auf eine bessere Clustering-Leistung hin, was darauf hindeutet, dass die Cluster gut getrennt und kompakt sind.
Danke für Ihr Feedback!