聚类前进行缩放
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 9 课,共 51 课。
K-means 根据距离进行分组,因此数值范围最大的单位会起主导作用。用体重(克)和年龄(年)对收容所里的猫进行分组:500 克的差距会盖过 10 年的差距。
先进行标准化,就像 k-NN 一样,这样每个特征的权重相同:
X_scaled = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X_scaled)make_pipeline(StandardScaler(), KMeans(...)) 可以在一个模型中完成这两步。然后用实际单位读取每个组:对其原始行求平均值,X[km.labels_ == c].mean(axis=0)。
挑战
简单一款找房应用按租金和到车站的距离对 100 套房源进行分组。初始代码直接对原始列进行聚类,结果所有组到车站的距离都在 3 km 左右:美元数值远大于公里数值。
- 使用
StandardScaler对这两列进行缩放。 - 改为对缩放后的行进行聚类。保留报告代码:它会用实际单位显示每个组的数据。
换一座城市时:
38 flats: $1820 a month, 0.9 km out
33 flats: $1130 a month, 4.2 km out
29 flats: $2760 a month, 1.5 km out亲手试试
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 每套公寓占一行:月租以美元计,到车站的距离以 km 计
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]
# 这里直接用原始列进行聚类:请修正
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)
# 按实际单位输出每组的数据,人数最多的组排在前面
sizes = pd.Series(km.labels_).value_counts()
for c in sizes.index:
group = flats[km.labels_ == c]
print(f"{sizes[c]} flats: ${round(group['rent'].mean())} a month, {group['station_km'].mean():.1f} km out")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器