‌‌Hay tres enfoques diferentes para aprendizaje automático, según los datos que tengas. Puedes optar por el aprendizaje supervisado, el aprendizaje semi-supervisado o el aprendizaje no supervisado.

En el aprendizaje supervisado, tienes datos etiquetados, por lo que tienes salidas para las que sabes con certeza cuáles son los valores correctos para sus entradas. Es como saber los precios de los automóviles en función de características como marca, modelo, estilo, transmisión y otros atributos.

Con el aprendizaje semi-supervisado, tienes un gran conjunto de datos donde algunos de los datos están etiquetados pero la mayoría no.

Esto cubre una gran cantidad de datos del mundo real porque puede resultar costoso conseguir que un experto etiquete cada uno de los datos. Puedes solucionar este problema utilizando una combinación de aprendizaje supervisado y no supervisado.

El aprendizaje no supervisado significa que tienes un conjunto de datos sin ninguna etiqueta. No sabes si hay patrones ocultos en los datos, así que dejas que el algoritmo encuentre todo lo que pueda.

Ahí es donde entran en juego los algoritmos de agrupamiento. Es uno de los métodos que puedes utilizar en un problema de aprendizaje no supervisado.

¿Qué son los algoritmos de agrupamiento?

El agrupamiento es una tarea de aprendizaje automático no supervisada. Es posible que también lo hayas escuchado como análisis de agrupación debido a la forma en que funciona este método.

El uso de un algoritmo de agrupamiento significa que le darás al algoritmo una gran cantidad de datos de entrada sin etiquetas y te permitirá encontrar cualquier agrupación en los datos que se pueda.

Esas agrupaciones se denominan agrupaciones. Una agrupación es un grupo de datos que son similares entre sí en función de su relación con los datos circundantes. El agrupamiento se utiliza para cosas tales como la ingeniería de características o el descubrimiento de patrones.

Cuando empiezas con datos de los que no sabes nada, el agrupamiento puede ser un buen punto de partida para obtener información.

Tipos de algoritmos de agrupamiento

Existen diferentes tipos de algoritmos de agrupamiento que manejan todo tipo de datos únicos.

Basado en densidad

En el agrupamiento basado en densidad, los datos se agrupan por áreas de altas concentraciones de puntos de datos rodeadas por áreas de bajas concentraciones de puntos de datos. Básicamente, el algoritmo encuentra los lugares que son densos en puntos de datos y los llama grupos.

Lo bueno de esto es que los grupos pueden tener cualquier forma. No estás limitado a condiciones esperadas.

Los algoritmos de agrupamiento de este tipo no tienen en cuenta los valores atípicos en los grupos, por lo que se ignoran.

Basado en la distribución

Con un enfoque de agrupamiento basado en la distribución, se considera que todos los puntos de datos forman parte de un grupo según la probabilidad de que un punto pertenezca a un grupo determinado.‌‌

Funciona así: hay un punto central y, a medida que aumenta la distancia de un punto de datos desde el centro, la probabilidad de que forme parte de ese grupo disminuye.

‌‌Si no estás seguro de cuál podría ser la distribución de tus datos, deberías considerar un tipo diferente de algoritmo.

Basado en Centroides

El agrupamiento basado en centroides es la que probablemente has escuchado más. Es algo sensible a los parámetros iniciales que le das, pero es rápida y eficiente.

Estos tipos de algoritmos separan puntos de datos en función de múltiples centroides en los datos. Cada punto de datos se asigna a un grupo en función de su distancia al cuadrado del centroide. Este es el tipo de agrupación más utilizado.

Basado en Jerarquías

El agrupamiento basado en jerarquías se utiliza normalmente en datos jerárquicos, como los que obtendrías de la base de datos de una empresa o de taxonomías. Construye un árbol de grupos para que todo esté organizado de arriba hacia abajo.

Esto es más restrictivo que los otros tipos de agrupamiento, pero es perfecto para tipos específicos de conjuntos de datos.

Cuando usar agrupamiento

Cuando tienes un conjunto de datos sin etiquetar, es muy probable que utilices algún tipo de algoritmo de aprendizaje sin supervisión.

Hay muchas técnicas diferentes de aprendizaje no supervisado, como redes neuronales, aprendizaje por refuerzo y agrupamiento. El tipo específico de algoritmo que quieres utilizar dependerá de cómo se vean tus datos.

Es posible que quieras utilizar agrupamiento cuando intentas detectar anomalías para encontrar valores atípicos en tus datos. El agrupamiento ayuda a encontrar esos grupos y muestra los límites que determinarían si un punto de datos es un valor atípico o no.

Si no estás seguro de qué características usar para tu modelo de aprendizaje automático, el agrupamiento descubre patrones que puedes usar para descubrir qué se destaca en los datos.

