course
După ce ai antrenat un model de clustering, cum îți dai seama dacă grupările sunt bune?
Nu există un răspuns universal. În învățarea supervizată clasică, poți compara predicțiile cu etichetele reale și obții un număr de acuratețe. Nu poți face asta cu clusteringul. Ai ales k=5, dar ar fi o altă valoare a lui k mai bună? Fără etichete, nu poți spune dacă algoritmul a găsit structura sau doar a împărțit datele în bucăți aleatorii.
Scorul silhouette este metrica pe care o cauți. Îți arată cât de bine se potrivește fiecare punct în clusterul alocat în raport cu cel mai apropiat cluster vecin, și este una dintre cele mai utilizate metrici. Funcționează fără etichete și este ușor de interpretat.
În acest articol, te voi ghida prin formulă și cum să o citești, îți voi arăta un exemplu în Python cu scikit-learn și voi acoperi scenarii când este și când nu este o soluție ideală.
Ești nou în clustering? Citește tutorialul nostru Introducere în k-Means Clustering cu scikit-learn pentru a învăța cum funcționează algoritmul și cum să-l folosești în Python.
Ce este scorul Silhouette?
Scorul silhouette este un număr între -1 și 1 care îți spune cât de bine se potrivește fiecare punct în clusterul său.
Numărul îți arată două lucruri:
- Cât de aproape este un punct de celelalte puncte din propriul cluster
- Cât de departe este de cel mai apropiat cluster din care nu face parte
Dacă punctul este bine în interiorul propriului grup și departe de oricare altul, scorul este mare. Dacă este la margine, mai aproape de un cluster vecin decât de propriul cluster, scorul este mic.
Pe scurt, acesta este echilibrul pe care ți-l arată scorul silhouette. Include atât cât de strâns sunt grupate punctele în fiecare cluster, cât și cât de bine sunt separate clusterele între ele. Ambele sunt la fel de importante. Un clustering care grupează bine punctele, dar plasează clusterele unele peste altele nu e util, la fel cum nici un clustering care separă bine clusterele, dar împrăștie punctele în interiorul lor, nu este.

Clustere bine separate comparativ cu clustere suprapuse
Scoruri mai mari înseamnă clustere mai bine definite. Un scor aproape de 1 înseamnă că punctele sunt strâns poziționate în interiorul clusterului lor și departe de altele. Un scor aproape de 0 înseamnă că clusterele se suprapun sau granițele sunt ambigue. Un scor negativ înseamnă că punctul e mai aproape de un alt cluster decât de cel căruia i-a fost atribuit.
Cum funcționează scorul Silhouette?
Fiecare punct primește propriul scor silhouette, iar acest scor provine din două distanțe.
Prima este cât de departe este punctul, în medie, de celelalte puncte din clusterul atribuit. Dacă este mică, punctul e aproape de celelalte din cluster. Dacă este mare, punctul este slab legat de clusterul său.
A doua este cât de departe este punctul, în medie, de punctele din cel mai apropiat cluster vecin. Dacă este mare, punctul e clar separat de alte clustere. Dacă este mică, punctul e aproape de frontieră.

Distanța unui punct față de clustere
Valoarea silhouette compară aceste două numere. Un punct bine în interiorul clusterului și departe de oricare altul primește un scor mare. Un punct la margine (aproape de un alt cluster) primește un scor mic. Un punct mai aproape de un alt cluster decât de al său primește un scor negativ.
Un lucru de reținut este că niciuna dintre distanțe, luată singură, nu este suficientă.
Un cluster strâns poate fi poziționat chiar lângă altul. Un cluster bine separat poate fi împrăștiat intern. Ai nevoie de ambele distanțe pentru a avea încredere în atribuire.
Formula scorului Silhouette
Iată formula pentru un singur punct:

