Tu primer clustering con scikit-learn

2/27
Recursos

Aportes 12

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola
Les comparto una manera de graficar los clusters un poco mas sencilla.

Hola, no me queria funcionar el codigo en la linea

fig, ax = plt.subplots(1,1, figsize=(15,10))

Si alguien tiene ese mismo error, mi solucion fue importar subplots

from matplotlib.pyplot import subplots

Y luego eliminar “plt” de la linea de codigo.

fig, ax = subplots(1,1, figsize=(15,10))

Espero le sirva a alguien

Machine Learning: allá voy 🚀🔥

Template para plotly que colocaremos en un notebook en el mismo directorio

import plotly.graph_objects as go
import plotly.io as pio

pio.templates['new_template'] = go.layout.Template()
pio.templates['new_template']['layout']['font'] = {'family': 'verdana', 'size': 16, 'color': 'white'}
pio.templates['new_template']['layout']['paper_bgcolor'] = 'black'
pio.templates['new_template']['layout']['plot_bgcolor'] = 'black'
pio.templates['new_template']['layout']['xaxis'] = {'title_standoff': 10, 'linecolor': 'black', 'mirror': True, 'gridcolor': '#EEEEEE'}
pio.templates['new_template']['layout']['yaxis'] = {'title_standoff': 10, 'linecolor': 'black', 'mirror': True, 'gridcolor': '#EEEEEE'}
pio.templates['new_template']['layout']['legend_bgcolor'] = 'rgb(117, 112, 179)'
pio.templates['new_template']['layout']['height'] = 700
pio.templates['new_template']['layout']['width'] = 1000
pio.templates['new_template']['layout']['autosize'] = False

pio.templates.default = 'new_template'

Ejecutamos con funciones magicas el notebook del template

%run "template_visualitation.ipynb"

Funcion para visualizar los scatter plot con plotlly

import plotly.graph_objects as go
import plotly.express as px


def graficar_clusters_plotly(x,y, color, show=True):
    global fig1
    fig1 = go.Figure()
    y_uniques = pd.Series(y).unique()

    for _ in y_uniques:
        fig1.add_traces(data=px.scatter(x=x[y==_][:,0], y=x[y==_][:,1],opacity=0.8, color_discrete_sequence=[color[_]]).data)

    fig1.update_layout(showlegend=True)
    fig1.show()

Ejecutamos nuestra funcion

graficar_clusters_plotly(x,y, ['red', 'blue', 'green', 'white'])

Eliminar o comentar la linea del notebook que contiene el siguiente codigo, no afecta la clusterizacion con KMeans:

x, y = df_blobls[['x1','x2']], df_blobls['y']

Agregamos un color ya que ahora tenemos 5 centroides

graficar_clusters_plotly(x,y_pred, ['red', 'blue', 'green', 'white', 'yellow'])

A modo de aporte para ir más allá de estos modelos básicos que se ven. Les recomiendo revisar

  1. HDBSCAN: como saben DBSCAN es parametrico y requiere por ejemplo el valor de un valor epsilon. Este modelo trata de refinar y ayudarnos para evitar tratar de tunear dicho parametro
  2. Gaussian mixtures: Estos modelos básicos tienen problemas para detectar datos anomalos. Este algoritmo permite deterctar datos anomalos, asignando una probabilidad a que cada dato pertenezca a una distribucion gaussina

This is a function definition for a function called plot_2d_clusters that takes in three arguments: x, y, and ax.

The function does the following:

It first creates a Pandas Series object from the y argument, and then uses the unique method of the Series to find the unique values in y. It stores the resulting array of unique values in the variable y_uniques.

It then enters a loop, in which it iterates over the unique values in y_uniques. On each iteration of the loop, the function plots the data points in x where the corresponding value in y is equal to the current unique value being iterated over.

The plot is created using the plot method of the DataFrame object x, which is passed the following arguments:

title: a string that is the title of the plot, which is constructed using string interpolation to insert the number of unique values in y into the string.
kind: the type of plot to create, which is set to ‘scatter’.
x: the name of the column in x to use as the x-axis data.
y: the name of the column in x to use as the y-axis data.
marker: a string that specifies the marker to use for the data points in the plot, which is constructed using string interpolation to insert the current unique value being iterated over into the string.
ax: the Matplotlib Axes object to use for the plot.
It’s worth noting that this function does not return anything, but instead creates a plot using the ax argument.

Otra forma de graficar los clusters:

plt.figure(figsize=(6,6))
def plot_blobs(x, y, ax, cmap='viridis'):
    labels = np.unique(y)
    cmap_ = plt.get_cmap(cmap, lut=len(labels))
    for label in labels:
        sub_idx = np.argwhere(y == label).ravel()
        sub_x = x[sub_idx]
        sub_y = y[sub_idx]
        ax.scatter(sub_x[:,0], sub_x[:,1], color=cmap_(label), label=label)

plot_blobs(x,y, plt.gca(), cmap='Dark2')
plt.legend()
plt.show()

Para agilizar

import numpy as np
import pandas as pd
from sklearn.datasets import make_blobs
import seaborn as sns
import matplotlib.pyplot as plt

x, y = make_blobs(n_samples=100, centers=4, n_features=2, cluster_std=[1,1.5,2,2], random_state=7)

df_blobls = pd.DataFrame({
    'x1': x[:,0],
    'x2':x[:,1],
    'y':y

})

def plot_2d_clusters(x,y,ax):
    y_uniques = pd.Series(y).unique()

    for _ in y_uniques:
        x[y==_].plot(
            title=f'{len(y_uniques)} Clusters',
            kind='scatter',
            x='x1',
            y='x2',
            marker = f'${_}$',
            ax = ax
        )

fig, ax = plt.subplots(1,1, figsize=(15,10))
x, y = df_blobls[['x1','x2']], df_blobls['y']
plot_2d_clusters(x,y,ax)
plt.show()```
Los que venimos del aprendizaje supervisado para el No supervisado empezamos a hacer "WooooooW" con este curso. Ya comenzamos paso a paso a dar saltos de alegría de ver lo que puede hacer la IA.
***<u>CLUSTERING </u>*** El clustering es una técnica de aprendizaje no supervisado en el campo de la inteligencia artificial y el análisis de datos. El objetivo principal del clustering es agrupar un conjunto de datos en subconjuntos o "clusters", donde los elementos dentro de cada grupo son más similares entre sí que con aquellos en otros grupos. Los algoritmos de clustering buscan encontrar patrones intrínsecos en los datos sin necesidad de etiquetas previas. Algunos algoritmos de clustering comunes incluyen: 1. **K-Means:** * Divide el conjunto de datos en k grupos (clusters) basándose en la distancia entre los puntos y los centroides de los clusters. 2. **Hierarchical Clustering:** * Agrupa los datos en una jerarquía de clusters, ya sea de manera aglomerativa (fusionando clusters en cada paso) o divisiva (dividiendo clusters en cada paso). 3. **DBSCAN (Density-Based Spatial Clustering of Applications with Noise):** * Identifica clusters basándose en la densidad de los puntos. Es especialmente útil para detectar clusters de formas irregulares y manejar ruido en los datos. 4. **Mean Shift:** * Busca los modos de densidad máxima en el espacio de características para identificar los clusters. 5. **Gaussian Mixture Model (GMM):** * Modela el conjunto de datos como una mezcla de distribuciones gaussianas y asigna puntos a los clusters basándose en la probabilidad. 6. **Agglomerative Clustering:** * Un algoritmo jerárquico que comienza considerando cada punto como un cluster individual y fusiona clusters en cada paso hasta que todos los puntos pertenecen a un único cluster. La elección del algoritmo de clustering depende de la naturaleza de los datos y de los objetivos específicos del análisis. El número de clusters (k) también es un parámetro importante y puede ser fijo o determinado automáticamente por el algoritmo. El clustering se utiliza en una variedad de campos, incluyendo la segmentación de clientes, análisis de documentos, genómica, reconocimiento de patrones, entre otros.
Hola. Les comparto mi aporte, ```js g = sns.jointplot(data=df_blobls, x="x1", y="x2", hue='y') g.plot_joint(sns.kdeplot, color="r", zorder=0, levels=6) g.plot_marginals(sns.rugplot, color="r", height=-.15, clip_on=False) ```g = sns.jointplot(data=df\_blobls, x="x1", y="x2", hue='y')g.plot\_joint(sns.kdeplot, color="r", zorder=0, levels=6)g.plot\_marginals(sns.rugplot, color="r", height=-.15, clip\_on=False) ![]()

Comparto el codigo para mostarlo más estetico!!

def plot_2d_clusters(x, y ,axe, title):
    y_uniques = pd.Series(y).unique()
    for y_unique in y_uniques:
        axe.scatter(x[y == y_unique, 0], x[y == y_unique, 1], label=y_unique)
        axe.set_title(title)
        axe.markers = [f"${y_unique}$"]
        axe.legend()