El agrupamiento es especialmente útil para explorar datos de los que no sabes nada. Puede llevar algún tiempo averiguar qué tipo de algoritmo de agrupamiento funciona mejor, pero cuando lo hagas, obtendrás información invaluable sobre tus datos. Es posible que encuentres conexiones en las que nunca hubieras pensado.

Algunas aplicaciones del mundo real del agrupamiento incluyen la detección de fraudes en seguros, la categorización de libros en una biblioteca y la segmentación de clientes en mercadeo. También se puede utilizar en problemas más grandes, como análisis de terremotos o planificación urbana.

Los Ocho Mejores Algoritmos de Agrupamiento

Ahora que tienes algunos antecedentes sobre cómo funcionan los algoritmos de agrupamiento y los diferentes tipos disponibles, podemos hablar sobre los algoritmos que verás comúnmente en la práctica.

Implementaremos estos algoritmos en un conjunto de datos de ejemplo de la biblioteca sklearn en Python.

Usaremos el conjunto de datos make_classification de la biblioteca sklearn para demostrar cómo los diferentes algoritmos de agrupamiento no son adecuados para todos los problemas de agrupamiento.

Puedes encontrar el código para todos los siguientes ejemplos aquí.

Algoritmo de agrupamiento K-means

El agrupamiento de K-means es el algoritmo de agrupamiento más utilizado. Es un algoritmo basado en centroides y es el algoritmo de aprendizaje no supervisado más simple.

Este algoritmo intenta minimizar la varianza de los puntos de datos dentro de un grupo. También es la forma en que la mayoría de las personas se familiarizan con el aprendizaje automático sin supervisión.

K-means se usa mejor en conjuntos de datos más pequeños porque itera sobre todos los puntos de datos. Eso significa que tomará más tiempo clasificar los puntos de datos si hay una gran cantidad de ellos en el conjunto de datos.

Dado que así es como k-means agrupa los puntos de datos, no se escala bien.

Implementación:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import KMeans

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
kmeans_model = KMeans(n_clusters=2)

# Entrenar el modelo
kmeans_model.fit(training_data)

# asignar cada punto de datos a un grupo
kmeans_result = kmeans_model.predict(training_data)

# obtener todos los grupos únicos
kmeans_clusters = unique(kmeans_result)

# graficar los grupos KMeans
for kmeans_cluster in kmeans_clusters:
    # get data points that fall in this cluster
    index = where(kmeans_result == kmeans_cluster)
    # make the plot
    pyplot.scatter(training_data[index, 0], training_data[index, 1])
    print(index)

# mostrar el gráfico K-means
pyplot.show()

Algoritmo de agrupamiento DBSCAN

DBSCAN significa agrupamiento espacial basado en densidad de aplicaciones con ruido. Es un algoritmo de agrupamiento basado en densidad, a diferencia de k-means.

Este es un buen algoritmo para encontrar esquemas en un conjunto de datos. Encuentra grupos de forma arbitraria en función de la densidad de puntos de datos en diferentes regiones. Separa las regiones por áreas de baja densidad para poder detectar valores atípicos entre los grupos de alta densidad.

Este algoritmo es mejor que el k-means cuando se trata de trabajar con datos que tienen formas extrañas.

DBSCAN utiliza dos parámetros para determinar cómo se definen los grupos: minPts (el número mínimo de puntos de datos que deben agruparse para que un área se considere de alta densidad) y eps (la distancia utilizada para determinar si un punto de datos está en la misma área que otros puntos de datos).

La elección de los parámetros iniciales adecuados es fundamental para que este algoritmo funcione.

Implementación:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import DBSCAN

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
dbscan_model = DBSCAN(eps=0.25, min_samples=9)

# entrenar el modelo
dbscan_model.fit(training_data)

# asignar cada punto de datos a un grupo
dbscan_result = dbscan_model.fit_predict(training_data)

# obtener todos los grupos únicos
dbscan_clusters = unique(dbscan_result)

