通过特征变换提升聚类效果

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 中的无监督学习

相似的方法

  • StandardScalerKMeans 的方法类似

  • StandardScalerfit() / transform()

  • KMeansfit() / predict()

Python 中的无监督学习

先 StandardScaler,后 KMeans

  • 需要两步:先 StandardScaler,再 KMeans

  • sklearn 的 pipeline 组合多步

  • 数据按顺序在各步间传递

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 属于"预处理"步骤

  • 其他示例:MaxAbsScalerNormalizer

Python 中的无监督学习

Vamos praticar!

Python 中的无监督学习

Preparing Video For Download...