El aprendizaje no supervisado (unsupervised learning) es una rama del Machine Learning en la que se exploran y descubren patrones y estructuras ocultas en los datos sin la guía de una variable objetivo o etiquetas previas. A diferencia del aprendizaje supervisado, donde se proporcionan ejemplos de entrada y sus correspondientes salidas deseadas para entrenar al modelo, en el aprendizaje no supervisado, el algoritmo se enfrenta a un conjunto de datos sin etiquetas y busca encontrar patrones interesantes o agrupar los datos en categorías sin una guía específica.
El objetivo principal del aprendizaje no supervisado es explorar la estructura inherente de los datos y extraer información valiosa sin que el modelo tenga conocimiento previo de las categorías o relaciones entre las variables.
Hay dos tipos principales de técnicas de aprendizaje no supervisado:
El aprendizaje no supervisado tiene una amplia variedad de aplicaciones, como segmentación de clientes en marketing, detección de anomalías en datos, compresión de imágenes, agrupación de documentos en temas, entre otros. Es una herramienta poderosa para explorar y comprender la estructura intrínseca de los datos sin la necesidad de etiquetas o respuestas conocidas.
El clustering es una técnica del aprendizaje no supervisado que se utiliza para dividir un conjunto de datos en grupos basados en similitudes entre las observaciones. El objetivo es agrupar elementos similares en un mismo cluster y separar observaciones diferentes en clusters distintos, sin tener información previa sobre las categorías a las que pertenecen.
Existen varios algoritmos de clustering, pero los más comunes son:
K
centroides (punto que representa el centro geométrico de un cluster) aleatorios, luego asigna cada punto de datos al centroide más cercano y recalcula los centroides como el promedio de los puntos asignados. Repite este proceso hasta que los centroides convergen.El algoritmo K-Means es una técnica de agrupamiento que tiene como objetivo dividir un conjunto de datos en K
clústeres (definido como parámetro de entrada), de manera que los puntos dentro de cada clúster sean similares entre sí y diferentes a los puntos en otros clústeres.
Es un proceso iterativo compuesto de varios pasos:
K
puntos aleatorios del conjunto de datos como centroides iniciales. Los centroides son puntos representativos que servirán como los centros iniciales de cada cluster.K
clusters o grupos, y cada clusterestá representado por su centroide. Los grupos obtenidos representan conjuntos de puntos similares.El reto de encontrar el K
óptimo puede ser abordado mediante una optimización de hiperparámetros o mediante procedimientos más analíticos como el método del codo (elbow method), del que puedes encontrar más información aquí
Este algoritmo es rápido y efectivo para el agrupamiento de datos, pero depende mucho del reparto inicial de centroides y no siempre encuentra la mejor solución global. Por lo tanto, a veces se ejecuta varias veces con diferentes inicializaciones para evitar obtener soluciones subóptimas.
La implementación de este tipo de modelo es muy simple, y se lleva a cabo con la librería scikit-learn
. Para ello, generaremos una muestra de ejemplo utilizando también esta librería:
1import numpy as np 2from sklearn.cluster import KMeans 3from sklearn.datasets import make_blobs 4 5# Generar un conjunto de datos de ejemplo 6X, _ = make_blobs(n_samples = 300, centers = 3, random_state = 42) 7 8# Entrenar el modelo 9model = KMeans(n_clusters = 3, random_state = 42) 10model.fit(X) 11 12# Realizar predicciones con datos nuevos 13new_data = np.array([[2, 3], [0, 4], [3, 1]]) 14predictions = model.predict(new_data)
En este código de ejemplo generamos 2 clusters (hiperparámetro n_clusters
) y establecemos la semilla, ya que es un modelo con un componente de inicialización aleatorio.
Una vez hemos entrenado el modelo podemos obtener las etiquetas de qué cluster se asocia a cada punto con el atributo labels_
del modelo (model.labels_
). También podemos obtener las coordenadas de los centroides de cada cluster con el atributo cluster_centers_
del modelo (model.cluster_centers_
).
El clustering jerárquico (Hierarchical Clustering) es una técnica de agrupamiento que organiza los datos en una jerarquía de clusters, donde los clusters más pequeños se combinan gradualmente para formar agrupaciones más grandes. El resultado final es un dendrograma, que es una representación gráfica de la jerarquía de clústeres.
Es un proceso iterativo compuesto de varios pasos:
El dendrograma permite visualizar la estructura jerárquica de los clústeres y la distancia entre ellos. Los cortes horizontales en el dendrograma determinan la cantidad de clústeres obtenidos al cortar el árbol a una cierta altura.
El clustering jerárquico es útil cuando no se conoce el número óptimo de clústeres de antemano o cuando se desea explorar la estructura jerárquica de los datos. Sin embargo, puede ser computacionalmente costoso en conjuntos de datos grandes debido a la necesidad de calcular todas las distancias entre los puntos de datos.
La implementación de este tipo de modelo es muy simple, y se lleva a cabo con la librería scipy
. Para ello, generaremos una muestra de ejemplo utilizando la librería scikit-learn
:
1import numpy as np 2from scipy.cluster.hierarchy import dendrogram, linkage 3from sklearn.datasets import make_blobs 4 5# Generar un conjunto de datos de ejemplo 6X, _ = make_blobs(n_samples = 100, centers = 3, random_state = 42) 7 8# Calcular la matriz de similitud entre clusters 9Z = linkage(X, method = "complete") 10 11# Mostrar el dendrograma 12plt.figure(figsize = (10, 6)) 13 14dendrogram(Z) 15 16plt.title("Dendrograma") 17plt.xlabel("Índices de datos") 18plt.ylabel("Distancia") 19plt.show()
También podríamos utilizar la librería scikit-learn
para implementar este modelo, utilizando la función AgglomerativeClustering
, pero hoy en día se utiliza más la versión de scipy
debido a que es más intuitiva y fácil de utilizar.
La reducción de dimensionalidad (dimensionality reduction) es una técnica utilizada para disminuir la cantidad de características o variables en un conjunto de datos. El objetivo principal de este modelo es simplificar la representación de los datos, manteniendo al mismo tiempo la mayor cantidad posible de información relevante.
En muchos conjuntos de datos, especialmente en aquellos con muchas características, puede haber redundancia o correlación entre las variables, lo que puede dificultar el análisis y la visualización. La reducción de dimensionalidad aborda este problema al transformar los datos originales en un espacio de menor dimensión, donde las nuevas variables (llamadas componentes principales o características latentes) representan una combinación de las variables originales.
Hay dos enfoques principales para la reducción de dimensionalidad:
Existen muchos motivos por los cuales querríamos utilizar este tipo de modelos para simplificar los datos. Podemos destacar:
El PCA es una técnica de reducción de dimensionalidad que busca transformar un conjunto de datos original con múltiples características (dimensiones) en un nuevo conjunto de datos con menos características, pero preservando la mayor parte de la información importante.
Imaginemos que tenemos un conjunto de datos con muchas características, como la altura, el peso, la edad, los ingresos y el nivel educativo de diferentes personas. Cada persona representa un punto en un espacio de alta dimensión, donde cada característica es una dimensión. El PCA nos permite encontrar nuevas direcciones o ejes en este espacio de alta dimensión, conocidos como componentes principales. Estas direcciones representan las combinaciones lineales de las características originales que explican la mayor parte de la variabilidad de los datos. El primer componente principal captura la mayor variabilidad posible en el conjunto de datos, el segundo componente principal captura la siguiente mayor variabilidad, y así sucesivamente.
Al utilizar el PCA, podemos elegir cuántos componentes principales deseamos mantener. Si elegimos mantener solo algunos de ellos, reduciremos la cantidad de características y, por lo tanto, la dimensionalidad del conjunto de datos. Esto puede ser especialmente útil cuando existen muchas características y queremos simplificar la interpretación y el análisis de los datos.
La implementación de este tipo de algoritmo es muy simple, y se lleva a cabo con la librería scikit-learn
. Utilizaremos un conjunto de datos que venimos utilizando regularmente en el curso; el conjunto de Iris:
1from sklearn.datasets import load_iris 2from sklearn.decomposition import PCA 3 4# Cargar el conjunto de datos Iris 5iris = load_iris() 6X = iris.data 7y = iris.target 8 9# Crear un objeto PCA y ajustarlo a los datos 10pca = PCA(n_components = 2) 11X_pca = pca.fit_transform(X)
El hiperparámetro n_components
nos permite seleccionar cuántas dimensiones queremos que tenga el conjunto de datos resultante. En el ejemplo expuesto, existen 4 dimensiones: petal_length
, petal_width
, sepal_length
y sepal_width
. Después transformamos el espacio en uno en dos dimensiones, con únicamente dos características.