13.3 聚类实战:手写数字聚类
手写数字聚类实战:Scikit-learn无监督学习教程
通过实战教程,学习使用Scikit-learn进行手写数字聚类,包括数据解析、预处理、降维、算法训练和效果评估,探索无监督学习的评估难点。
推荐工具
聚类实战:手写数字聚类
欢迎来到Scikit-learn高级教程的聚类实战章节!在本教程中,我们将一起探索如何使用Scikit-learn进行手写数字的聚类分析。这是一个经典的机器学习项目,涉及高维图像数据,我们将从需求解析到最终评估,一步步带你完成整个过程。内容设计为简单易懂,适合新手入门。
项目需求与数据解析(高维图像数据)
项目需求:
- 使用无监督学习(聚类)对图像数据进行分组。
- 数据集:Scikit-learn自带的
digits数据集,包含手写数字的8x8像素图像。 - 目标:在不知道真实标签的情况下,通过聚类算法发现数字的分组模式,评估与真实标签的吻合度。
数据解析:
digits数据集是一个高维数据集,每个样本由64个像素值组成(8x8图像)。- 这是一个无标签数据集,但我们可以使用真实标签作为评估基准(例如,数字0-9)。
- 代码示例:
from sklearn import datasets import numpy as np # 加载数据集 digits = datasets.load_digits() X = digits.data # 特征数据(64维) y = digits.target # 真实标签(用于评估) print(f"数据集形状:{X.shape},标签数:{len(np.unique(y))}")- 解释:X是64维特征矩阵,y是真实数字标签。
数据预处理(归一化)与降维(PCA)
数据预处理:
- 归一化(标准化)是关键步骤,因为它能确保不同尺度的特征(像素值)在聚类中具有同等重要性。
- 使用
StandardScaler进行标准化:from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) print(f"标准化后数据形状:{X_scaled.shape}")
降维(PCA):
- 高维数据(如64维)可能导致“维度的诅咒”,降维有助于可视化和改善聚类效果。
- 主成分分析(PCA)是常用方法:
from sklearn.decomposition import PCA pca = PCA(n_components=2) # 降到2维以便可视化 X_pca = pca.fit_transform(X_scaled) print(f"PCA降维后数据形状:{X_pca.shape}")- 解释:n_components=2保留了数据的主要变化,方便后续绘图查看聚类结果。
聚类算法训练(KMeans/DBSCAN)
KMeans聚类:
- KMeans是基于距离的聚类算法,需要指定聚类数K(这里设为10,对应数字0-9)。
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=10, random_state=42) kmeans_labels = kmeans.fit_predict(X_pca) print(f"KMeans聚类标签示例:{kmeans_labels[:5]}")- 解释:random_state确保可重复性,fit_predict训练模型并分配聚类标签。
DBSCAN聚类:
- DBSCAN是基于密度的算法,不需要指定聚类数,但需调整eps和min_samples参数。
from sklearn.cluster import DBSCAN dbscan = DBSCAN(eps=0.5, min_samples=5) dbscan_labels = dbscan.fit_predict(X_pca) print(f"DBSCAN聚类标签示例:{dbscan_labels[:5]}")- 解释:eps控制邻域半径,min_samples定义核心点。注意,DBSCAN可能标记噪声点(-1)。
聚类效果评估(轮廓系数、ARI)
轮廓系数(Silhouette Score):
- 衡量聚类的内聚度和分离度,值越接近1表示聚类越好。
from sklearn.metrics import silhouette_score # KMeans评估 silhouette_kmeans = silhouette_score(X_pca, kmeans_labels) print(f"KMeans轮廓系数:{silhouette_kmeans:.2f}") # DBSCAN评估(排除噪声点) # 只对非噪声点计算 dbscan_no_noise = dbscan_labels[dbscan_labels != -1] X_pca_no_noise = X_pca[dbscan_labels != -1] if len(dbscan_no_noise) > 1: # 确保有足够数据点 silhouette_dbscan = silhouette_score(X_pca_no_noise, dbscan_no_noise) print(f"DBSCAN轮廓系数:{silhouette_dbscan:.2f}")
调整兰德指数(Adjusted Rand Index, ARI):
- ARI比较聚类标签和真实标签的相似度,越接近1表示与真实分布越吻合。
from sklearn.metrics import adjusted_rand_score # KMeans评估 ari_kmeans = adjusted_rand_score(y, kmeans_labels) print(f"KMeans ARI:{ari_kmeans:.2f}") # DBSCAN评估(真实标签y需要与聚类标签对应) ari_dbscan = adjusted_rand_score(y[dbscan_labels != -1], dbscan_no_noise) print(f"DBSCAN ARI:{ari_dbscan:.2f}")- 注意:ARI依赖于真实标签,在无监督学习中常用于基准评估。
项目总结:无监督学习的评估难点
在无监督学习中,评估聚类效果是一个挑战,因为:
- 缺少真实标签:不像监督学习有明确目标,聚类评估常依赖于内在指标(如轮廓系数)或外部基准(如ARI,但需先验知识)。
- 评估指标的主观性:例如,轮廓系数可能对聚类形状敏感,而ARI假设真实标签已知,在真实应用中不可用。
- 参数选择困难:如KMeans的K值或DBSCAN的eps,通常需要结合业务知识或多轮试验。
实用建议:
- 结合多种评估方法(如轮廓系数和可视化)。
- 在实际项目中,考虑领域专家反馈来调整聚类。
- 利用降维(如PCA)简化数据和可视化,帮助理解聚类结果。
通过本教程,你学会了如何从高维数据开始,一步步预处理、降维、训练聚类算法,并评估效果。继续练习,提高你的Scikit-learn技能!
开发工具推荐