Scikit Learn: métodos de agrupación

Aquí, estudiaremos sobre los métodos de agrupamiento en Sklearn que ayudarán a identificar cualquier similitud en las muestras de datos.

Los métodos de agrupamiento, uno de los métodos de AA sin supervisión más útiles, se utilizan para encontrar patrones de similitud y relación entre muestras de datos. Después de eso, agrupan esas muestras en grupos que tienen similitudes según las características. El agrupamiento determina el agrupamiento intrínseco entre los datos actuales sin etiquetar, por eso es importante.

La biblioteca Scikit-learn tiene sklearn.clusterpara realizar la agrupación de datos sin etiquetar. Bajo este módulo, scikit-leran tiene los siguientes métodos de agrupamiento:

KMeans

Este algoritmo calcula los centroides e itera hasta encontrar el centroide óptimo. Requiere que se especifique el número de clústeres, por eso se supone que ya se conocen. La lógica principal de este algoritmo es agrupar los datos que separan las muestras en n números de grupos de varianzas iguales minimizando los criterios conocidos como inercia. El número de conglomerados identificados por el algoritmo está representado por 'K.

Scikit-learn tiene sklearn.cluster.KMeansmódulo para realizar agrupaciones de K-Means. Al calcular los centros de clústeres y el valor de la inercia, el parámetro denominadosample_weight permite sklearn.cluster.KMeans módulo para asignar más peso a algunas muestras.

Propagación de afinidad

Este algoritmo se basa en el concepto de "paso de mensajes" entre diferentes pares de muestras hasta la convergencia. No requiere que se especifique el número de clústeres antes de ejecutar el algoritmo. El algoritmo tiene una complejidad de tiempo del orden (2), que es su mayor desventaja.

Scikit-learn tiene sklearn.cluster.AffinityPropagation módulo para realizar agrupaciones de propagación de afinidad.

Cambio medio

Este algoritmo descubre principalmente blobsen una densidad uniforme de muestras. Asigna los puntos de datos a los clústeres de forma iterativa cambiando los puntos hacia la mayor densidad de puntos de datos. En lugar de depender de un parámetro llamadobandwidth dictando el tamaño de la región a través de la cual buscar, establece automáticamente el número de clústeres.

Scikit-learn tiene sklearn.cluster.MeanShift módulo para realizar la agrupación en clústeres Mean Shift.

Agrupación espectral

Antes de la agrupación, este algoritmo básicamente utiliza los valores propios, es decir, el espectro de la matriz de similitud de los datos para realizar la reducción de dimensionalidad en menos dimensiones. El uso de este algoritmo no es recomendable cuando hay un gran número de clústeres.

Scikit-learn tiene sklearn.cluster.SpectralClustering módulo para realizar la agrupación espectral.

Agrupación jerárquica

Este algoritmo crea clústeres anidados fusionando o dividiendo los clústeres sucesivamente. Esta jerarquía de grupos se representa como dendrograma, es decir, árbol. Se divide en las siguientes dos categorías:

Agglomerative hierarchical algorithms- En este tipo de algoritmo jerárquico, cada punto de datos se trata como un solo grupo. A continuación, aglomera sucesivamente los pares de grupos. Esto utiliza el enfoque de abajo hacia arriba.

Divisive hierarchical algorithms- En este algoritmo jerárquico, todos los puntos de datos se tratan como un gran grupo. En esto, el proceso de agrupamiento implica dividir, utilizando un enfoque de arriba hacia abajo, el gran grupo en varios grupos pequeños.

Scikit-learn tiene sklearn.cluster.AgglomerativeClustering módulo para realizar agrupaciones jerárquicas aglomerativas.

DBSCAN

Lo que representa “Density-based spatial clustering of applications with noise”. Este algoritmo se basa en la noción intuitiva de "agrupaciones" y "ruido" de que las agrupaciones son regiones densas de menor densidad en el espacio de datos, separadas por regiones de menor densidad de puntos de datos.

