L’indice di validità nel clustering

L’indice di validità nel clustering

Condividi con i tuoi amici...

Dedico questo breve articolo ad evidenziare l’importanza di impostare il corretto numero di clusters da creare in un algoritmo di clustering. Per una trattazione più estesa sul clustering puoi leggere qui.

Stabilire il numero di cluster corretto è un passaggio fondamentale nell’algoritmo di clustering perché influisce sulla qualità dei risultati ottenuti. L’indice di validità è uno strumento che può aiutare a determinare il numero ottimale di cluster da impostare.

L’indice di validità è una misura della coerenza e della separabilità dei cluster all’interno dei dati. Esistono diversi tipi di indici di validità, ognuno dei quali utilizza diverse metriche per calcolare la qualità dei cluster. Alcuni esempi di indici di validità sono l’indice di Silhouette, l’indice CH (Calinski-Harabasz) e l’indice DB (Davies-Bouldin).

L’indice di Silhouette calcola la distanza media tra un punto e tutti gli altri punti all’interno del suo stesso cluster, e la distanza media tra il punto e tutti i punti situati in cluster diversi. Un valore di Silhouette vicino a 1 indica una buona separabilità dei cluster, mentre un valore vicino a -1 indica una cattiva separabilità.

L’indice CH calcola la somma dei rapporti tra la dispersione media all’interno dei cluster e tra i cluster, estraendo un punteggio che rappresenta la separabilità dei cluster. Un valore più alto indica una migliore separabilità dei cluster.

L’indice DB calcola la distanza media tra i centri dei cluster e misura quanto i cluster siano compatti e separati. Un valore più basso indica una migliore separazione dei cluster e una migliore coerenza all’interno di essi.

È importante utilizzare l’indice di validità per determinare il numero di cluster migliore perché permette di valutare oggettivamente la bontà della suddivisione dei dati in cluster. Senza un criterio obiettivo, sarebbe difficile determinare il numero di cluster in modo accurato.

Un esempio con python

Si consideri un dataset privato intenzionalmente dell’attributo target in quanto non intendiamo impiegare un algoritmo per l’apprendimento supervisionato ma un algoritmo di clustering che ha come obiettivo la generazione di clusters a partire dalle caratteristiche degli elementi componenti il dataset senza alcuna etichettatura. Questa sarà la struttura:

La classe KMeans del modulo sklearn prevede l’impostazione del numero di clusters prima di avviare l’apprendimento automatico.

Come possiamo stabilire il miglior valore?

Eseguiamo un codice che compie un ciclo generando i valori dell’indice di validità Silhouette per ogni scelta del numero di cluster entro un certo intervallo di valori.

Ecco il codice:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# Carica i dati da un file csv
data = pd.read_csv('dati.csv')

# Estrai le caratteristiche dal dataframe dei dati escludendo l'ultima colonna
X = data.iloc[:, :-1].values

# Crea una lista per i valori dell'indice di validità interna
scores = []

# Prova diversi valori per il numero di cluster (da 2 a 10)
for n_clusters in range(2, 11):
    # Esegui il clustering utilizzando l'algoritmo K-Means
    kmeans = KMeans(n_clusters=n_clusters)
    labels = kmeans.fit_predict(X) #array di dimensionalità pari al numero di righe. Ogni elemento è l'etichetta o cluster a cui appartiene un dato elemento riga
    
    # Calcola l'indice di siluette per valutare la coesione interna dei cluster
    silhouette_avg = silhouette_score(X, labels)
    
    # Aggiungi il valore dell'indice di siluette alla lista dei punteggi
    scores.append(silhouette_avg)

# Stampa i punteggi dell'indice di validità interna per ogni scelta del numero di cluster
for n_clusters, score in enumerate(scores, start=2):
    print(f'Numero di cluster: {n_clusters}, Indice di validità interna: {score}')

OUTPUT

Numero di cluster: 2, Indice di validità interna: 0.3894111733870929
Numero di cluster: 3, Indice di validità interna: 0.2877647413673084
Numero di cluster: 4, Indice di validità interna: 0.28060645631083486
Numero di cluster: 5, Indice di validità interna: 0.2772218203493813
Numero di cluster: 6, Indice di validità interna: 0.26659608417967445
Numero di cluster: 7, Indice di validità interna: 0.27052060130229827
Numero di cluster: 8, Indice di validità interna: 0.26213665484065896
Numero di cluster: 9, Indice di validità interna: 0.23053827184955722
Numero di cluster: 10, Indice di validità interna: 0.24464180044083217

La scelta migliore con l’indice di validità più alto corrisponde a Numero di cluster: 2

A questo punto sarà possibile far ri-eseguire l’addestramento con questo specifico valore

#CLUSTER=2
kmeans = KMeans(n_clusters=2)
labels = kmeans.fit_predict(X)