ScikitLearn
Tutorial ScikitLearn: Clustering jerárquico
Scikit Learn: clustering jerárquico aglomerativo y divisivo, aprende a agrupar datos con aprendizaje automático no supervisado en Scikit Learn y a interpretar dendrogramas.
Aprende ScikitLearn GRATIS y certifícate¿Qué es el clustering jerárquico?
El clustering jerárquico es un método de aprendizaje no supervisado que organiza los datos en una estructura jerárquica de clusters, basándose en las similitudes entre las observaciones. A diferencia de otros algoritmos de clustering, no requiere especificar previamente el número de clusters, lo que permite explorar los datos a diferentes niveles de granularidad.
Este enfoque construye una jerarquía de clusters que puede representarse mediante un dendrograma, una gráfica que muestra cómo los clusters se fusionan o dividen en función de la distancia o similitud entre ellos. Esta representación visual facilita la identificación de patrones y relaciones en los datos, permitiendo seleccionar el nivel de agrupamiento más adecuado para el análisis.
Existen dos estrategias principales en el clustering jerárquico:
- Clustering aglomerativo: Comienza considerando cada observación como un cluster individual y, en cada iteración, fusiona los clusters más similares hasta formar un único cluster que agrupa todos los datos.
- Clustering divisivo: Inicia con todos los datos en un solo cluster y, sucesivamente, divide los clusters en otros más pequeños basándose en las diferencias entre las observaciones.
El proceso general del clustering jerárquico implica los siguientes pasos:
- Cálculo de distancias: Se determina una matriz de distancia que cuantifica la similitud entre cada par de observaciones utilizando una métrica como la distancia Euclidiana o la distancia de Manhattan.
- Agrupamiento iterativo: Se aplican criterios de enlace (como el enlace sencillo, completo o medio) para decidir qué clusters deben fusionarse o dividirse en cada etapa.
- Construcción de la jerarquía: A medida que avanza el proceso, se forma una estructura jerárquica que refleja las relaciones de agrupamiento en diferentes niveles.
Una ventaja destacada del clustering jerárquico es su interpretabilidad. Al proporcionar una visión jerárquica de los datos, permite a los analistas comprender cómo se relacionan las observaciones y cómo se forman los clusters a distintos niveles. Esto es especialmente útil en campos como la biología, la sociología y el marketing, donde las relaciones entre grupos pueden ser complejas y multinivel.
Es importante señalar que el resultado del clustering jerárquico puede verse influenciado por la elección de la medida de distancia y del criterio de enlace. Por ejemplo, el uso del enlace completo tiende a producir clusters compactos y esféricos, mientras que el enlace sencillo puede generar clusters alargados o de forma irregular.
Dendrograma, distancia y enlaces en el clustering jerárquico
El dendrograma es una representación gráfica esencial en el clustering jerárquico, ya que ilustra cómo se agrupan las observaciones en diferentes niveles de similitud. Este árbol invertido muestra las fusiones o divisiones de los clusters a medida que varía el umbral de distancia o similitud, proporcionando una visión detallada de la estructura jerárquica de los datos.
En el proceso de clustering jerárquico, la distancia es una medida clave que determina cómo se agrupan las observaciones. Las distancias más comunes utilizadas son la euclidiana, la de Manhattan y la coseno, entre otras. Estas métricas cuantifican la similitud o disimilitud entre pares de observaciones, formando una matriz de distancias que sirve como base para el agrupamiento.
El método de enlace o linkage define cómo se calcula la distancia entre clusters durante el proceso de agrupamiento. Existen varios tipos de enlaces que influyen en la forma en que se construye el dendrograma y, por ende, en los clusters resultantes:
- Enlace sencillo (single linkage): La distancia entre dos clusters se define como la mínima distancia entre cualquier par de puntos, uno de cada cluster. Tiende a formar clusters alargados y puede ser sensible al ruido y a los valores atípicos.
- Enlace completo (complete linkage): Utiliza la máxima distancia entre cualquier par de puntos de los clusters. Este enfoque produce clusters más compactos y esféricos, reduciendo el efecto de los valores atípicos.
- Enlace promedio (average linkage): Calcula la distancia media entre todos los pares de puntos de los clusters. Proporciona un equilibrio entre los enlaces sencillo y completo, generando clusters más equilibrados.
- Enlace de Ward: Busca minimizar la varianza total dentro de los clusters al fusionarlos. Este método suele producir clusters de tamaño similar y es eficaz para datos esféricos.
La elección del método de enlace y de la métrica de distancia tiene un impacto significativo en los resultados del clustering. Por ejemplo, el enlace sencillo puede provocar el fenómeno de encadenamiento, donde las observaciones se agrupan en forma de cadena, mientras que el enlace completo puede fragmentar los clusters en grupos más pequeños.
A continuación, se presenta un ejemplo de cómo calcular una matriz de distancias y aplicar diferentes métodos de enlace utilizando Scikit-Learn y SciPy:
import numpy as np
from scipy.cluster.hierarchy import linkage
from sklearn.metrics import pairwise_distances
# Datos de ejemplo
X = np.array([
[1, 2],
[2, 3],
[5, 5],
[6, 8],
[1, 0],
[0, 1]
])
# Cálculo de la matriz de distancias euclidianas
dist_matrix = pairwise_distances(X, metric='euclidean')
# Aplicación de diferentes métodos de enlace
linkage_methods = ['single', 'complete', 'average', 'ward']
for method in linkage_methods:
Z = linkage(dist_matrix, method=method, metric='euclidean')
print(f"Método de enlace: {method}")
print(Z)
print()
En este código, se calcula la matriz de distancias utilizando la función pairwise_distances
de Scikit-Learn, especificando la métrica euclidiana. Posteriormente, se aplica la función linkage
de SciPy para generar los datos necesarios para construir el dendrograma con distintos métodos de enlace. La variable Z
contiene la información jerárquica de los clusters y puede utilizarse para visualizar el dendrograma en secciones posteriores.
Es importante destacar que, aunque el clustering jerárquico puede realizarse directamente con SciPy, Scikit-Learn ofrece la clase AgglomerativeClustering
que facilita el proceso y proporciona una interfaz coherente con otros algoritmos de la biblioteca. Sin embargo, para fines de visualización del dendrograma y análisis detallado de los clusters, es común combinar ambas herramientas.
La comprensión de cómo interactúan la distancia y el método de enlace es crucial para interpretar correctamente el dendrograma. Por ejemplo, en datos con estructuras no esféricas o con ruido, seleccionar un método de enlace apropiado puede mejorar significativamente la calidad del agrupamiento. Además, ajustar la métrica de distancia permite adaptar el algoritmo a las particularidades de los datos, como escalas diferentes o variables categóricas.
Al analizar el dendrograma, se observa que la altura a la que se fusionan los clusters refleja la distancia o disimilitud entre ellos. Cortando el dendrograma a diferentes niveles, se pueden obtener agrupamientos con distinto número de clusters, lo que proporciona flexibilidad para explorar la estructura de los datos. La elección del nivel de corte puede basarse en criterios como la maximización de la consistencia interna de los clusters o la minimización de la varianza intra-cluster.
En resumen, el dendrograma, la distancia y el método de enlace son componentes fundamentales en el clustering jerárquico que determinan cómo se estructuran y visualizan los datos. Un entendimiento profundo de estos elementos permite realizar un análisis más preciso y obtener insights valiosos de los conjuntos de datos sin necesidad de especificar previamente el número de clusters.
Tipos de clústering jerárquico: aglomerativo vs. divisivo
En el clústering jerárquico, existen dos enfoques principales para agrupar las observaciones: el método aglomerativo y el divisivo. Ambos construyen una jerarquía de clusters pero difieren en la forma en que proceden durante el proceso de agrupamiento.
El clústering aglomerativo es un enfoque "bottom-up", donde cada observación comienza como un cluster individual. En cada paso iterativo, se fusionan los dos clusters más similares hasta que todos los datos quedan agrupados en un solo cluster. Este método es ampliamente utilizado debido a su eficiencia y a la disponibilidad de algoritmos optimizados en librerías como Scikit-Learn.
Por otro lado, el clústering divisivo sigue un enfoque "top-down". Inicia considerando todos los datos en un solo cluster y, sucesivamente, divide los clusters en aquellos que sean menos similares entre sí. Este proceso continúa hasta que cada observación es un cluster individual o hasta que se cumple un criterio de parada específico.
Una diferencia clave entre ambos métodos es el nivel de granularidad en las etapas iniciales del proceso. El clústering aglomerativo presta atención a las similitudes locales desde el principio, fusionando pequeños clusters basados en distancias cortas. En contraste, el clústering divisivo analiza las diferencias globales, separando las observaciones en grupos más dispares en etapas iniciales.
El método aglomerativo es más común en la práctica debido a su eficiencia computacional y a la facilidad de implementación. Los algoritmos aglomerativos suelen tener una complejidad de tiempo de $O(n^2)$, pudiendo ser más eficientes con optimizaciones adicionales. En cambio, el clústering divisivo puede ser computacionalmente más costoso, especialmente sin restricciones específicas que guíen las divisiones.
Aunque ambos métodos producen un dendrograma que representa la jerarquía de clusters, la forma en que se construye este dendrograma difiere. En el enfoque aglomerativo, las ramas inferiores representan observaciones individuales que se van fusionando, mientras que en el divisivo, el dendrograma comienza con un solo nodo raíz que se divide sucesivamente.
Es importante tener en cuenta que Scikit-Learn ofrece soporte directo para el clústering aglomerativo a través de la clase AgglomerativeClustering
. Sin embargo, no existe una implementación directa del clústering divisivo en esta librería. A pesar de ello, los conceptos del método divisivo pueden ser útiles para entender cómo se pueden abordar problemas de clustering desde una perspectiva descendente.
La elección entre clústering aglomerativo y divisivo depende de la naturaleza de los datos y de las necesidades específicas del análisis. El método aglomerativo es preferible cuando se busca eficiencia y cuando el interés se centra en las relaciones locales entre las observaciones. El método divisivo puede ser adecuado cuando se requiere una visión más global desde el inicio del proceso de clustering.
Ambos enfoques tienen sus ventajas y limitaciones. El clústering aglomerativo es susceptible a errores en etapas tempranas, ya que fusiones iniciales incorrectas pueden afectar la estructura final de los clusters. El clústering divisivo, aunque puede capturar estructuras globales, puede verse afectado por la elección inicial de los criterios de división.
En aplicaciones prácticas, comprender las diferencias entre estos tipos de clústering jerárquico permite seleccionar el método más apropiado para el análisis de los datos, aprovechando las fortalezas de cada enfoque para obtener insights significativos.
Uso de AgglomerativeClustering en Scikit learn
La clase AgglomerativeClustering de Scikit-Learn permite implementar el clúster aglomerativo jerárquico de forma eficiente y flexible. Este algoritmo es fundamental en aprendizaje no supervisado para agrupar datos basándose en sus similitudes sin necesidad de especificar el número exacto de clústers desde el principio.
Para utilizar AgglomerativeClustering, primero es necesario importarlo del módulo cluster
:
from sklearn.cluster import AgglomerativeClustering
A continuación, se puede instanciar el modelo especificando parámetros clave como el número de clústers (n_clusters
), el método de enlace (linkage
) y la métrica de distancia (metric
):
model = AgglomerativeClustering(n_clusters=3, linkage='ward', metric='euclidean')
En este ejemplo, se solicita al algoritmo que forme 3 clústers utilizando el método de enlace Ward, que minimiza la varianza dentro de cada clúster. La métrica de distancia euclidiana es la predeterminada y es adecuada para datos en espacios continuos.
Para ajustar el modelo a los datos y obtener las etiquetas de clúster, se utiliza el método fit_predict
:
labels = model.fit_predict(X)
Donde X
es una matriz o DataFrame de características que contiene las observaciones a agrupar.
A continuación, se presenta un ejemplo completo que ilustra el uso de AgglomerativeClustering con datos sintéticos:
import numpy as np
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
# Generación de datos sintéticos
X = np.array([
[1, 2], [2, 3], [3, 2],
[8, 8], [7, 7], [8, 7],
[0, 1], [1, 0], [9, 8],
[7, 8]
])
# Creación del modelo de clustering
model = AgglomerativeClustering(n_clusters=2, linkage='complete', metric='euclidean')
# Ajuste del modelo y obtención de etiquetas
labels = model.fit_predict(X)
# Visualización de los resultados
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='Accent')
plt.title('Clustering Aglomerativo con Enlace Completo')
plt.xlabel('Característica 1')
plt.ylabel('Característica 2')
plt.show()
En este código, se utiliza el método de enlace completo (complete linkage), que considera la distancia máxima entre puntos al fusionar clústers. Los datos se agrupan en 2 clústers, y los resultados se visualizan mediante un gráfico de dispersión donde los puntos se colorean según su etiqueta.
El parámetro linkage
puede tomar los siguientes valores:
'ward'
: Minimiza la suma de las diferencias al cuadrado dentro de todos los clústers. Solo se usa con la métrica euclidiana.'complete'
: La distancia entre clústers es la distancia máxima entre sus puntos, produciendo clústers compactos.'average'
: Utiliza la distancia promedio entre todos los pares de puntos de los clústers.'single'
: La distancia mínima entre los puntos de los clústers, lo que puede generar clústers alargados.
Es posible que en algunos casos se quiera determinar automáticamente el número de clústers basándose en un umbral de distancia. Para ello, se utiliza el parámetro distance_threshold
, estableciendo n_clusters=None
:
model = AgglomerativeClustering(distance_threshold=0.5, n_clusters=None, linkage='average', metric='manhattan')
labels = model.fit_predict(X)
Aquí, el algoritmo detiene la fusión de clústers cuando las distancias superan el valor de distance_threshold
. Se utiliza la métrica de distancia Manhattan, adecuada para datos donde las diferencias absolutas son más relevantes.
Es recomendable escalar las características antes de aplicar el clustering para evitar que variables con escalas mayores dominen el cálculo de distancias. Se puede utilizar StandardScaler
para estandarizar las características:
from sklearn.preprocessing import StandardScaler
# Estandarización de las características
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Aplicación del clustering sobre los datos escalados
model = AgglomerativeClustering(n_clusters=3, linkage='ward', metric='euclidean')
labels = model.fit_predict(X_scaled)
En este ejemplo, las características se transforman para tener media cero y desviación estándar uno, lo que mejora la homogeneidad de las escalas y la efectividad del algoritmo.
Si se desea incorporar información sobre la estructura de los datos, es posible utilizar el parámetro connectivity
para definir una matriz de conectividad que restringe las fusiones a vecinos próximos:
from sklearn.neighbors import kneighbors_graph
# Construcción de la matriz de conectividad basada en los 5 vecinos más cercanos
connectivity = kneighbors_graph(X_scaled, n_neighbors=5, include_self=False)
# Clustering con restricciones de conectividad
model = AgglomerativeClustering(n_clusters=3, connectivity=connectivity, linkage='ward', metric='euclidean')
labels = model.fit_predict(X_scaled)
Con esta matriz, el algoritmo solo considera la fusión de clústers si están conectados, lo que puede ser útil en datos geoespaciales o con relaciones definidas entre observaciones.
Para integrar el preprocesamiento y el clustering en un flujo de trabajo coherente, se pueden utilizar pipelines de Scikit-Learn:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# Creación de un pipeline que estandariza y luego aplica el clustering
pipeline = Pipeline([
('scaler', StandardScaler()),
('cluster', AgglomerativeClustering(n_clusters=3, linkage='average', metric='euclidean'))
], memory = None)
# Ajuste del pipeline y predicción de etiquetas
labels = pipeline.fit_predict(X)
Usar un pipeline mejora la reproducibilidad y simplifica el mantenimiento del código, ya que todos los pasos se combinan en una sola estructura.
Es importante mencionar que AgglomerativeClustering no permite predecir nuevos datos fuera del conjunto de entrenamiento. Esto se debe a que el modelo no aprende una representación generalizable, sino que construye una jerarquía específica de las observaciones proporcionadas. Si se requiere agrupar nuevos datos, es necesario volver a ajustar el modelo incluyendo estas observaciones.
Además, para evaluar la calidad del clustering obtenido, se pueden utilizar métricas como el coeficiente de silueta (silhouette_score
), disponible en sklearn.metrics
:
from sklearn.metrics import silhouette_score
# Cálculo del coeficiente de silueta
score = silhouette_score(X_scaled, labels, metric='euclidean')
print(f'Coeficiente de silueta: {score}')
Un coeficiente de silueta cercano a 1 indica que las observaciones están bien agrupadas, mientras que valores cercanos a -1 sugieren que podrían asignarse a otro clúster.
En resumen, AgglomerativeClustering es una herramienta versátil para realizar clustering jerárquico aglomerativo en Scikit-Learn. Al dominar sus parámetros y combinarlo con técnicas de preprocesamiento y evaluación, es posible extraer patrones significativos de datos sin etiquetas y mejorar la comprensión de las estructuras subyacentes.
Visualización del dendrograma com scipy
La visualización del dendrograma es fundamental para interpretar los resultados del clustering jerárquico. Utilizando la librería SciPy, es posible generar dendrogramas que representan la estructura jerárquica de los datos de manera clara y comprensible.
Para construir el dendrograma, es necesario disponer de la matriz de enlaces generada por la función linkage
de SciPy. Esta matriz contiene información sobre cómo se fusionan los clusters en cada etapa del algoritmo.
A continuación, se presenta un ejemplo completo que muestra cómo generar y visualizar un dendrograma:
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram
# Datos de ejemplo
X = np.array([
[1, 2],
[2, 3],
[5, 5],
[6, 8],
[1, 0],
[0, 1],
[5, 6],
[6, 5],
[7, 8],
[8, 6]
])
# Cálculo de la matriz de enlaces utilizando el método de enlace completo
Z = linkage(X, method='complete', metric='euclidean')
# Visualización del dendrograma
plt.figure(figsize=(10, 7))
dendrogram(Z)
plt.title('Dendrograma del Clustering Jerárquico')
plt.xlabel('Índice de la muestra')
plt.ylabel('Distancia')
plt.show()
En este código, se importan las funciones necesarias de SciPy y Matplotlib. Se define un conjunto de datos de ejemplo y se calcula la matriz de enlaces Z
utilizando el método de enlace completo y la métrica euclidiana. Luego, se emplea la función dendrogram
para generar y visualizar el dendrograma resultante.
Es relevante destacar que el parámetro method
en la función linkage
permite especificar el tipo de enlace a utilizar, como 'single', 'complete', 'average' o 'ward'. La elección del método influye en la forma en que se agrupan los datos en el dendrograma.
Para mejorar la interpretación, es posible personalizar varios aspectos de la visualización. Por ejemplo, se pueden etiquetar las muestras o colorear los clusters. A continuación, se muestra cómo etiquetar las muestras con nombres personalizados:
# Etiquetas personalizadas para las muestras
labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
# Visualización del dendrograma con etiquetas personalizadas
plt.figure(figsize=(10, 7))
dendrogram(Z, labels=labels)
plt.title('Dendrograma con Etiquetas Personalizadas')
plt.xlabel('Muestras')
plt.ylabel('Distancia')
plt.show()
En este caso, se define una lista labels
con las etiquetas para cada muestra. Al pasar este vector al parámetro labels
de la función dendrogram
, las etiquetas se muestran en el eje x del gráfico, facilitando la identificación de cada observación.
Además, es posible resaltar los diferentes clusters utilizando colores. El parámetro color_threshold
permite especificar un umbral de distancia a partir del cual se asignan colores distintos a los clusters. Por ejemplo:
# Establecer un umbral para colorear los clusters
threshold = 5
# Visualización del dendrograma con clusters coloreados
plt.figure(figsize=(10, 7))
dendrogram(Z, labels=labels, color_threshold=threshold)
plt.axhline(y=threshold, color='red', linestyle='--')
plt.title('Dendrograma con Clusters Coloreados')
plt.xlabel('Muestras')
plt.ylabel('Distancia')
plt.show()
En este fragmento de código, se establece un threshold
de 5 unidades de distancia. La función dendrogram
colorea las ramas del dendrograma por debajo de este umbral, lo que ayuda a identificar visualmente los clusters formados. La línea horizontal añadida con plt.axhline
indica el punto de corte en el dendrograma.
La función dendrogram
ofrece otros parámetros útiles para personalizar la visualización:
- leaf_rotation: permite rotar las etiquetas de las hojas en grados.
- leaf_font_size: ajusta el tamaño de la fuente de las etiquetas.
- orientation: establece la orientación del dendrograma ('top', 'bottom', 'left', 'right').
Por ejemplo, para cambiar la orientación y ajustar las etiquetas:
# Visualización del dendrograma con orientación horizontal
plt.figure(figsize=(10, 7))
dendrogram(Z, labels=labels, orientation='right', leaf_font_size=12)
plt.title('Dendrograma Horizontal')
plt.xlabel('Distancia')
plt.ylabel('Muestras')
plt.show()
En este caso, el dendrograma se muestra horizontalmente, con las muestras en el eje y y las distancias en el eje x. Esta configuración puede ser especialmente útil cuando se trabaja con un gran número de muestras y se desea mejorar la legibilidad.
Es importante mencionar que la utilización de SciPy para la visualización del dendrograma complementa el uso de Scikit-Learn para el modelado del clustering jerárquico. Mientras que Scikit-Learn facilita la agrupación de datos mediante clases como AgglomerativeClustering
, SciPy proporciona herramientas avanzadas para la representación gráfica de los resultados.
Si se ha utilizado AgglomerativeClustering
de Scikit-Learn para agrupar los datos, es posible obtener la matriz de distancias y emplearla con linkage
para generar el dendrograma. A continuación, se muestra cómo integrar ambas librerías:
from sklearn.cluster import AgglomerativeClustering
# Creación del modelo de clustering aglomerativo
model = AgglomerativeClustering(distance_threshold=0, n_clusters=None)
# Ajuste del modelo a los datos
model = model.fit(X)
# Función para crear y dibujar el dendrograma
def plot_dendrogram(model, labels=None):
# Crear la matriz de enlaces y luego dibujar el dendrograma
# Crear cuentas de muestras bajo cada nodo
counts = np.zeros(model.children_.shape[0])
n_samples = len(model.labels_)
for i, merge in enumerate(model.children_):
current_count = 0
for child_idx in merge:
if child_idx < n_samples:
current_count += 1 # nodo hoja
else:
current_count += counts[child_idx - n_samples]
counts[i] = current_count
linkage_matrix = np.column_stack([model.children_, model.distances_,
counts]).astype(float)
dendrogram(linkage_matrix, labels=labels)
# Llamar a la función para dibujar el dendrograma
plt.figure(figsize=(10, 7))
plot_dendrogram(model, labels=labels)
plt.title('Dendrograma a partir de AgglomerativeClustering')
plt.xlabel('Muestras')
plt.ylabel('Distancia')
plt.show()
En este ejemplo, se utiliza AgglomerativeClustering
con distance_threshold=0
y n_clusters=None
para obtener una jerarquía completa sin restringir el número de clusters. Se extraen los atributos children_
y distances_
del modelo para construir la matriz Z
necesaria para el dendrograma.
Es esencial tener en cuenta que AgglomerativeClustering
no calcula las distancias por defecto. En Scikit-Learn, es necesario asegurarse de que el parámetro compute_distances
esté establecido en True
al crear el modelo:
# Creación del modelo con cálculo de distancias habilitado
model = AgglomerativeClustering(distance_threshold=0, n_clusters=None, compute_distances=True)
Al habilitar compute_distances
, el modelo almacena las distancias de fusión, permitiendo construir el dendrograma correctamente.
Finalmente, al visualizar el dendrograma, se pueden tomar decisiones informadas sobre el número óptimo de clusters y comprender mejor la estructura interna de los datos. La interpretación visual es una herramienta poderosa en el análisis exploratorio, y el dendrograma es una representación esencial en el clustering jerárquico.
Determinación del número óptimo de clústers
En el clustering jerárquico, determinar el número óptimo de clústers es un paso crucial para interpretar correctamente los resultados y extraer información significativa de los datos. Aunque el clustering jerárquico no requiere especificar previamente el número de clústers, es necesario decidir en qué nivel de la jerarquía se realizará la partición para obtener una segmentación útil.
Una de las técnicas más comunes para determinar el número óptimo de clústers es el análisis visual del dendrograma. Al examinar el dendrograma, es posible identificar cortes naturales en la estructura jerárquica donde la distancia entre clústers aumenta significativamente. Estos aumentos indican que la fusión de clústers en estos puntos uniría grupos que son menos similares entre sí.
Sin embargo, el análisis visual puede ser subjetivo y poco práctico con grandes conjuntos de datos. Para abordar este desafío, se emplean métricas cuantitativas que proporcionan criterios objetivos para seleccionar el número adecuado de clústers. Entre las métricas más utilizadas se encuentran el coeficiente de silueta, el criterio de inconsistencia y el método del codo adaptado al clustering jerárquico.
El coeficiente de silueta mide qué tan similares son los objetos dentro de un clúster en comparación con los objetos de otros clústers. Este coeficiente toma valores entre -1 y 1, donde valores cercanos a 1 indican que las observaciones están bien asignadas a sus clústers. Para aplicar esta métrica, se procede a realizar cortes en el dendrograma a diferentes niveles y calcular el coeficiente de silueta para cada partición resultante.
A continuación, se presenta un ejemplo de cómo utilizar el coeficiente de silueta para determinar el número óptimo de clústers empleando Scikit-Learn y SciPy:
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# Generación de datos sintéticos
X, y = make_blobs(n_samples=500, centers=4, cluster_std=0.5, random_state=42)
# Cálculo de la matriz de enlaces
Z = linkage(X, method='ward')
# Visualización del dendrograma
plt.figure(figsize=(10, 5))
dendrogram(Z, truncate_mode='lastp', p=50)
plt.title('Dendrograma Truncado')
plt.xlabel('Número de muestras')
plt.ylabel('Distancia')
plt.show()
# Evaluación del coeficiente de silueta para diferentes números de clústers
range_n_clusters = [2, 3, 4, 5, 6]
silhouette_avg = []
for n_clusters in range_n_clusters:
clusterer = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')
cluster_labels = clusterer.fit_predict(X)
silhouette_avg.append(silhouette_score(X, cluster_labels))
# Visualización del coeficiente de silueta
plt.figure(figsize=(8, 4))
plt.plot(range_n_clusters, silhouette_avg, 'bx-')
plt.xlabel('Número de clústers')
plt.ylabel('Coeficiente de Silueta Promedio')
plt.title('Análisis del Coeficiente de Silueta')
plt.show()
En este ejemplo, se generan datos sintéticos con make_blobs y se calcula el dendrograma utilizando el método de enlace Ward. Luego, se trunca el dendrograma para facilitar la visualización. Posteriormente, se evalúa el coeficiente de silueta para diferentes números de clústers y se grafica para identificar el valor que maximiza este coeficiente.
Observando el gráfico del coeficiente de silueta, el número óptimo de clústers es aquel donde este coeficiente alcanza su valor máximo. En el caso de los datos generados, es evidente que el valor óptimo es 4, coherente con el número de centros especificado en la generación de los datos.
Otra técnica útil es el método del codo, que analiza la variación de la suma total de las distancias intra-clúster en función del número de clústers. Aunque este método es más común en el clustering no jerárquico como KMeans, puede adaptarse al clustering jerárquico calculando la inercia para diferentes números de clústers.
A continuación, se muestra cómo implementar el método del codo en el contexto del clustering jerárquico:
from scipy.cluster.hierarchy import fcluster
# Cálculo de la suma total de varianzas intra-clúster para diferentes números de clústers
range_n_clusters = range(1, 11)
inertia = []
for n_clusters in range_n_clusters:
labels = fcluster(Z, n_clusters, criterion='maxclust')
centroids = np.array([X[labels == i].mean(axis=0) for i in range(1, n_clusters + 1)])
distances = np.sum([np.sum((X[labels == i] - centroids[i - 1]) ** 2) for i in range(1, n_clusters + 1)])
inertia.append(distances)
# Visualización del método del codo
plt.figure(figsize=(8, 4))
plt.plot(range_n_clusters, inertia, 'bx-')
plt.xlabel('Número de clústers')
plt.ylabel('Suma de Cuadrados Intra-clúster')
plt.title('Método del Codo para Clustering Jerárquico')
plt.show()
En este código, se utiliza la función fcluster
de SciPy para obtener las etiquetas de clúster a partir de la matriz de enlaces Z
. Se calcula la suma de cuadrados intra-clúster (SSE) para cada partición y se grafica en función del número de clústers. El punto donde la disminución de la SSE se vuelve menos pronunciada indica el número óptimo de clústers.
Es importante destacar que no existe un método único y definitivo para determinar el número óptimo de clústers, y en la práctica es recomendable combinar varias técnicas y considerar el conocimiento previo sobre los datos. La interpretación del contexto y la naturaleza de las variables son factores clave para tomar una decisión informada.
En escenarios donde el tamaño del conjunto de datos es grande o la estructura de los datos es compleja, se pueden emplear herramientas más avanzadas como el estadístico Gap o el análisis de la varianza explicada. Sin embargo, estos métodos pueden ser computacionalmente más intensivos y requieren un entendimiento profundo de los fundamentos estadísticos.
Finalmente, cuando se trabaja con clustering jerárquico, aprovechar las capacidades de visualización interactiva puede facilitar enormemente el análisis. Librerías como Plotly o Bokeh permiten crear dendrogramas interactivos donde es posible explorar diferentes niveles de corte y observar cómo cambian los clústers en tiempo real.
Casos de uso de Clústering jerárquico
El clústering jerárquico es una técnica versátil que encuentra aplicación en diversos campos donde es necesario descubrir estructuras subyacentes en los datos sin una etiqueta predefinida. A continuación, se exploran algunos casos de uso destacados donde este método resulta especialmente útil.
En el ámbito de la biología molecular y la genómica, el clústering jerárquico es fundamental para analizar la expresión génica y clasificar genes con patrones similares. Por ejemplo, al estudiar micromatrices de expresión génica, los investigadores pueden agrupar genes que muestran niveles de expresión correlacionados bajo diferentes condiciones experimentales. Esto permite identificar vías metabólicas y procesos biológicos que están co-regulados, facilitando la comprensión de funciones genéticas y mecanismos celulares.
En análisis del texto y procesamiento del lenguaje natural, esta técnica se emplea para agrupamiento de documentos y descubrimiento de temas. Mediante la representación de textos en espacios vectoriales y el uso de medidas de similitud adecuadas, es posible organizar documentos en una jerarquía que refleja sus relaciones semánticas. Esto es especialmente útil en motores de búsqueda y sistemas de recomendación, donde se necesita estructurar grandes colecciones de documentos de forma eficiente.
El sector del marketing y la segmentación de clientes también se beneficia del clústering jerárquico. Las empresas pueden agrupar a sus clientes basándose en comportamientos de compra, características demográficas o interacciones con la marca. Al generar una estructura jerárquica de segmentos, es posible diseñar estrategias de marketing más personalizadas y eficaces, optimizando recursos y mejorando la satisfacción del cliente.
En el análisis de imágenes médicas, como en radiología o histopatología, el clústering jerárquico ayuda a clasificar imágenes o regiones de interés según características morfológicas o texturales. Esto facilita la detección de patologías y anomalías al agrupar imágenes con patrones similares, apoyando el diagnóstico y la investigación clínica.
Un caso práctico se observa en el análisis de datos geoespaciales, donde es necesario agrupar puntos o regiones basándose en su proximidad y en otras variables asociadas. Por ejemplo, en estudios ambientales, se pueden identificar zonas con niveles similares de contaminación o biodiversidad. El clústering jerárquico permite explorar estos datos sin requerir una segmentación previa, adaptándose a diferentes escalas espaciales.
En el ámbito de las redes sociales y el análisis de comunidades, esta técnica es útil para detectar grupos de usuarios con patrones de interacción similares. Al construir una jerarquía de comunidades, es posible comprender mejor la estructura social y la difusión de información dentro de la red. Esto tiene implicaciones en sociología, marketing viral y análisis de tendencias.
A continuación, se presenta un ejemplo práctico utilizando Scikit-Learn para agrupar datos de clientes en base a sus características:
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering
# Carga de datos de ejemplo
data = pd.read_csv('datos_clientes.csv')
# Selección de características relevantes
features = ['edad', 'ingreso_anual', 'puntuación_gasto']
X = data[features]
# Escalado de las características
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Aplicación del clústering jerárquico aglomerativo
cluster = AgglomerativeClustering(n_clusters=4, linkage='ward')
labels = cluster.fit_predict(X_scaled)
# Añadir etiquetas al DataFrame original
data['segmento_cliente'] = labels
# Visualización de los segmentos
print(data[['cliente_id', 'segmento_cliente']])
En este ejemplo, se realiza un preprocesamiento de los datos mediante el escalado de las características, lo que es esencial para que las medidas de distancia sean coherentes. Posteriormente, se aplica AgglomerativeClustering
para identificar segmentos de clientes, que pueden ser usados para orientar campañas de marketing específicas.
Otro caso de uso relevante es en la bioinformática para la clasificación de especies o secuencias genéticas. El siguiente ejemplo ilustra cómo agrupar secuencias de ADN basándose en su similitud:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import AgglomerativeClustering
# Lista de secuencias de ADN
sequences = [
'ATCGTACGATCG',
'GATCGATCGTAC',
'TACGATCGATCG',
'CGATCGTACGAT',
'GCGTATGCATGC',
'ATGCGTATGCGT'
]
# Vectorización de las secuencias
vectorizer = CountVectorizer(analyzer='char', ngram_range=(2, 2))
X = vectorizer.fit_transform(sequences).toarray()
# Aplicación del clústering jerárquico
cluster = AgglomerativeClustering(n_clusters=2, linkage='average')
labels = cluster.fit_predict(X)
# Resultado de los clústers
for seq, label in zip(sequences, labels):
print(f'Secuencia: {seq}, Clúster: {label}')
En este caso, se utiliza un vectorizador de n-gramas para transformar las secuencias de ADN en una representación numérica adecuada. La medida de afinidad se establece como coseno para captar mejor la similitud entre las secuencias. El clústering jerárquico permite agrupar las secuencias en dos grupos, lo que puede corresponder a diferentes familias genéticas.
El clústering de proteínas y la construcción de árboles filogenéticos también se benefician de esta técnica, ya que la jerarquía resultante refleja relaciones evolutivas entre organismos o moléculas. Esto es crucial para estudios en evolución y clasificación de especies.
En finanzas, el clústering jerárquico se aplica para agrupar activos financieros según su comportamiento en el mercado. Esto ayuda en la construcción de carteras de inversión diversificadas y en la identificación de factores comunes que afectan a determinados grupos de activos. Analizando las relaciones jerárquicas, es posible mejorar la gestión del riesgo y la toma de decisiones financieras.
Además, en el campo de la psicología y las ciencias sociales, esta técnica se utiliza para clasificar individuos en función de respuestas a cuestionarios o pruebas psicológicas. Esto facilita la identificación de perfiles y patrones de comportamiento, contribuyendo al diseño de intervenciones y programas personalizados.
Finalmente, es importante destacar que el clústering jerárquico es especialmente útil cuando se necesita una interpretación detallada de cómo se forman los grupos y sus relaciones. La representación mediante un dendrograma permite visualizar las fusiones o divisiones de los clústers, lo que es invaluable para explorar datos de manera exploratoria y para comunicar hallazgos de forma clara.
Ejercicios de esta lección Clustering jerárquico
Evalúa tus conocimientos de esta lección Clustering jerárquico con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Todas las lecciones de ScikitLearn
Accede a todas las lecciones de ScikitLearn y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Aprendizaje Automático
Introducción Y Entorno
Introducción E Instalación
Introducción Y Entorno
Introducción Al Preprocesamiento De Datos
Preprocesamiento De Datos
Identificación Y Tratamiento De Valores Faltantes
Preprocesamiento De Datos
Escalado De Datos
Preprocesamiento De Datos
Normalización De Datos
Preprocesamiento De Datos
Codificación De Variables Categóricas
Preprocesamiento De Datos
Ingeniería De Características
Preprocesamiento De Datos
Selección De Características
Preprocesamiento De Datos
Extracción De Características
Preprocesamiento De Datos
Particionamiento De Datos
Preprocesamiento De Datos
Preprocesamiento De Datos Desbalanceados
Preprocesamiento De Datos
Introducción A La Regresión
Regresión
Regresión Lineal
Regresión
Regresión Knn Kneighborsregressor
Regresión
Regresión Svm Con Svr
Regresión
Regresión Con Árboles Decisiontreeregressor
Regresión
Regresión Con Algoritmos De Conjunto
Regresión
Introducción A La Clasificación
Clasificación
Clasificación Con Regresión Logística
Clasificación
Clasificación Knn Kneighborsclassifier
Clasificación
Clasificación Svm Con Svc
Clasificación
Clasificación Con Árboles Decisiontreeclassifier
Clasificación
Clasificación Con Algoritmos De Conjunto
Clasificación
Reducción De La Dimensionalidad Con Pca
Aprendizaje No Supervisado
Clustering Con Kmeans
Aprendizaje No Supervisado
Clustering Jerárquico
Aprendizaje No Supervisado
Clustering De Densidad Con Dbscan
Aprendizaje No Supervisado
Preprocesamiento De Textos Para Nlp
Nlp
Representación De Texto Y Extracción De Características
Nlp
Clasificación De Texto Con Scikit Learn
Nlp
Análisis De Sentimiento
Nlp
Técnicas Avanzadas De Extracción De Características
Nlp
Introducción Al Análisis De Series Temporales
Series Temporales
Preprocesamiento De Datos De Series Temporales
Series Temporales
Ingeniería De Características Para Series Temporales
Series Temporales
Transformación Y Escalado De Series Temporales
Series Temporales
Validación Y Evaluación De Modelos En Series Temporales
Series Temporales
Validación Y Evaluación De Modelos
Validación De Modelos
Técnicas De Validación Cruzada
Validación De Modelos
Métricas De Regresión
Validación De Modelos
Métricas De Clasificación
Validación De Modelos
Ajuste De Hiperparámetros
Validación De Modelos
Introducción A Pipelines
Pipelines Y Despliegue
Creación De Pipelines Básicos
Pipelines Y Despliegue
Preprocesamiento De Datos Con Pipelines
Pipelines Y Despliegue
Pipelines Y Validación Cruzada
Pipelines Y Despliegue
Pipelines Con Columntransformer
Pipelines Y Despliegue
Exportar E Importar Pipelines
Pipelines Y Despliegue
Objetivos de aprendizaje de esta lección
- Comprender qué es la reducción de la dimensionalidad y su relevancia en el aprendizaje automático.
- Conocer los fundamentos del Análisis de Componentes Principales (PCA) y sus requisitos.
- Aprender a usar PCA en Scikit Learn para reducir la dimensionalidad de datos.
- Saber interpretar los datos obtenidos tras aplicar PCA.
- Determinar el número óptimo de componentes principales en PCA.
- Identificar y comprender casos de uso prácticos de PCA.