zoukankan      html  css  js  c++  java
  • Sklearn K均值聚类

    版权所有,转帖注明出处


    章节


    到目前为止,我们已经非常深入地了解了数据集,并且把它分成了训练子集与测试子集。

    接下来,我们将使用聚类方法训练一个模型,然后使用该模型来预测测试子集的标签,最后评估该模型的性能。

    聚类(clustering)是在一组未标记的数据中,将相似的数据(点)归到同一个类别中的方法。聚类与分类的最大不同在于分类的目标事先已知,而聚类则不知道。K均值聚类是聚类中的常用方法,它是基于点与点的距离来计算最佳类别归属,即靠得比较近的一组点(数据)被归为一类,每个聚类都有一个中心点。

    我们首先创建聚类模型,对训练子集进行聚类处理,得到聚类中心点。然后使用模型预测测试子集的标签,预测时根据测试子集中的点(数据)到中心点的距离来进行分类。

    创建模型

    示例

    创建聚类模型。

    import numpy as np
    from sklearn import datasets
    
    # 加载 `digits` 数据集
    digits = datasets.load_digits()
    
    from sklearn.preprocessing import scale
    
    # 对`digits.data`数据进行标准化处理
    data = scale(digits.data)
    
    # print(data)
    
    # 导入 `train_test_split`
    from sklearn.model_selection import train_test_split
    
    # 数据分成训练集和测试集
    # `test_size`:如果是浮点数,在0-1之间,表示测试子集占比;如果是整数的话就是测试子集的样本数量,`random_state`:是随机数的种子
    X_train, X_test, y_train, y_test, images_train, images_test = train_test_split(data, digits.target, digits.images, test_size=0.33, random_state=42)
    
    # 导入“cluster”模块
    from sklearn import cluster
    
    # 创建KMeans模型
    clf = cluster.KMeans(init='k-means++', n_clusters=10, random_state=42)
    
    # 将训练数据' X_train '拟合到模型中,此处没有用到标签数据y_train,K均值聚类一种无监督学习。
    clf.fit(X_train)
    

    cluster.KMeans的参数说明:

    • init='k-means++' - 指定初始化方法
    • n_clusters=10 - 聚类数量,分成10个类别
    • random_state=42 - 随机值种子

    我们利用K均值聚类方法创建一个模型后,得到了每个聚类的中心点,测试时,可以根据测试子集中的点(数据)到中心点的距离来进行分类。

    可以使用下面方法显示聚类中心点图像:

    
    # 导入 matplotlib
    import matplotlib.pyplot as plt
    
    # 图形尺寸(英寸)
    fig = plt.figure(figsize=(8, 3))
    
    # 添加标题
    fig.suptitle('Cluster Center Images', fontsize=14, fontweight='bold')
    
    # 对于所有标签(0-9)
    for i in range(10):
        # 在一个2X5的网格中,在第i+1个位置初始化子图
        ax = fig.add_subplot(2, 5, 1 + i)
        # 显示图像
        ax.imshow(clf.cluster_centers_[i].reshape((8, 8)), cmap=plt.cm.binary)
        # 不要显示坐标轴
        plt.axis('off')
    
    # 显示图形
    plt.show()
    
    

    显示

    图

    测试模型

    接下来预测测试子集的标签:

    # 预测“X_test”的标签
    y_pred=clf.predict(X_test)
    
    # 打印出' y_pred '的前100个实例
    print(y_pred[:100])
    
    # 打印出' y_test '的前100个实例
    print(y_test[:100])
    

    输出

    [0 3 3 6 8 9 8 9 8 8 4 2 7 1 2 4 3 7 3 8 2 8 3 7 4 0 3 8 0 3 2 3 9 2 2 0 3
     2 7 0 0 3 4 3 0 4 3 1 0 3 7 4 3 8 0 1 3 1 1 2 1 2 3 8 2 3 7 1 7 3 3 3 3 7
     7 1 2 8 3 3 3 1 8 3 3 1 0 2 2 3 4 9 4 3 3 9 3 2 2 7]
    [6 9 3 7 2 1 5 2 5 2 1 9 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
     4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 9 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
     7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4]
    

    在上面的代码块中,预测测试集的标签,结果存储在y_pred中。然后打印出y_pred和y_test的前100个实例。可以看出模型预测的准确率并不高。

    评估模型

    接下来,我们将进一步对模型的性能进行评估,分析模型预测的正确性。

    让我们打印一个混淆矩阵:

    # 从“sklearn”导入“metrics”
    from sklearn import metrics
    
    # 用“confusion_matrix()”打印出混淆矩阵
    print(metrics.confusion_matrix(y_test, y_pred))
    

    输出

    [[ 0 54  1  0  0  0  0  0  0  0]
     [ 0  0 15  0 29  0  0  0  0 11]
     [ 1  0  2  0  7  0  0  0 27 15]
     [ 0  0  0 49  1  0  0  4  1  1]
     [ 0  0 57  0  0  0  3  4  0  0]
     [ 1  0  2 34  6  0  0  5 25  0]
     [56  1  0  0  0  0  0  0  0  0]
     [ 0  0  0  0  0  0  5 55  2  0]
     [ 0  0  0 18 28  0  0  2  4  0]
     [ 1  0  5 55  2  0  1  4  0  0]]
    

    混淆矩阵

    混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示,每一列代表预测值,每一行代表实际的类别。混淆矩阵对角线上的值表示预测值匹配数,其他位置表示错配的数量。例如第一行第二列是54,表示实际值是分类0,但预测值是分类1的错误预测发生了54次。

    可以看出模型预测的准确率并不高:数字3预测对了49次,数字7预测对了55次,其他的都很低。

    让我们继续打印一些常用的评估指标:

    from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score, adjusted_rand_score, adjusted_mutual_info_score, silhouette_score
    print('% 9s' % 'inertia    homo   compl  v-meas     ARI AMI  silhouette')
    print('%i   %.3f   %.3f   %.3f   %.3f   %.3f    %.3f'
              %(clf.inertia_,
          homogeneity_score(y_test, y_pred),
          completeness_score(y_test, y_pred),
          v_measure_score(y_test, y_pred),
          adjusted_rand_score(y_test, y_pred),
          adjusted_mutual_info_score(y_test, y_pred),
          silhouette_score(X_test, y_pred, metric='euclidean')))
    

    输出:

    inertia    homo   compl  v-meas     ARI AMI  silhouette
    48486   0.584   0.662   0.621   0.449   0.572    0.131
    
    • homogeneity_score 同质性指标,每个群集只包含单个类的成员。
    • completeness_score 完整性指标,给定类的所有成员都分配给同一个群集。
    • v_measure_score 同质性指标与完整性指标的调和平均。
    • adjusted_rand_score 调整兰德指数
    • adjusted_mutual_info_score 调整互信息
    • silhouette_score 轮廓系数

    关于这些指标的详情,限于篇幅,不再赘述,你可以参考相关资料。

  • 相关阅读:
    .NET Core开发的iNeuOS物联网平台部署在Ubuntu操作系统,无缝跨平台。助力《2019 中国.NET 开发者峰会》。
    iNeuOS 物联网云操作系统2.0发布,集成设备容器、视图建模、机器学习三大模块
    .Net for Spark 实现 WordCount 应用及调试入坑详解
    实际项目中,看 ECharts 和 HighCharts 渲染性能对比,表面看衣装,本质看内功!!!
    iNeuOS云操作系统,.NET Core全系打造
    《ServerSuperIO Designer IDE使用教程》- 7.增加机器学习算法,通讯采集数据与算法相结合。发布:4.2.5 版本
    《ServerSuperIO Designer IDE使用教程》- 6.增加与阿里云物联网(IOT)对接服务,实现数据交互。发布:v4.2.4 版本
    《ServerSuperIO Designer IDE使用教程》- 5.树形结构管理设备驱动,小版本更新。发布:v4.2.3.1版本
    《ServerSuperIO Designer IDE使用教程》-4.增加台达PLC驱动及使用教程,从0到1的改变。发布:v4.2.3版本
    物联网框架ServerSuperIO.Core(.netcore)跨平台,一套设备驱动通吃嵌入式、上位机、云服务
  • 原文地址:https://www.cnblogs.com/jinbuqi/p/11444654.html
Copyright © 2011-2022 走看看