K-means with wines dataset
Importamos librerias
from sklearn.cluster import KMeans
from sklearn import tree
from sklearn import datasets
from sklearn import metrics
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
Cargamos el dataset wines
# Cargamos informacion de wines
wines = datasets.load_wine()
Separamos nuestro conjunto de datos
# Separamos nuestra dataset
x = pd.DataFrame(wines.data, columns = wines.feature_names)
x
y = pd.DataFrame(wines.target, columns = ['target'])
Revisamos Outliers
Si graficamos algunos boxplots podremos observar la existencia de outliers
ax = sns.boxplot(data=x['malic_acid'], orient="h", palette="Set2")
ax = sns.boxplot(data=x['magnesium'], orient="h", palette="Set2")
ax = sns.boxplot(data=x['color_intensity'], orient="h", palette="Set2")
Ajustamos escala de valores
Debemos ajustar la escala en las variables, pero necesitamos utilizar una función que contemple la existencia de outliers
from sklearn.preprocessing import RobustScaler #esta función contempla la existencia de outliers
scaler = RobustScaler().fit(x)
x_scaled = scaler.transform(x)
xs = pd.DataFrame(x_scaled, columns = wines.feature_names)
xs
Aplicamos método del codo
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, max_iter=1000, random_state=0)
kmeans.fit(xs)
wcss.append(kmeans.inertia_)
print(wcss)
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
Agrupamos usando KMeans
model = KMeans(n_clusters=3, max_iter=1000)
model.fit(xs)
y_labels = model.labels_
y_kmeans = model.predict(xs)
print(f'Predicciones {y_kmeans}')
Calculamos la precisión del modelo
accuracy = metrics.adjusted_rand_score(wines.target, y_kmeans)
print(accuracy)
Visualizamos los grupos
plt.scatter(x['alcohol'], x['proline'], c = y_kmeans, s = 30)
plt.xlabel('Alcohol', fontsize = 10)
plt.ylabel('Proline', fontsize = 10)
y_kmeans_df = pd.DataFrame(y_kmeans, columns = ['Prediction'])
Concatenar el dataset de entrada con el de la predicción
Z = pd.concat([xs, y_kmeans_df], axis = 1)
# Grafico
sns.pairplot(Z, hue = 'Prediction')