K-Means Clustering es un algoritmo de aprendizaje no supervisado que se utiliza para resolver los problemas de agrupación en aprendizaje automático o ciencia de datos. En este tema, aprenderemos qué es el algoritmo de agrupación en clústeres de K-means, cómo funciona el algoritmo y la implementación en Python de la agrupación en clústeres de k-means.
¿Qué es el algoritmo K-Means?
La agrupación de K-Means es una Algoritmo de aprendizaje no supervisado , que agrupa el conjunto de datos sin etiquetar en diferentes grupos. Aquí K define la cantidad de clústeres predefinidos que deben crearse en el proceso, como si K = 2, habrá dos clústeres, y para K = 3, habrá tres clústeres, y así sucesivamente.
Es un algoritmo iterativo que divide el conjunto de datos sin etiquetar en k grupos diferentes de tal manera que cada conjunto de datos pertenece solo a un grupo que tiene propiedades similares.
Nos permite agrupar los datos en diferentes grupos y es una manera conveniente de descubrir las categorías de grupos en el conjunto de datos sin etiquetar por sí solo sin necesidad de capacitación.
Es un algoritmo basado en centroides, donde cada grupo está asociado con un centroide. El objetivo principal de este algoritmo es minimizar la suma de distancias entre el punto de datos y sus correspondientes grupos.
El algoritmo toma el conjunto de datos sin etiquetar como entrada, lo divide en un número k de grupos y repite el proceso hasta que no encuentra los mejores grupos. El valor de k debe estar predeterminado en este algoritmo.
los k-significa agrupamiento El algoritmo realiza principalmente dos tareas:
- Determina el mejor valor para K puntos centrales o centroides mediante un proceso iterativo.
- Asigna cada punto de datos a su centro k más cercano. Aquellos puntos de datos que están cerca del centro k particular crean un grupo.
Por lo tanto, cada grupo tiene puntos de datos con algunos puntos en común y está alejado de otros grupos.
El siguiente diagrama explica el funcionamiento del algoritmo de agrupamiento de K-medias:
¿Cómo funciona el algoritmo K-Means?
El funcionamiento del algoritmo K-Means se explica en los siguientes pasos:
Paso 1: Seleccione el número K para decidir el número de grupos.
Paso 2: Seleccione K puntos o centroides aleatorios. (Puede ser otro del conjunto de datos de entrada).
Paso 3: Asigne cada punto de datos a su centroide más cercano, que formará los K grupos predefinidos.
Etapa 4: Calcule la varianza y coloque un nuevo centroide de cada grupo.
Paso 5: Repita el tercer paso, lo que significa reasignar cada punto de datos al nuevo centroide más cercano de cada grupo.
Paso 6: Si se produce alguna reasignación, vaya al paso 4; de lo contrario, vaya a FINALIZAR.
Paso-7 : El modelo está listo.
Entendamos los pasos anteriores considerando los gráficos visuales:
Supongamos que tenemos dos variables M1 y M2. El diagrama de dispersión del eje xy de estas dos variables se muestra a continuación:
- Tomemos el número k de grupos, es decir, K = 2, para identificar el conjunto de datos y colocarlos en diferentes grupos. Significa que aquí intentaremos agrupar estos conjuntos de datos en dos grupos diferentes.
- Necesitamos elegir algunos k puntos aleatorios o centroide para formar el grupo. Estos puntos pueden ser puntos del conjunto de datos o cualquier otro punto. Entonces, aquí estamos seleccionando los dos puntos siguientes como k puntos, que no forman parte de nuestro conjunto de datos. Considere la siguiente imagen:
- Ahora asignaremos cada punto de datos del diagrama de dispersión a su punto K o centroide más cercano. Lo calcularemos aplicando algunas matemáticas que hemos estudiado para calcular la distancia entre dos puntos. Entonces, dibujaremos una mediana entre ambos centroides. Considere la siguiente imagen:
En la imagen de arriba, queda claro que los puntos del lado izquierdo de la línea están cerca del K1 o centroide azul, y los puntos a la derecha de la línea están cerca del centroide amarillo. Coloreémoslos de azul y amarillo para una visualización clara.
- Como necesitamos encontrar el grupo más cercano, repetiremos el proceso eligiendo un nuevo centroide . Para elegir los nuevos centroides, calcularemos el centro de gravedad de estos centroides y encontraremos nuevos centroides como se muestra a continuación:
- A continuación, reasignaremos cada punto de datos al nuevo centroide. Para ello, repetiremos el mismo proceso de encontrar una línea mediana. La mediana será como la imagen de abajo:
En la imagen de arriba, podemos ver que un punto amarillo está en el lado izquierdo de la línea y dos puntos azules están a la derecha de la línea. Entonces, estos tres puntos serán asignados a nuevos centroides.
Como se ha producido la reasignación, volveremos al paso 4, que es encontrar nuevos centroides o puntos K.
- Repetiremos el proceso encontrando el centro de gravedad de los centroides, por lo que los nuevos centroides quedarán como se muestra en la siguiente imagen:
- A medida que obtuvimos los nuevos centroides, nuevamente dibujaremos la línea mediana y reasignaremos los puntos de datos. Entonces la imagen será:
- Podemos ver en la imagen de arriba; no hay puntos de datos diferentes a ninguno de los lados de la línea, lo que significa que nuestro modelo está formado. Considere la siguiente imagen:
Como nuestro modelo está listo, ahora podemos eliminar los centroides asumidos y los dos grupos finales serán como se muestra en la siguiente imagen:
longitud de la cadena bash
¿Cómo elegir el valor de 'K número de conglomerados' en K-means Clustering?
El rendimiento del algoritmo de agrupamiento de K-medias depende de los grupos altamente eficientes que forma. Pero elegir el número óptimo de clusters es una gran tarea. Hay algunas formas diferentes de encontrar el número óptimo de conglomerados, pero aquí estamos analizando el método más apropiado para encontrar el número de conglomerados o el valor de K. El método se detalla a continuación:
Método del codo
El método del codo es una de las formas más populares de encontrar el número óptimo de grupos. Este método utiliza el concepto de valor WCSS. WCSS representa Dentro del grupo suma de cuadrados , que define las variaciones totales dentro de un grupo. La fórmula para calcular el valor de WCSS (para 3 grupos) se proporciona a continuación:
WCSS= ∑PAGyo en el grupo 1distancia(PiC1)2+∑PAGyo en el cluster2distancia(PiC2)2+∑PAGYo en CLuster3distancia(PiC3)2En la fórmula anterior de WCSS,
∑PAGyo en el grupo 1distancia(PiC1)2: Es la suma del cuadrado de las distancias entre cada punto de datos y su centroide dentro de un cluster1 y lo mismo para los otros dos términos.
Para medir la distancia entre los puntos de datos y el centroide, podemos utilizar cualquier método, como la distancia euclidiana o la distancia de Manhattan.
Para encontrar el valor óptimo de los grupos, el método del codo sigue los siguientes pasos:
- Ejecuta la agrupación de K-medias en un conjunto de datos determinado para diferentes valores de K (varía de 1 a 10).
- Para cada valor de K, calcula el valor WCSS.
- Traza una curva entre los valores WCSS calculados y el número de grupos K.
- El punto de curvatura pronunciado o un punto del trazado parece un brazo, entonces ese punto se considera como el mejor valor de K.
Dado que el gráfico muestra una curva pronunciada, que parece un codo, se le conoce como método del codo. El gráfico del método del codo se parece a la siguiente imagen:
Nota: Podemos elegir el número de grupos igual a los puntos de datos dados. Si elegimos el número de grupos igual a los puntos de datos, entonces el valor de WCSS se vuelve cero y ese será el punto final del gráfico.
Implementación en Python del algoritmo de agrupación en clústeres K-means
En la sección anterior, analizamos el algoritmo K-means, ahora veamos cómo se puede implementar usando Pitón .
Antes de la implementación, comprendamos qué tipo de problema resolveremos aquí. Entonces, tenemos un conjunto de datos de Clientes_centro comercial , que son los datos de los clientes que visitan el centro comercial y gastan allí.
En el conjunto de datos dado, tenemos Customer_Id, sexo, edad, ingreso anual ($) y puntaje de gasto (que es el valor calculado de cuánto ha gastado un cliente en el centro comercial, cuanto más valor, más ha gastado). A partir de este conjunto de datos, necesitamos calcular algunos patrones, ya que es un método no supervisado, por lo que no sabemos qué calcular exactamente.
Los pasos a seguir para la implementación se detallan a continuación:
Paso 1: Paso de preprocesamiento de datos
El primer paso será el preprocesamiento de datos, como hicimos en nuestros temas anteriores de Regresión y Clasificación. Pero para el problema de la agrupación, será diferente de otros modelos. Discutamoslo:
Como hicimos en temas anteriores, primero importaremos las bibliotecas para nuestro modelo, lo cual es parte del preprocesamiento de datos. El código se proporciona a continuación:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd
En el código anterior, el engordado hemos importado para realizar cálculos matemáticos, matplotlib es para trazar el gráfico, y pandas son para gestionar el conjunto de datos.
A continuación, importaremos el conjunto de datos que necesitamos utilizar. Aquí estamos utilizando el conjunto de datos Mall_Customer_data.csv. Se puede importar usando el siguiente código:
# Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv')
Al ejecutar las líneas de código anteriores, obtendremos nuestro conjunto de datos en el IDE de Spyder. El conjunto de datos se parece a la siguiente imagen:
A partir del conjunto de datos anterior, necesitamos encontrar algunos patrones en él.
Aquí no necesitamos ninguna variable dependiente para el paso de preprocesamiento de datos, ya que es un problema de agrupación y no tenemos idea de qué determinar. Entonces simplemente agregaremos una línea de código para la matriz de características.
x = dataset.iloc[:, [3, 4]].values
Como podemos ver, estamos extrayendo solo 3terceroy 4thcaracterística. Esto se debe a que necesitamos un gráfico 2D para visualizar el modelo y algunas características no son necesarias, como customer_id.
Paso 2: encontrar el número óptimo de grupos utilizando el método del codo
En el segundo paso, intentaremos encontrar el número óptimo de clústeres para nuestro problema de agrupamiento. Entonces, como se mencionó anteriormente, aquí usaremos el método del codo para este propósito.
Como sabemos, el método del codo utiliza el concepto WCSS para dibujar el gráfico trazando los valores de WCSS en el eje Y y el número de grupos en el eje X. Entonces, vamos a calcular el valor de WCSS para diferentes valores de k que van del 1 al 10. A continuación se muestra el código correspondiente:
#finding optimal number of clusters using the elbow method from sklearn.cluster import KMeans wcss_list= [] #Initializing the list for the values of WCSS #Using for loop for iterations from 1 to 10. for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', random_state= 42) kmeans.fit(x) wcss_list.append(kmeans.inertia_) mtp.plot(range(1, 11), wcss_list) mtp.title('The Elobw Method Graph') mtp.xlabel('Number of clusters(k)') mtp.ylabel('wcss_list') mtp.show()
Como podemos ver en el código anterior, hemos utilizado los KMeans clase de sklearn. biblioteca de clústeres para formar los clústeres.
A continuación hemos creado el lista_wcss Variable para inicializar una lista vacía, que se utiliza para contener el valor de wcss calculado para diferentes valores de k que van del 1 al 10.
Después de eso, hemos inicializado el bucle for para la iteración en un valor diferente de k que oscila entre 1 y 10; Dado que el bucle for en Python excluye el límite de salida, se toma como 11 para incluir 10.thvalor.
El resto del código es similar a lo que hicimos en temas anteriores, ya que ajustamos el modelo a una matriz de características y luego trazamos el gráfico entre el número de conglomerados y WCSS.
Producción: Después de ejecutar el código anterior, obtendremos el siguiente resultado:
En el gráfico anterior, podemos ver que el punto del codo está en 5. Entonces el número de grupos aquí será 5.
Paso 3: entrenar el algoritmo K-means en el conjunto de datos de entrenamiento
Como tenemos la cantidad de clústeres, ahora podemos entrenar el modelo en el conjunto de datos.
Para entrenar el modelo, usaremos las mismas dos líneas de código que usamos en la sección anterior, pero aquí en lugar de usar i, usaremos 5, ya que sabemos que hay 5 grupos que deben formarse. El código se proporciona a continuación:
#training the K-means model on a dataset kmeans = KMeans(n_clusters=5, init='k-means++', random_state= 42) y_predict= kmeans.fit_predict(x)
La primera línea es la misma que la anterior para crear el objeto de la clase KMeans.
En la segunda línea de código, hemos creado la variable dependiente y_predict para entrenar el modelo.
Al ejecutar las líneas de código anteriores, obtendremos la variable y_predict. Podemos comprobarlo debajo el explorador de variables opción en el IDE de Spyder. Ahora podemos comparar los valores de y_predict con nuestro conjunto de datos original. Considere la siguiente imagen:
De la imagen de arriba, ahora podemos relacionar que el CustomerID 1 pertenece a un clúster.
3 (dado que el índice comienza en 0, por lo tanto, 2 se considerará 3), y 2 pertenece al grupo 4, y así sucesivamente.
Paso 4: Visualizar los clústeres
El último paso es visualizar los clusters. Como tenemos 5 grupos para nuestro modelo, visualizaremos cada grupo uno por uno.
javamvc
Para visualizar los grupos se utilizará un diagrama de dispersión utilizando la función mtp.scatter() de matplotlib.
#visulaizing the clusters mtp.scatter(x[y_predict == 0, 0], x[y_predict == 0, 1], s = 100, c = 'blue', label = 'Cluster 1') #for first cluster mtp.scatter(x[y_predict == 1, 0], x[y_predict == 1, 1], s = 100, c = 'green', label = 'Cluster 2') #for second cluster mtp.scatter(x[y_predict== 2, 0], x[y_predict == 2, 1], s = 100, c = 'red', label = 'Cluster 3') #for third cluster mtp.scatter(x[y_predict == 3, 0], x[y_predict == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') #for fourth cluster mtp.scatter(x[y_predict == 4, 0], x[y_predict == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') #for fifth cluster mtp.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroid') mtp.title('Clusters of customers') mtp.xlabel('Annual Income (k$)') mtp.ylabel('Spending Score (1-100)') mtp.legend() mtp.show()
En las líneas de código anteriores, hemos escrito código para cada grupo, que va del 1 al 5. La primera coordenada de mtp.scatter, es decir, x[y_predict == 0, 0] que contiene el valor x para mostrar la matriz de presenta valores, y y_predict oscila entre 0 y 1.
Producción:
La imagen de salida muestra claramente los cinco grupos diferentes con diferentes colores. Los grupos se forman entre dos parámetros del conjunto de datos; Ingresos anuales del cliente y Gastos. Podemos cambiar los colores y etiquetas según el requisito o elección. También podemos observar algunos puntos de los patrones anteriores, que se detallan a continuación:
- El grupo 2 muestra que el cliente tiene altos ingresos pero bajos gastos, por lo que podemos clasificarlos como cuidadoso .
- El grupo 3 muestra los bajos ingresos y también el bajo gasto, por lo que pueden clasificarse como sensatos.
- Cluster4 muestra a los clientes de bajos ingresos con gastos muy altos para que puedan clasificarse como descuidado .
- El grupo 5 muestra a los clientes con altos ingresos y altos gastos para que puedan clasificarse como objetivo, y estos clientes pueden ser los clientes más rentables para el propietario del centro comercial.