Kursinhalt
Clusteranalyse
Clusteranalyse
Externe Bewertung
Die externe Bewertung von Clustering-Algorithmen ist eine Methode zur Bewertung der Leistung eines Clustering-Algorithmus, indem seine Ergebnisse mit einem bekannten Satz von Klassenlabels oder Ground Truth verglichen werden. Mit anderen Worten, die Cluster des Algorithmus werden mit einem Satz von bereits bestehenden Labels verglichen, die von Experten erstellt oder auf Domänenwissen basieren.
Am häufigsten verwendete externe Metriken
Der Rand-Index (RI) misst die Ähnlichkeit zwischen zwei Clusterings oder Partitionen und wird häufig als externe Bewertungsmetrik im Clustering verwendet. Der Rand-Index misst den Prozentsatz der Datenpunktpaare, die in beiden, dem vorhergesagten und dem tatsächlichen Clustering, demselben Cluster zugewiesen sind, normalisiert durch die Gesamtzahl der Datenpunktpaare.
Der Rand-Index wird wie folgt berechnet:
- Sei n die Gesamtzahl der Datenpunkte;
- Sei a die Anzahl der Datenpunktpaare, die in beiden, dem vorhergesagten und dem tatsächlichen Clustering, demselben Cluster zugewiesen sind;
- Sei b die Anzahl der Datenpunktpaare, die in beiden, dem vorhergesagten und dem tatsächlichen Clustering, verschiedenen Clustern zugewiesen sind.
Der Rand-Index wird dann durch 2*(a+b)/ (n*(n-1)) gegeben.
from sklearn.metrics import rand_score from sklearn.cluster import KMeans from sklearn.datasets import make_moons, make_blobs, make_circles import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Creating subplots for visualization fig, axes = plt.subplots(1, 3) fig.set_size_inches(10, 5) # Create circles dataset X_circles, y = make_circles(n_samples=500, factor=0.2) # Provide K-means clustering clustering = KMeans(n_clusters=2).fit(X_circles) predicted_circles = clustering.predict(X_circles) # Provide visualization and show RI for circles dataset axes[0].scatter(X_circles[:, 0], X_circles[:, 1], c=clustering.labels_, cmap='tab20b') axes[0].set_title('RI is: '+ str(round(rand_score(y, predicted_circles), 3))) X_blobs, y = make_blobs(n_samples=500, centers=2) clustering = KMeans(n_clusters=2).fit(X_blobs) predicted_blobs = clustering.predict(X_blobs) # Provide visualization and show RI for blobs dataset axes[1].scatter(X_blobs[:, 0], X_blobs[:, 1], c=clustering.labels_, cmap='tab20b') axes[1].set_title('RI is: '+ str(round(rand_score(y, predicted_blobs), 3))) X_moons, y = make_moons(n_samples=500) clustering = KMeans(n_clusters=2).fit(X_moons) predicted_moons = clustering.predict(X_moons) # Provide visualization and show RI for moons dataset axes[2].scatter(X_moons[:, 0], X_moons[:, 1], c=clustering.labels_, cmap='tab20b') axes[2].set_title('RI is: '+ str(round(rand_score(y, predicted_moons), 3)))
Der Rand-Index kann zwischen 0 und 1 variieren, wobei 0 anzeigt, dass die beiden Clusterungen völlig unterschiedlich sind, und 1 anzeigt, dass die beiden Clusterungen identisch sind.
Mutual Information (MI) misst die Menge an Informationen, die von den vorhergesagten und den tatsächlichen Clusterungen basierend auf dem Konzept der Entropie geteilt werden. Wir werden nicht darauf eingehen, wie diese Metrik berechnet wird, da dies außerhalb des Rahmens des Anfängerkurses liegt.
from sklearn.metrics import mutual_info_score from sklearn.cluster import KMeans from sklearn.datasets import make_moons, make_blobs, make_circles import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Create subplots for visualizations 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) predicted_circles = clustering.predict(X_circles) # Provide visualization and show MI for circles dataset axes[0].scatter(X_circles[:, 0], X_circles[:, 1], c=clustering.labels_, cmap='tab20b') axes[0].set_title('MI is: '+ str(round(mutual_info_score(y, predicted_circles), 3))) X_blobs, y = make_blobs(n_samples=500, centers=2) clustering = KMeans(n_clusters=2).fit(X_blobs) predicted_blobs = clustering.predict(X_blobs) # Provide visualization and show MI for blobs dataset axes[1].scatter(X_blobs[:, 0], X_blobs[:, 1], c=clustering.labels_, cmap='tab20b') axes[1].set_title('MI is: '+ str(round(mutual_info_score(y, predicted_blobs), 3))) X_moons, y = make_moons(n_samples=500) clustering = KMeans(n_clusters=2).fit(X_moons) predicted_moons = clustering.predict(X_moons) # Provide visualization and show MI for moons dataset axes[2].scatter(X_moons[:, 0], X_moons[:, 1], c=clustering.labels_, cmap='tab20b') axes[2].set_title('MI is: '+ str(round(mutual_info_score(y, predicted_moons), 3)))
Die Mutual Information variiert zwischen 0 und 1, wobei 0 anzeigt, dass die vorhergesagte Clusterung völlig unterschiedlich von der tatsächlichen Clusterung ist, und 1 anzeigt, dass die vorhergesagte Clusterung identisch mit der tatsächlichen Clusterung ist. Darüber hinaus können wir basierend auf den obigen Beispielen sagen, dass diese Metrik viel besser darin ist, schlechte Clusterungen zu erkennen als der Rand-Index.
Homogenität misst das Ausmaß, in dem jeder Cluster nur Datenpunkte enthält, die zu einer einzigen Klasse oder Kategorie basierend auf der bedingten Entropie gehören. Genau wie bei der Mutual Information werden wir das Prinzip der Berechnung dieser Metrik nicht betrachten.
from sklearn.metrics import homogeneity_score from sklearn.cluster import KMeans from sklearn.datasets import make_moons, make_blobs, make_circles import matplotlib.pyplot as plt 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) predicted_circles = clustering.predict(X_circles) # Provide visualization and show homogeneity for circles dataset axes[0].scatter(X_circles[:, 0], X_circles[:, 1], c=clustering.labels_, cmap='tab20b') axes[0].set_title('Homogeneity is: '+ str(round(homogeneity_score(y, predicted_circles), 3))) X_blobs, y = make_blobs(n_samples=500, centers=2) clustering = KMeans(n_clusters=2).fit(X_blobs) predicted_blobs = clustering.predict(X_blobs) # Provide visualization and show homogeneity for blobs dataset axes[1].scatter(X_blobs[:, 0], X_blobs[:, 1], c=clustering.labels_, cmap='tab20b') axes[1].set_title('Homogeneity is: '+ str(round(homogeneity_score(y, predicted_blobs), 3))) X_moons, y = make_moons(n_samples=500) clustering = KMeans(n_clusters=2).fit(X_moons) predicted_moons = clustering.predict(X_moons) # Provide visualization and show homogeneity for moons dataset axes[2].scatter(X_moons[:, 0], X_moons[:, 1], c=clustering.labels_, cmap='tab20b') axes[2].set_title('Homogeneity is: '+ str(round(homogeneity_score(y, predicted_moons), 3)))
Eine Clusterlösung wird als hoch homogen angesehen, wenn alle Datenpunkte, die zur gleichen wahren Klasse oder Kategorie gehören, in denselben Cluster gruppiert werden.
Mit anderen Worten, Homogenität misst das Ausmaß, in dem ein Clustering-Algorithmus Datenpunkte den richtigen Clustern basierend auf ihrer wahren Klasse oder Kategorie zuweist. Der Homogenitätswert reicht von 0 bis 1, wobei 1 perfekte Homogenität anzeigt.
Homogenität ist die beste aller betrachteten Metriken: Sie bestimmt sowohl gutes als auch schlechtes Clustering gleichermaßen gut, wie im obigen Beispiel gezeigt.
Danke für Ihr Feedback!