Formula scorului silhouette
Unde:
-
aeste distanța medie de la punct la toate celelalte puncte din același cluster -
beste distanța medie de la punct la toate punctele din cel mai apropiat cluster vecin
Formula împarte diferența dintre b și a la care dintre cele două este mai mare.
În general, poți folosi aceste repere pentru a interpreta scorul:
-
Când
beste mult mai mare decâta: Punctul este departe de orice alt cluster și aproape de al său. Numărătorul este aproape deb, numitorul este totb, iar scorul este aproape de 1 -
Când
aeste mult mai mare decâtb: Punctul este mai aproape de un alt cluster decât de al său. Numărătorul este un număr negativ mare, aproape de-a, numitorul estea, iar scorul este aproape de -1 -
Când
așibsunt aproximativ egale: Punctul este la granița dintre două clustere. Numărătorul este aproape de 0, la fel și scorul
Mai multe detalii în continuare.
Cum interpretezi scorul Silhouette
Iată un ghid aproximativ pentru citirea scorului silhouette:
- Aproape de 1: Punctele sunt bine în interiorul clusterelor lor și departe de oricare altele
- În jur de 0,7: Clustering bun, grupurile sunt distincte și punctele sunt aproape de celelalte puncte din clusterul lor
- În jur de 0,5: Clustering rezonabil, există ceva suprapunere între clustere, dar sunt încă deosebibile
- Aproape de 0: Clusterele se suprapun sau granițele sunt neclare. S-ar putea ca structura să nu fie reală
- Sub 0: Punctele sunt mai aproape de clusterul greșit. Se poate întâmpla când alegi un număr nepotrivit de clustere sau când datele nu se grupează bine din start.
Pragurile de mai sus sunt doar orientative. Ce înseamnă un scor silhouette bun depinde de setul de date.
Datele rare și cu dimensionalitate mare produc adesea scoruri mai mici chiar și când clusterele sunt bune. Datele dense, bine separate pot produce scoruri peste 0,7. Ar trebui să compari scorurile între modele pe același set de date, nu față de un prag universal.
Cum calculezi scorul Silhouette
Calculezi scorul silhouette punct cu punct. Iată cum funcționează pentru un singur punct.
Pasul 1: Calculează a, distanța medie de la punct la fiecare alt punct din propriul cluster. Dacă punctul este într-un cluster cu alte 4 puncte, iar distanțele către acele puncte sunt 1,2, 1,5, 1,0 și 1,3:

Calculul scorului silhouette (1)
Pasul 2: Găsește cel mai apropiat cluster vecin (acela, altul decât cel al punctului, cu cea mai mică distanță medie față de punct). Apoi calculează b, distanța medie de la punct la fiecare punct din acel cluster. Dacă cel mai apropiat cluster are 5 puncte la distanțe 2,4, 2,8, 3,0, 2,6 și 2,7:

Calculul scorului silhouette (2)
Pasul 3: Introdu a și b în formulă:

Calculul scorului silhouette (3)
Pasul 4: Repetă pentru fiecare punct din setul de date. Scorul silhouette total pentru clustering este media tuturor scorurilor pe punct.
Exemplu de scor Silhouette în Python
Scikit-learn îți oferă două funcții pentru a calcula scorul silhouette, ambele în sklearn.metrics:
-
silhouette_score()returnează scorul mediu pentru întregul clustering -
silhouette_samples()returnează scorul pentru fiecare punct în parte
Iată cum le folosești cu KMeans pe un set de date sintetic:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples
# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")
# Per-point silhouette values
sample_scores = silhouette_samples(X, labels)
print(f"First 5 point scores: {sample_scores[:5]}")
Vei obține acest output când rulezi fragmentul de cod de mai sus:

Output exemplu Python
Scorul general de 0,791 înseamnă că cele patru clustere sunt bine definite și separate.
Scorurile pe punct îți permit să analizezi fiecare punct de date.
Punctele cu scoruri individuale mari sunt bine în interiorul clusterelor lor. Punctele cu scoruri mici sau negative sunt la graniță sau atribuite greșit, ceea ce e util pentru a depista outlieri sau pentru a revizui punctele de la limită.
Alegerea numărului optim de clustere
Una dintre cele mai comune utilizări ale scorului silhouette este alegerea lui k potrivit pentru KMeans.
Asta include trei pași:
- Potrivește KMeans pentru o plajă de valori k
- Calculează scorul silhouette pentru fiecare potrivire
- Alege valoarea de
kcu cel mai mare scor
Iată codul pentru asta:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
k_values = range(2, 11)
scores = []
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
scores.append(silhouette_score(X, labels))
print(f"k={k}: silhouette = {scores[-1]:.3f}")
Acesta este scorul pe care îl vei vedea pentru fiecare k:

