为聚类命名
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 46 课,共 51 课。
簇只有编号,没有名称。现在你可以使用标签:交叉表会统计每个簇中各个数字的数量,例如这 3 个簇中的 1、7 和 9:
用最常见的数字为每个簇命名。扫描结果中属于该数字的,都算作命名正确:
ct = pd.crosstab(km.labels_, y)
names = ct.idxmax(axis=1) # 每行值最大的那一列
right = ct.max(axis=1).sum()
print(names.tolist(), right)这会输出 [9, 7, 1] 496:在 541 次扫描中,有 496 次扫描被正确命名,这些扫描按组查找,过程中没有使用任何标签。
挑战
中等为你的 10 个簇命名。起始代码中有 km,它是在没有标签的情况下拟合的;现在你可以使用 y 中的数字。
- 将这些簇与
y交叉统计,并用每个簇中最常见的数字为它命名。 - 按名称顺序,打印每个簇中正确命名的扫描数量、簇的大小,以及正确命名扫描所占的比例,百分比取整数。
- 打印整体正确命名的扫描数量,百分比保留 1 位小数。
对于 5 个簇:
Cluster named 0: 175 of 177 scans (99%)
Cluster named 2: 160 of 367 scans (44%)
Cluster named 3: 168 of 531 scans (32%)
Cluster named 6: 179 of 359 scans (50%)
Cluster named 7: 176 of 363 scans (48%)
Named right without labels: 858 of 1797 scans (47.7%)你的哪个簇最弱?其中藏着什么?
亲手试试
import pandas as pd
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
# 来自 Look at the Digits:1,797 张扫描图,每张有 64 个像素,墨迹值从 0 到 16。
digits = load_digits()
X = digits.data
y = digits.target
# 来自 Shrink with PCA:每张扫描图用 13 个数字保留 80% 的方差。
pca = PCA(n_components=0.8)
X_small = pca.fit_transform(X)
# 来自 Cluster the Digits:不使用标签,找出 10 个簇。
km = KMeans(n_clusters=10, n_init=10, random_state=0).fit(X_small)
# 在下方编写你的代码。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器