import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.cluster import KMeans, DBSCAN
from sklearn.metrics import silhouette_score
from sklearn.model_selection import train_test_split
import pandas_datareader as pdr
# Descargar el dataset
import urllib.request
import zipfile
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank-additional.zip'
urllib.request.urlretrieve(url, 'bank-additional.zip')
# Leer el archivo zip
with zipfile.ZipFile('bank-additional.zip', 'r') as zip_ref:
zip_ref.extractall()
# Leer el conjunto de datos
data = pd.read_csv('bank-additional/bank-additional-full.csv', sep=';')
month: Mes del último contacto realizado con el cliente (variable categórica).
poutcome: Resultado de la campaña de marketing anterior (variable categórica).
len(data.columns.to_list())
# Seleccionar las características para el agrupamiento
X = data[['age', 'campaign']]
X.head()
train_test_split(X, test_size=0.2, random_state=42)
# Dividir los datos en entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_train, X_test = train_test_split(X, test_size=0.2, random_state=42)
print(X.shape , X_train.shape , X_test.shape)
El algoritmo K-means es una técnica de agrupamiento (clustering) ampliamente utilizada y está disponible en la biblioteca de aprendizaje automático scikit-learn de Python. A continuación, se describen los parámetros más relevantes del algoritmo KMeans en scikit-learn:
n_clusters: Especifica el número de grupos (clusters) que se desean crear. Es un parámetro obligatorio y debe ser un valor entero positivo.
init: Determina el método utilizado para inicializar los centroides de los grupos. Puede tomar uno de los siguientes valores:
n_init: Especifica el número de veces que se ejecutará el algoritmo con diferentes centroides iniciales. El resultado final será el mejor de todas las ejecuciones en términos de la inercia.
max_iter: Indica el número máximo de iteraciones que realizará el algoritmo para converger. Si los centroides no convergen antes de alcanzar el número máximo de iteraciones, el algoritmo se detendrá.
tol: Especifica un valor de tolerancia para la convergencia. Si la diferencia entre las inercias de dos iteraciones consecutivas es menor o igual a esta tolerancia, se considera que el algoritmo ha convergido y se detiene.
random_state: Es un valor entero que permite controlar la generación de números aleatorios en el algoritmo. Esto garantiza que los resultados sean reproducibles.
kmeans = KMeans(n_clusters=2,init='random', n_init=20)
kmeans.fit(X_train)
# k-means con 3 clusters
kmeans = KMeans(n_clusters=3,init='random', n_init=20)
kmeans.fit(X_train)
kmeans.predict(X_train)
import matplotlib.pyplot as plt
# Crear el gráfico de dispersión utilizando Seaborn
sns.scatterplot(x=X_train['age'], y=X_train['campaign'], hue=kmeans.predict(X_train))
# Personalizar los ejes y el título
plt.xlabel('Age')
plt.ylabel('Campaign')
plt.title('Gráfico de dispersión en muestra de Train')
# Mostrar el gráfico
plt.show()
kmeans.predict(X_test)
sns.scatterplot(x=X_test['age'], y=X_test['campaign'], hue=kmeans.predict(X_test))
# Personalizar los ejes y el título
plt.xlabel('Age')
plt.ylabel('Campaign')
plt.title('Gráfico de dispersión en muestra de Train')
# Mostrar el gráfico
plt.show()
El algoritmo DBSCAN (Density-Based Spatial Clustering of Applications with Noise) es una técnica de agrupamiento que se basa en la densidad de los puntos en el espacio de características. La implementación de DBSCAN en scikit-learn proporciona varios parámetros que se pueden ajustar para controlar el comportamiento del algoritmo. A continuación, te proporcionaré una descripción de los parámetros más importantes del DBSCAN en scikit-learn:
eps: Especifica la distancia máxima entre dos puntos para que se consideren vecinos. Es un parámetro crítico que determina la densidad requerida para formar un grupo. Un valor de eps más pequeño resultará en grupos más densos.
min_samples: Especifica el número mínimo de puntos dentro de un radio eps para que un punto se considere un núcleo. Los puntos núcleo son aquellos que tienen suficientes vecinos dentro de su vecindario eps para formar un grupo. Un valor mayor de min_samples requerirá una mayor densidad para formar grupos.
metric: Especifica la métrica de distancia utilizada para medir la distancia entre los puntos. Puede ser una cadena de texto que representa una de las métricas de distancia disponibles en scikit-learn, como "euclidean", "manhattan", "cosine", entre otras.
n_jobs: Especifica el número de trabajos en paralelo para ejecutar el algoritmo. Puede acelerar el proceso en sistemas con múltiples núcleos de CPU. Un valor de -1 utilizará todos los núcleos disponibles.
# DBSCAN con eps = 1 y min_samples = 5
dbscan = DBSCAN(eps=1, min_samples=10 , metric ='manhattan')
dbscan.fit(X_train)
X_train['age_std'] = (X_train['age'] - X_train['age'].mean()) / X_train['age'].std()
import matplotlib.pyplot as plt
# Crear el gráfico de dispersión utilizando Seaborn
sns.scatterplot(x=X_train['age'], y=X_train['campaign'], hue=dbscan.fit_predict(X_train))
# Personalizar los ejes y el título
plt.xlabel('Age')
plt.ylabel('Campaign')
plt.title('Gráfico de dispersión en muestra de Train')
# Mostrar el gráfico
plt.show()
# Calcular el puntaje de silueta para k-means
kmeans_silhouette = silhouette_score(X_test, kmeans.predict(X_test))
# Calcular el puntaje de silueta para DBSCAN
dbscan_silhouette = silhouette_score(X_test, dbscan.fit_predict(X_test))
# Imprimir los puntajes de silueta
print("Puntaje de silueta para k-means: ", kmeans_silhouette)
print("Puntaje de silueta para DBSCAN: ", dbscan_silhouette)
predict = pd.DataFrame(kmeans.predict(X_test) , columns=['predict'])
predict = pd.DataFrame(kmeans.predict(X_test) , columns=['predict'])
pd.concat([X_test, predict] ).to_csv('k-means')
from itertools import product
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
param_grid = {'n_clusters': [2, 3, 4, 5],
'init': ['k-means++', 'random'],
'n_init': [10, 20, 30]}
# Generar todas las combinaciones de parámetros
combinations = list(product(*param_grid.values()))
print(combinations)
list(combinations[1])