Python 中的无监督学习
Benjamin Wilson
Director of Research at lateral.io
178 个样本,来自 3 种红酒:Barolo、Grignolino、Barbera
特征为化学成分测量,如酒精含量
以及外观属性,如"颜色强度"
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
labels = model.fit_predict(samples)
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
葡萄酒特征的方差差异很大!
特征的方差度量其取值的离散程度
feature variance
alcohol 0.65
malic_acid 1.24
...
od280 0.50
proline 99166.71

葡萄酒特征的方差差异很大!
特征的方差度量其取值的离散程度
feature variance
alcohol 0.65
malic_acid 1.24
...
od280 0.50
proline 99166.71

在 kmeans 中:特征方差 = 特征影响力
StandardScaler 将每个特征变换为均值 0、方差 1
此称为"标准化"

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaler.fit(samples) StandardScaler(copy=True, with_mean=True, with_std=True)samples_scaled = scaler.transform(samples)
StandardScaler 与 KMeans 的方法类似
StandardScaler 用 fit() / transform()
KMeans 用 fit() / predict()
需要两步:先 StandardScaler,再 KMeans
用 sklearn 的 pipeline 组合多步
数据按顺序在各步间传递
from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans scaler = StandardScaler() kmeans = KMeans(n_clusters=3)from sklearn.pipeline import make_pipelinepipeline = make_pipeline(scaler, kmeans)pipeline.fit(samples)
Pipeline(steps=...)
labels = pipeline.predict(samples)
含特征标准化:
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
StandardScaler 属于"预处理"步骤
其他示例:MaxAbsScaler、Normalizer
Python 中的无监督学习