Scikit Learn - Metodi di clustering
Qui studieremo i metodi di clustering in Sklearn che aiuteranno nell'identificazione di qualsiasi somiglianza nei campioni di dati.
Metodi di clustering, uno dei metodi ML non supervisionati più utili, utilizzati per trovare modelli di somiglianza e relazione tra campioni di dati. Successivamente, raggruppano questi campioni in gruppi che hanno somiglianze in base alle caratteristiche. Il clustering determina il raggruppamento intrinseco tra i dati presenti senza etichetta, ecco perché è importante.
La libreria Scikit-learn ha sklearn.clusterper eseguire il raggruppamento di dati senza etichetta. Sotto questo modulo scikit-leran ha i seguenti metodi di clustering:
KMeans
Questo algoritmo calcola i centroidi e itera finché non trova il centroide ottimale. È necessario specificare il numero di cluster, motivo per cui si presume che siano già noti. La logica principale di questo algoritmo è raggruppare i dati che separano i campioni in un numero n di gruppi di uguali varianze riducendo al minimo i criteri noti come inerzia. Il numero di cluster identificati dall'algoritmo è rappresentato da "K.
Scikit-learn ha sklearn.cluster.KMeansmodulo per eseguire il clustering K-Means. Durante il calcolo dei centri dei cluster e del valore dell'inerzia, il parametro denominatosample_weight permette sklearn.cluster.KMeans modulo per assegnare più peso ad alcuni campioni.
Propagazione di affinità
Questo algoritmo si basa sul concetto di "passaggio di messaggi" tra diverse coppie di campioni fino alla convergenza. Non è necessario specificare il numero di cluster prima di eseguire l'algoritmo. L'algoritmo ha una complessità temporale dell'ordine (2), che è il più grande svantaggio di esso.
Scikit-learn ha sklearn.cluster.AffinityPropagation modulo per eseguire Affinity Propagation clustering.
Spostamento medio
Questo algoritmo scopre principalmente blobsin una densità uniforme di campioni. Assegna i punti dati ai cluster in modo iterativo spostando i punti verso la densità più alta di punti dati. Invece di fare affidamento su un parametro denominatobandwidth determinando la dimensione della regione in cui cercare, imposta automaticamente il numero di cluster.
Scikit-learn ha sklearn.cluster.MeanShift modulo per eseguire il clustering Mean Shift.
Clustering spettrale
Prima del clustering, questo algoritmo utilizza fondamentalmente gli autovalori, ovvero lo spettro della matrice di similarità dei dati, per eseguire la riduzione della dimensionalità in un numero inferiore di dimensioni. L'utilizzo di questo algoritmo non è consigliabile in presenza di un numero elevato di cluster.
Scikit-learn ha sklearn.cluster.SpectralClustering modulo per eseguire il clustering spettrale.
Clustering gerarchico
Questo algoritmo crea cluster nidificati unendo o dividendo i cluster in successione. Questa gerarchia di cluster è rappresentata come un dendrogramma cioè un albero. Rientra nelle seguenti due categorie:
Agglomerative hierarchical algorithms- In questo tipo di algoritmo gerarchico, ogni punto dati viene trattato come un singolo cluster. Successivamente agglomerano le coppie di cluster. Questo utilizza l'approccio dal basso verso l'alto.
Divisive hierarchical algorithms- In questo algoritmo gerarchico, tutti i punti dati vengono trattati come un unico grande cluster. In questo il processo di clustering implica la divisione, utilizzando l'approccio top-down, l'unico grande cluster in vari piccoli cluster.
Scikit-learn ha sklearn.cluster.AgglomerativeClustering modulo per eseguire clustering gerarchico agglomerativo.
DBSCAN
Sta per “Density-based spatial clustering of applications with noise”. Questo algoritmo si basa sulla nozione intuitiva di "cluster" e "rumore" secondo cui i cluster sono regioni dense di densità inferiore nello spazio dati, separate da regioni a densità inferiore di punti dati.
Scikit-learn ha sklearn.cluster.DBSCANmodulo per eseguire il clustering DBSCAN. Ci sono due parametri importanti e cioè min_samples ed eps usati da questo algoritmo per definire denso.
Valore del parametro più alto min_samples o un valore inferiore del parametro eps darà un'indicazione sulla maggiore densità di punti dati necessaria per formare un cluster.
OTTICA
Sta per “Ordering points to identify the clustering structure”. Questo algoritmo trova anche cluster basati sulla densità nei dati spaziali. La sua logica di funzionamento di base è come DBSCAN.
Affronta una delle principali debolezze dell'algoritmo DBSCAN, il problema di rilevare cluster significativi in dati di densità variabile, ordinando i punti del database in modo tale che i punti spazialmente più vicini diventino vicini nell'ordinamento.
Scikit-learn ha sklearn.cluster.OPTICS modulo per eseguire il clustering OTTICO.
BETULLA
È l'acronimo di riduzione iterativa bilanciata e raggruppamento mediante gerarchie. Viene utilizzato per eseguire il clustering gerarchico su set di dati di grandi dimensioni. Costruisce un albero denominatoCFT cioè Characteristics Feature Tree, per i dati forniti.
Il vantaggio di CFT è che i nodi di dati chiamati nodi CF (Characteristics Feature) contengono le informazioni necessarie per il clustering, il che impedisce ulteriormente la necessità di conservare in memoria tutti i dati di input.
Scikit-learn ha sklearn.cluster.Birch modulo per eseguire il clustering BETULLA.
Confronto tra algoritmi di clustering
La tabella seguente fornirà un confronto (basato su parametri, scalabilità e metrica) degli algoritmi di clustering in scikit-learn.
Suor n | Nome algoritmo | Parametri | Scalabilità | Metrica utilizzata |
---|---|---|---|---|
1 | K-Means | No. di cluster | N_samples molto grandi | La distanza tra i punti. |
2 | Propagazione di affinità | Smorzamento | Non è scalabile con n_samples | Distanza del grafico |
3 | Mean-Shift | Larghezza di banda | Non è scalabile con n_samples. | La distanza tra i punti. |
4 | Clustering spettrale | Numero di cluster | Livello medio di scalabilità con n_samples. Basso livello di scalabilità con n_clusters. | Distanza del grafico |
5 | Clustering gerarchico | Soglia di distanza o numero di cluster | Large n_samples Large n_clusters | La distanza tra i punti. |
6 | DBSCAN | Dimensioni del quartiere | N_samples molto grandi e n_clusters medi. | Distanza dal punto più vicino |
7 | OTTICA | Appartenenza minima al cluster | N_samples molto grandi e n_clusters di grandi dimensioni. | La distanza tra i punti. |
8 | BETULLA | Soglia, fattore di ramificazione | Large n_samples Large n_clusters | La distanza euclidea tra i punti. |
K-Means Clustering su Scikit-learn Digit dataset
In questo esempio, applicheremo il clustering K-means sul set di dati delle cifre. Questo algoritmo identificherà cifre simili senza utilizzare le informazioni sull'etichetta originale. L'implementazione viene eseguita sul notebook Jupyter.
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
Produzione
1797, 64)
Questo output mostra che il set di dati digit contiene 1797 campioni con 64 funzioni.
Esempio
Ora, esegui il raggruppamento K-Means come segue:
kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
Produzione
(10, 64)
Questo output mostra che il clustering K-means ha creato 10 cluster con 64 funzionalità.
Esempio
fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks = [], yticks = [])
axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)
Produzione
L'output seguente ha immagini che mostrano i centri dei cluster appresi da K-Means Clustering.
Successivamente, lo script Python di seguito abbinerà le etichette del cluster apprese (da K-Means) con le vere etichette trovate in esse -
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]
Possiamo anche verificare la precisione con l'aiuto del comando indicato di seguito.
from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)
Produzione
0.7935447968836951
Esempio di implementazione completo
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks=[], yticks = [])
axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]
from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)