Трансформація ознак для кращого кластеризування

Наглядове навчання в Python

Benjamin Wilson

Director of Research at lateral.io

Набір даних вин П'ємонту

  • 178 зразків із 3 сортів червоного вина: Barolo, Grignolino і Barbera

  • Ознаки вимірюють хімічний склад, напр., вміст алкоголю

  • Візуальні властивості, як-от «інтенсивність кольору»

1 Source: https://archive.ics.uci.edu/ml/datasets/Wine
Наглядове навчання в Python

Кластеризація вин

from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
labels = model.fit_predict(samples)
Наглядове навчання в Python

Кластери vs. сорти

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
Наглядове навчання в Python

Дисперсії ознак

  • Ознаки вина мають дуже різні дисперсії!

  • Дисперсія ознаки вимірює розкид її значень

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

Точкова діаграма: змінна od280 проти змінної malic_acid

Наглядове навчання в Python

Дисперсії ознак

  • Ознаки вина мають дуже різні дисперсії!

  • Дисперсія ознаки вимірює розкид її значень

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

Точкова діаграма: змінна od280 проти номера спостереження

Наглядове навчання в Python

StandardScaler

  • У kmeans: дисперсія ознаки = її вплив

  • StandardScaler перетворює кожну ознаку до середнього 0 і дисперсії 1

  • Такі ознаки називають «стандартизованими»

Точкова діаграма: стандартизовані od280 проти стандартизованої proline

Наглядове навчання в 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)
Наглядове навчання в Python

Схожі методи

  • StandardScaler і KMeans мають схожі методи

  • З StandardScaler використовуйте fit() / transform()

  • З KMeans використовуйте fit() / predict()

Наглядове навчання в Python

Спочатку StandardScaler, потім KMeans

  • Потрібні два кроки: StandardScaler, потім KMeans

  • Скористайтесь конвеєром sklearn, щоб об'єднати кілька кроків

  • Дані передаються з одного кроку до наступного

Наглядове навчання в Python

Конвеєри об'єднують кілька кроків

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)
Наглядове навчання в Python

Стандартизація ознак покращує кластеризацію

За стандартизації ознак:

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

Без стандартизації було дуже погано:

varieties  Barbera  Barolo  Grignolino
labels                                
0               29      13          20
1                0      46           1
2               19       0          50
Наглядове навчання в Python

Кроки передобробки в sklearn

  • StandardScaler — крок «передобробки»

  • Інші приклади: MaxAbsScaler і Normalizer

Наглядове навчання в Python

Давайте потренуємось!

Наглядове навчання в Python

Preparing Video For Download...