Scikit-learn tiene sklearn.cluster.DBSCANmódulo para realizar clustering DBSCAN. Hay dos parámetros importantes, a saber, min_samples y eps utilizados por este algoritmo para definir denso.

Mayor valor del parámetro min_samples o un valor más bajo del parámetro eps dará una indicación acerca de la mayor densidad de puntos de datos que es necesaria para formar un grupo.

ÓPTICA

Lo que representa “Ordering points to identify the clustering structure”. Este algoritmo también encuentra clústeres basados ​​en densidad en datos espaciales. Su lógica de trabajo básica es como DBSCAN.

Aborda una de las principales debilidades del algoritmo DBSCAN, el problema de detectar agrupaciones significativas en datos de densidad variable, ordenando los puntos de la base de datos de tal manera que los puntos espacialmente más cercanos se conviertan en vecinos en el orden.

Scikit-learn tiene sklearn.cluster.OPTICS módulo para realizar clustering OPTICS.

ABEDUL

Significa reducción iterativa equilibrada y agrupamiento mediante jerarquías. Se utiliza para realizar agrupaciones jerárquicas en grandes conjuntos de datos. Construye un árbol llamadoCFT es decir Characteristics Feature Tree, para los datos proporcionados.

La ventaja de CFT es que los nodos de datos llamados nodos CF (Característica de características) contienen la información necesaria para la agrupación, lo que evita aún más la necesidad de almacenar todos los datos de entrada en la memoria.

Scikit-learn tiene sklearn.cluster.Birch módulo para realizar la agrupación en clústeres BIRCH.

Comparación de algoritmos de agrupación en clústeres

La siguiente tabla ofrecerá una comparación (basada en parámetros, escalabilidad y métrica) de los algoritmos de agrupación en clústeres en scikit-learn.

No Señor Nombre del algoritmo Parámetros Escalabilidad Métrica utilizada
1 K-medias No. de racimos N_muestras muy grandes La distancia entre puntos.
2 Propagación de afinidad Mojadura No es escalable con n_samples Distancia del gráfico
3 Cambio medio Banda ancha No es escalable con n_samples. La distancia entre puntos.
4 Agrupación espectral No de racimos Nivel medio de escalabilidad con n_samples. Pequeño nivel de escalabilidad con n_clusters. Distancia del gráfico
5 Agrupación jerárquica Umbral de distancia o número de grupos Grandes n_muestras Grandes n_clusters La distancia entre puntos.
6 DBSCAN Tamaño del barrio N_samples muy grandes y n_clusters medianos. Distancia del punto más cercano
7 ÓPTICA Membresía mínima del clúster N_samples muy grandes y n_clusters grandes. La distancia entre puntos.
8 ABEDUL Umbral, factor de ramificación Grandes n_muestras Grandes n_clusters La distancia euclidiana entre puntos.

Agrupación de K-Means en el conjunto de datos de dígitos de Scikit-learn

En este ejemplo, aplicaremos la agrupación de K-medias en el conjunto de datos de dígitos. Este algoritmo identificará dígitos similares sin utilizar la información de la etiqueta original. La implementación se realiza en el cuaderno 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

Salida

1797, 64)

Esta salida muestra que el conjunto de datos de dígitos tiene 1797 muestras con 64 características.

Ejemplo

Ahora, realice el agrupamiento de K-medias de la siguiente manera:

kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape

Salida

(10, 64)

Este resultado muestra que la agrupación en clústeres de K-means creó 10 clústeres con 64 funciones.

Ejemplo

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)

Salida

La siguiente salida tiene imágenes que muestran los centros de clústeres aprendidos por K-Means Clustering.

A continuación, la secuencia de comandos de Python a continuación hará coincidir las etiquetas de clúster aprendidas (por K-Means) con las etiquetas verdaderas que se encuentran en ellas:

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]

También podemos verificar la precisión con la ayuda del comando mencionado a continuación.

from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)

Salida

0.7935447968836951

Ejemplo de implementación 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)