# graficar el DBSCAN de grupos
for dbscan_cluster in dbscan_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(dbscan_result == dbscan_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico DBSCAN
pyplot.show()

Algoritmo de Mezcla Gaussiana

Uno de los problemas con k-means es que los datos deben seguir un formato circular. La forma en que k-means calcula la distancia entre puntos de datos tiene que ver con una ruta circular, por lo que los datos no circulares no se agrupan correctamente.

Este es un problema que corrigen los modelos de mezcla Gaussianos. No necesitas datos con forma circular para que funcione bien.

El modelo de mezcla Gaussiana utiliza múltiples distribuciones Gaussianas para ajustar datos que tienen formas arbitrarias.

Hay varios modelos Gaussianos únicos que actúan como capas ocultas en este modelo híbrido. Entonces, el modelo calcula la probabilidad de que un punto de datos pertenezca a una distribución Gaussiana específica y ese es el grupo en el que se ubicará.

Implementación:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.mixture import GaussianMixture

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
gaussian_model = GaussianMixture(n_components=2)

# entrenar el modelo
gaussian_model.fit(training_data)

# asignar cada punto de datos a un grupo
gaussian_result = gaussian_model.predict(training_data)

# obtener todos los grupos únicos
gaussian_clusters = unique(gaussian_result)

# graficar los grupos de Mezcla Gaussiana
for gaussian_cluster in gaussian_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(gaussian_result == gaussian_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico de Mezcla Gaussiana
pyplot.show()

Algoritmo BIRCH

El algoritmo de Equilibrio Iterativo de Reducción y Agrupación mediante Jerarquías o Balance Iterative Reducing and Clustering using Hierarchies (BIRCH) por sus siglas en inglés, funciona mejor en  grandes conjuntos de datos que el algoritmo k-means.

Divide los datos en pequeños resúmenes que se agrupan en lugar de los puntos de datos originales. Los resúmenes contienen tanta información sobre la distribución de los puntos de datos como sea posible.

Este algoritmo se usa comúnmente con otros algoritmos de agrupamiento porque las otras técnicas de agrupamiento se pueden usar en los resúmenes generados por BIRCH.

La principal desventaja del algoritmo BIRCH es que solo funciona con datos numéricos. No puedes usar BIRCH para valores categóricos a menos que realices algunas transformaciones de datos.

Implementación:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import Birch

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# defnir el modelo
birch_model = Birch(threshold=0.03, n_clusters=2)

# entrenar el modelo
birch_model.fit(training_data)

# asignar cada punto de datos a un grupo
birch_result = birch_model.predict(training_data)

# obtener todos los grupos únicos
birch_clusters = unique(birch_result)

# graficar los grupos BIRCH
for birch_cluster in birch_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(birch_result == birch_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico BIRCH
pyplot.show()

Algoritmo de agrupamiento por Propagación de Afinidad


Este algoritmo de agrupamiento es completamente diferente de los demás en la forma en que agrupa los datos.

Cada punto de datos se comunica con todos los demás puntos de datos para que los demás sepan qué tan similares son y eso comienza a revelar los grupos en los datos. No tienes que decirle a este algoritmo cuántos grupos esperar en los parámetros de inicialización.

A medida que se envían mensajes entre puntos de datos, se encuentran conjuntos de datos llamados ejemplares que representan los grupos.

Se encuentra un ejemplar después de que los puntos de datos se hayan transmitido mensajes entre sí y formen un consenso sobre qué punto de datos representa mejor un grupo.

Cuando no estás seguro de cuántos grupos esperar, como en un problema de visión por computadora, este es un gran algoritmo para comenzar.

Implementación:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import AffinityPropagation

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
affinity_model = AffinityPropagation(damping=0.7)

# entrenar el modelo
affinity_model.fit(training_data)

# asignar cada punto de datos a un grupo
affinity_result = affinity_model.predict(training_data)

# obtener todos los grupos únicos
affinity_clusters = unique(affinity_result)

# graficar los grupos
for affinity_cluster in affinity_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(affinity_result == affinity_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico
pyplot.show()

Algoritmo de agrupamiento de Desplazamiento Medio


Este es otro algoritmo que es particularmente útil para manejar imágenes y procesamiento de visión por computadora.

El desplazamiento medio es similar al algoritmo BIRCH porque también encuentra grupos sin que se establezca un número inicial de grupos.

Este es un algoritmo de agrupamiento jerárquico, pero la desventaja es que no escala bien cuando se trabaja con grandes conjuntos de datos.

Funciona iterando sobre todos los puntos de datos y los desplaza hacia la moda. La moda en este contexto es el área de alta densidad de puntos de datos en una región.

Es por eso que es posible que escuches que se hace referencia a este algoritmo como el algoritmo de búsqueda de moda. Cada punto de datos pasará por este proceso iterativo y los moverá más cerca de donde están otros puntos de datos hasta que todos los puntos de datos hayan sido asignados a un grupo.

Implementation:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import MeanShift

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
mean_model = MeanShift()

# asignar cada punto de datos a un grupo
mean_result = mean_model.fit_predict(training_data)

# obtener todos los grupos únicos
mean_clusters = unique(mean_result)

# graficar los grupos de Deszplazamiento Medio
for mean_cluster in mean_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(mean_result == mean_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico de Deszplazamiento Medio
pyplot.show()

Algoritmo OPTICS


OPTICS significa Ordenar Puntos para Identificar la Estructura de Agrupamiento ú Ordering Points to Identify the Clustering Structure por sus siglas en inglés. Es un algoritmo basado en densidad similar a DBSCAN, pero es mejor porque puede encontrar agrupaciones significativas en datos que varían en densidad. Lo hace ordenando los puntos de datos de modo que los puntos más cercanos sean vecinos en el ordenamiento.

Esto facilita la detección de diferentes grupos de densidad. El algoritmo OPTICS solo procesa cada punto de datos una vez, similar a DBSCAN (aunque se ejecuta más lento que DBSCAN). También hay una distancia especial almacenada para cada punto de datos que indica que un punto pertenece a un grupo específico.

Implementación:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import OPTICS

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
optics_model = OPTICS(eps=0.75, min_samples=10)

# asignar cada punto de datos a un grupo
optics_result = optics_model.fit_predict(training_data)

# obtener todos los grupos únicos
optics_clusters = unique(optics_result)

# graficar los grupos OPTICS
for optics_cluster in optics_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(optics_result == optics_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico OPTICS
pyplot.show()

Algoritmo de agrupamiento de Jerarquía Aglomerativa


Este es el tipo más común de algoritmo de agrupamiento jerárquico. Se utiliza para agrupar objetos en grupos en función de su similitud entre sí.

Esta es una forma de agrupamiento de abajo hacia arriba, donde cada punto de datos se asigna a su propio grupo. Luego, esos grupos se unen.

En cada iteración, los grupos similares se fusionan hasta que todos los puntos de datos forman parte de un gran grupo raíz.

La agrupación aglomerativa es mejor para encontrar agrupaciones pequeñas. El resultado final parece un dendrograma para que puedas visualizar fácilmente los grupos cuando el algoritmo termina.

Implementación:

from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import AgglomerativeClustering

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
agglomerative_model = AgglomerativeClustering(n_clusters=2)

# asignar cada punto de datos a un grupo
agglomerative_result = agglomerative_model.fit_predict(training_data)

# obtener todos los grupos únicos
agglomerative_clusters = unique(agglomerative_result)

# graficar los grupos
for agglomerative_cluster in agglomerative_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(agglomerative_result == agglomerative_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico de Jerarquía Aglomerativa
pyplot.show()

Otros tipos de algoritmos de agrupamiento

Hemos cubierto ocho de los principales algoritmos de agrupamiento, pero hay muchos más disponibles. Hay algunos algoritmos de agrupamiento ajustados de manera muy específica que manejan tus datos de manera rápida y precisa. Estos son algunos de los otros que podrían ser de tu interés.

Hay otro algoritmo jerárquico que es lo opuesto al enfoque aglomerativo. Comienza con una estrategia de agrupación de arriba hacia abajo. Por lo tanto, comenzará con un gran grupo raíz y dividirá los grupos individuales a partir de ahí.

Esto se conoce como algoritmo de agrupamiento Jerárquico Divisivo. Hay investigaciones que muestran que esto crea jerarquías más precisas que el agrupamiento aglomerativo, pero es mucho más complejo.

El K-means en Mini Lotes es similar a K-means, excepto que utiliza pequeños fragmentos aleatorios de datos de un tamaño fijo para que puedan almacenarse en la memoria. Esto lo ayuda a ejecutarse más rápido que el K-means para que converja en una solución en menos tiempo.

El inconveniente de este algoritmo es que el aumento de velocidad le costará algo de calidad a los grupos.

El último algoritmo que cubriremos brevemente es el Agrupamiento Espectral. Este algoritmo es completamente diferente a los otros que hemos visto.

Funciona aprovechando la teoría de grafos. Este algoritmo no hace ninguna conjetura inicial sobre los grupos que se encuentran en el conjunto de datos. Trata los puntos de datos como nodos en un gráfico y los grupos se encuentran a base de comunidades de nodos que se conectan por los bordes.

Otros pensamientos


Ten cuidado con los problemas de escalado con los algoritmos de agrupamiento. Tu conjunto de datos podría tener millones de puntos de datos y, dado que los algoritmos de agrupamiento funcionan calculando las similitudes entre todos los pares de puntos de datos, es posible que termines con un algoritmo que no se escala bien.

Conclusión

Los algoritmos de agrupamiento son una excelente manera de aprender cosas nuevas a partir de datos antiguos. A veces te sorprenderán los grupos resultantes que obtendrás y podrían ayudarte a entender un problema.

Una de las cosas más interesantes de utilizar el agrupamiento para el aprendizaje no supervisado es que puedes utilizar los resultados en un problema de aprendizaje supervisado.

¡Los grupos podrían ser tus nuevas características que uses en un conjunto de datos completamente diferente! Puedes utilizar el agrupamiento en casi cualquier problema de aprendizaje automático sin supervisión, pero asegúrate de saber cómo analizar los resultados para garantizar la precisión.

Traducido del artículo de Milecia McGregor - 8 Clustering Algorithms in Machine Learning that All Data Scientists Should Know