Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

13.3 聚类实战:手写数字聚类

手写数字聚类实战:Scikit-learn无监督学习教程

Scikit-learn 中文教程

通过实战教程,学习使用Scikit-learn进行手写数字聚类,包括数据解析、预处理、降维、算法训练和效果评估,探索无监督学习的评估难点。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

聚类实战:手写数字聚类

欢迎来到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依赖于真实标签,在无监督学习中常用于基准评估。

项目总结:无监督学习的评估难点

在无监督学习中,评估聚类效果是一个挑战,因为:

  1. 缺少真实标签:不像监督学习有明确目标,聚类评估常依赖于内在指标(如轮廓系数)或外部基准(如ARI,但需先验知识)。
  2. 评估指标的主观性:例如,轮廓系数可能对聚类形状敏感,而ARI假设真实标签已知,在真实应用中不可用。
  3. 参数选择困难:如KMeans的K值或DBSCAN的eps,通常需要结合业务知识或多轮试验。

实用建议

  • 结合多种评估方法(如轮廓系数和可视化)。
  • 在实际项目中,考虑领域专家反馈来调整聚类。
  • 利用降维(如PCA)简化数据和可视化,帮助理解聚类结果。

通过本教程,你学会了如何从高维数据开始,一步步预处理、降维、训练聚类算法,并评估效果。继续练习,提高你的Scikit-learn技能!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包