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 轮廓系数

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

  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/jinbuqi/p/11444654.html
Copyright © 2011-2022 走看看