Scorul silhouette pentru diferite valori ale lui k
Cel mai mare scor este la k=4. Aceasta este valoarea pe care ai vrea să o alegi.
Un lucru de ținut minte este că scorul silhouette nu înlocuiește cunoștințele de domeniu. Dacă problema ta de business cere 5 segmente de clienți, iar silhouette este cel mai mare la 4, nu alege automat 4. Metrica îți arată unde au datele cea mai curată structură, dar uneori numărul potrivit de clustere este cel care corespunde cu ceva semnificativ în problema ta.
Scorul Silhouette vs. alte metrici de clustering
Scorul silhouette este probabil cea mai comună metrică pentru a evalua clusteringul, dar nu este singura. Iată cum se compară cu alternativele.
Scorul silhouette vs. metoda cotului
Metoda cotului este o tehnică vizuală pentru alegerea lui k în KMeans. Potrivești modele pentru o plajă de valori k, plotezi inerția (suma pătratelor intra-cluster) în funcție de k și alegi valoarea unde curba are o cotitură pronunțată.
Metoda cotului are avantajul că este rapidă și ușor de rulat. Dar „cotul” nu este întotdeauna evident. Pe date dezordonate, curba poate părea lină și nu poți spune unde se frânge.
Scorul silhouette îți dă un număr efectiv pentru fiecare k, astfel încât poți face o comparație mai semnificativă. Este mai lent de calculat, dar nu lasă decizia la interpretare vizuală.
Folosește metoda cotului pentru o verificare rapidă. Folosește scorul silhouette când ai nevoie de un răspuns pe care te poți baza.
Scorul silhouette vs. indicele Davies-Bouldin
Indicele Davies-Bouldin (DBI) măsoară similaritatea medie dintre fiecare cluster și cel mai similar lui. Un DBI mai mic înseamnă clustering mai bun, iar scorul perfect este 0.
DBI folosește centroizi de cluster pentru a calcula similaritatea, ceea ce îl face mai rapid de calculat decât scorul silhouette pe seturi de date mari. Folosește o intuiție similară în a recompensa clusterele strânse și bine separate.
Partea mai puțin convenabilă este că DBI îți spune doar despre clusteringul ca întreg. Scorul silhouette îți dă și un scor pe punct, astfel încât poți găsi puncte de graniță și outlieri.
Folosește DBI dacă lucrezi cu seturi mari de date și contează viteza. Folosește scorul silhouette când vrei să te uiți la puncte individuale.
Scorul silhouette vs. indicele Calinski-Harabasz
Indicele Calinski-Harabasz (CH), numit și criteriul raportului de variație, este raportul dintre dispersia între clustere și dispersia intra-cluster. Scoruri mai mari înseamnă clustering mai bun, iar scorul nu are limită superioară.
CH este rapid și funcționează bine pe seturi mari de date deoarece implică doar statistici la nivel de cluster. Ca și silhouette și DBI, funcționează cel mai bine pe clustere convexe, bine separate.
CH nu are nici o scară naturală, deci poți compara scoruri CH doar între modele pe același set de date, nu între seturi de date diferite.
Folosește CH când setul tău de date este mare și ai nevoie de rezultate rapide. Folosește scorul silhouette când vrei interpretabilitate și informații la nivel de punct.
Metrici interne vs. externe pentru clustering
Metricile de mai sus (silhouette, DBI, CH, cot) sunt toate metrici interne. Ele evaluează clusteringul folosind doar datele în sine, fără etichete „adevăr de teren”. Asta le face alegerea standard pentru problemele reale de clustering, unde etichetele nu există.
Metricile externe compară atribuiri de clustere cu etichete cunoscute. Adjusted Rand Index (ARI), Normalized Mutual Information (NMI) și omogenitatea sunt exemple comune. Sunt folosite când ai etichete și vrei să testezi cât de bine le recuperează un algoritm de clustering.
Folosește metrici interne când nu ai etichete, ceea ce e cazul tipic. Folosește metrici externe când faci benchmark pentru algoritmi de clustering pe date etichetate.
Iată un rezumat al metricilor alăturate:
| Metodă | Interval | Valoare optimă | Viteză | Folosește pentru |
|---|---|---|---|---|
| Scorul silhouette | -1 la 1 | Aproape de 1 | Lent pe seturi mari de date | Interpretabilitate și informații pe punct |
| Metoda cotului | 0 la infinit | Caută „cotul” | Rapid | Verificări rapide |
| Indicele Davies-Bouldin | 0 la infinit | Aproape de 0 | Rapid | Seturi mari de date |
| Indicele Calinski-Harabasz | 0 la infinit | Mai mare e mai bine | Rapid | Seturi mari, fără etichete |
Scorul silhouette comparat cu alternativele
Limitările scorului Silhouette
Scorul silhouette are câteva limitări de care merită să știi:
- Presupune clustering bazat pe distanță: Scorul silhouette se bazează implicit pe distanța euclidiană. Funcționează bine pentru KMeans și alte algoritmi bazați pe centroizi, dar nu se potrivește cu metodele bazate pe densitate precum DBSCAN, unde clusterele au forme arbitrare și nu au un centroid clar
- Funcționează cel mai bine cu clustere mici, bine separate: Metrica recompensează clusterele strânse, sferice, care sunt departe unele de altele. Dacă datele tale au clustere apropiate sau suprapuse, scorul va fi mic chiar dacă clusteringul este corect
- Nu e cea mai bună pentru forme neregulate ale clusterelor: Clusterele din lumea reală nu sunt mereu convexe. Dacă nu este cazul pentru datele tale, clusterele primesc scoruri silhouette mici chiar și când atribuirile sunt corecte
- Cost computațional pe seturi mari de date: Calcularea scorului silhouette necesită distanțe perechi între puncte, care scalează ca
O(n^2). Pe seturi cu milioane de puncte, devine costisitor - Sensibilitate la metrica de distanță aleasă: Scorul se schimbă în funcție de faptul că folosești distanța euclidiană, Manhattan, cosinus sau alta. Dacă datele tale nu respectă presupunerile euclidiene, scorul silhouette te poate induce în eroare
Bune practici pentru folosirea scorului Silhouette
Scorul silhouette funcționează cel mai bine când urmezi câteva practici de bază:
- Compară mai multe soluții de clustering: Nu calcula doar un singur scor silhouette. Ar trebui să potrivești modele de clustering cu diferite valori ale lui
k(sau algoritmi diferiți) și să le compari scorurile alăturat - Vizualizează clusterele alături de scor: Un număr singur nu spune toată povestea. Plotează clusterele și vezi dacă formele au sens
- Nu optimiza doar pentru cel mai mare scor: Un clustering cu k=2 are adesea un scor mai mare decât
k=5chiar și când 5 clustere sunt semnificative în problema ta - Combină cu cunoștințele de domeniu: Scorul îți arată unde au datele cea mai curată structură. Cunoștințele de domeniu îți spun ce structură este de fapt utilă. Folosește-le pe ambele
- Evaluează mai multe metrici de clustering: Silhouette, DBI, CH și alte metrici măsoară calitatea clusteringului diferit. Când sunt de acord, ești pe drumul cel bun, dar când nu, uită-te la date
Concluzie
Scorul silhouette este una dintre cele mai intuitive modalități de a evalua clusteringul pentru că arată atât cât de strâns sunt grupate punctele, cât și cât de bine sunt separate clusterele.
Îl calculezi punct cu punct, faci media rezultatelor și obții un singur număr între -1 și 1. Scorurile mai aproape de 1 înseamnă clustere mai bine definite, iar scorurile aproape de sau sub 0 înseamnă că structura nu este cu adevărat o structură
Dar scorul silhouette este doar un început. Ar trebui să îl asociezi cu vizualizări ale clusterelor și, cel mai important, cu propriile tale cunoștințe de domeniu. Doar când toate acestea indică aceeași direcție poți avea încredere în rezultat.
Scorul silhouette face parte din imaginea mai amplă a Învățării nesupravegheate în Python. Înscrie-te azi și învață cum să grupezi, transformi, vizualizezi și să extragi informații din date neetichetate.