Transformar características para mejores clústeres

Aprendizaje no supervisado en Python

Benjamin Wilson

Director of Research at lateral.io

Conjunto de datos de vinos del Piamonte

  • 178 muestras de 3 variedades de vino tinto: Barolo, Grignolino y Barbera

  • Las características miden la composición química, p. ej., contenido de alcohol

  • Propiedades visuales como «intensidad de color»

1 Source: https://archive.ics.uci.edu/ml/datasets/Wine
Aprendizaje no supervisado en Python

Agrupar los vinos

from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
labels = model.fit_predict(samples)
Aprendizaje no supervisado en Python

Clústeres vs. variedades

df = pd.DataFrame({'labels': labels, 
                       'varieties': varieties})
ct = pd.crosstab(df['labels'], df['varieties'])

print(ct)
varieties  Barbera  Barolo  Grignolino
labels                                
0               29      13          20
1                0      46           1
2               19       0          50
Aprendizaje no supervisado en Python

Varianza de características

  • ¡Las características del vino tienen varianzas muy distintas!

  • La varianza de una característica mide la dispersión de sus valores

feature     variance
alcohol         0.65
malic_acid      1.24
...
od280           0.50
proline     99166.71

Diagrama de dispersión de la variable od280 vs variable malic_acid

Aprendizaje no supervisado en Python

Varianza de características

  • ¡Las características del vino tienen varianzas muy distintas!

  • La varianza de una característica mide la dispersión de sus valores

feature     variance
alcohol         0.65
malic_acid      1.24
...
od280           0.50
proline     99166.71

Diagrama de dispersión de la variable od280 vs número de observación

Aprendizaje no supervisado en Python

StandardScaler

  • En k-means: mayor varianza ⇒ mayor influencia

  • StandardScaler transforma cada característica a media 0 y varianza 1

  • Se dice que las características quedan «estandarizadas»

Dispersión de od280 y proline estandarizados

Aprendizaje no supervisado en Python

sklearn StandardScaler

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(samples) StandardScaler(copy=True, with_mean=True, with_std=True)
samples_scaled = scaler.transform(samples)
Aprendizaje no supervisado en Python

Métodos similares

  • StandardScaler y KMeans tienen métodos similares

  • Con StandardScaler: fit() / transform()

  • Con KMeans: fit() / predict()

Aprendizaje no supervisado en Python

StandardScaler y luego KMeans

  • Dos pasos: StandardScaler y luego KMeans

  • Usa un pipeline de sklearn para combinarlos

  • Los datos fluyen de un paso al siguiente

Aprendizaje no supervisado en Python

Los pipelines combinan pasos múltiples

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
scaler = StandardScaler()
kmeans = KMeans(n_clusters=3)

from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(scaler, kmeans)
pipeline.fit(samples)
Pipeline(steps=...)
labels = pipeline.predict(samples)
Aprendizaje no supervisado en Python

Estandarizar mejora el clustering

Con estandarización de características:

varieties  Barbera  Barolo  Grignolino
labels                                
0                0      59           3
1               48       0           3
2                0       0          65

Sin estandarizar las características fue muy malo:

varieties  Barbera  Barolo  Grignolino
labels                                
0               29      13          20
1                0      46           1
2               19       0          50
Aprendizaje no supervisado en Python

Pasos de preprocesamiento en sklearn

  • StandardScaler es un paso de «preprocesamiento»

  • MaxAbsScaler y Normalizer son otros ejemplos

Aprendizaje no supervisado en Python

¡Vamos a practicar!

Aprendizaje no supervisado en Python

Preparing Video For Download...