数据分析——聚类部分知识复习

构建并评价聚类模型

聚类分析:
即在没有给定类别标签的情况下根据数据的相似度进行样本分组。将无标签标记的数据聚集为多个簇,每个簇就是一类,是一种非监督学习的方法。

应用:
从消费者数据库中区分出不同的消费群体,并概括出每一类消费者的消费习惯或者模式;
也可作为数据分析算法中其他分析算法的一个预处理步骤,如异常值识别、连续特征离散化等。

使用sklearn估计器构建K-Means聚类模型

  • 聚类划分原则:
    组内举例最小化,组间举例最大化。

  • 常用的聚类方法:
    有那么五六种。
    在这里插入图片描述
    在这里插入图片描述

  • 常用的聚类分析算法:

算法名称算法描述
K-MeansK-均值聚类也称为快速聚类法,在最小误差函数的基础上将数据划分为预定的类数K,适用于处理大量数据。
K-中心点K-中心点算法不采用簇对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心。
系统聚类只适合小数据量时使用,大数据量时速度很慢。
  • sklenrn.cluster中包含的聚类算法及适用范围:
    有那么六种。
    在这里插入图片描述
    这些不同模型的使用方法是大同小异的,基本都是先用对应的函数简历模型,然后用.fit()方法来训练模型,训练好之后,就可以用.label_的方法给出样本数据的标签,或者是可以用.predict的方法预测新的输入的标签。

此外,Scipy库也提供了一个聚类子库scipy.cluster,里边提供了一些聚类算法,如层次聚类,但没有sklearn那么全面。

  • 聚类算法实现需要sklearn的估计器,该估计其有两个方法:fitpredict
    fit:主要用于训练算法。可接收有监督学习的训练集及其标签两个参数,也可接受无监督学习的数据。
    predict:用于预测有监督学习的测试集标签,也可以用于划分无监督学习传入数据的类别。

  • 使用sklearn估计器构建k-means聚类模型

#构建聚类模型
from sklearn.datasets import load_iris
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans

iris = load_iris()
iris_data = iris['data']
iris_target = iris['target']#标签,之后可能将预测的和原始的标签比较看是否预测正确
iris_names = iris['target_names']  #有啥用?

scale = MinMaxScaler().fit(iris_data)#训练数据标准化规则
iris_dataScale = scale.transform(iris_data)#应用规则

kmeans = KMeans(n_clusters = 3, random_state=123).fit(iris_dataScale)#训练kmeans聚类规则
print("构建的K-Means模型为:\n", kmeans)
  • 用预构建的模型预测一下:
    在这里插入图片描述
#通过鸢尾花的特征预测其所属的类别
print("请输入你要预测的鸢尾花的特征:\n")
a = input("花瓣长度:")
b = input("花瓣宽度:")
c = input("花萼长度:")
d = input("花萼宽度:")

result = kmeans.predict([[a, b, c, d]])#预测规则
print("你的花预测其类别为:", result[0])
  • 聚类结果可视化
    通过sklearn的manifold模块中的TSNE函数可以实现多维数据的可视化展现。
    TSNE: T分布随机邻居嵌入。本质是一种降维和可视化的技术。
    可视化kmeans聚类结果的过程:
    1)先将原始数据data降维,降成几维自己决定,将降维后的数据(tsne.bedding_)转换成DataFrame的格式,方便之后画图;
    2)然后将聚类结果的标签kmeans.labels_新建一列后也存储到之前新建的这个DataFrame里。
    3)提取出不同标签下的数据(比如有三类你就提取出三类的DataFrame数据),方便之后画图。
    4)然后就是画图就可以了。
#聚类结果的可视化
import pandas as pd
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

#使用TSNE函数进行数据降维,降成两维
tsne = TSNE(n_components=2, init='random', random_state=177).fit(iris_data)#依然是训练TSNE规则
df = pd.DataFrame(tsne.embedding_)

#提取不同标签的数据
df['labels'] = kmeans.labels_ #在这个降维后的二维数据里增加了一列kmeans聚类结果标签数据
df0 = df[df['labels'] == 0]
df1 = df[df['labels'] == 1]
df2 = df[df['labels'] == 2]

#绘图
fig = plt.figure(figsize=(9,6))
plt.plot(df0[0], df0[1], 'bo', df1[0], df1[1], 'r*', df2[0], df2[1], 'gD', )
plt.show()

在这里插入图片描述

评价聚类模型

评价标准:组内是相似的,组间的差别较大,这样的聚类模型较好。sklearn.metrics模块提供算法评价模型。

模型评价的方法太多了。我们选择适合的就好,掌握几种常见方法即可。

  1. 使用ARI评价法adjusted_rand_score:实现原理是下图公式。metrics.adjusted_rand_score(labels_true, labels_pred),值越接近1越好。
    在这里插入图片描述
#使用ARI指数评价法,值越大越好
from sklearn.metrics import adjusted_rand_score
for i in range(2,7):
    #训练模型
    kmeans = KMeans(n_clusters=i, random_state=123).fit(iris_data)
    #评价
    score = adjusted_rand_score(iris_target, kmeans.labels_)
    print("iris数据聚%d类的adjusted_rand_score指数分值为:%f" %(i, score))
    

在这里插入图片描述
结果:可以看书还是聚三类的ARI指数最大

  1. 使用FMI评价法lowlkes_mallows_score评价聚类模型:测量一组点的两个聚类的相似性,值越接近1越好。
#使用FMI评价法评价聚类模型(测量一组点的两个聚类之间的相似性)
from sklearn.metrics import fowlkes_mallows_score
for i in range(2,7):#聚的类数i使得每次的评分变化
    #训练模型
    kmeans = KMeans(n_clusters = i, random_state=123).fit(iris_data)
    #评价
    score = fowlkes_mallows_score(iris_target, kmeans.labels_)#参数为真实标签值和聚类标签值
    print("iris数据聚%d类的FMI评价分值为:%f" %(i, score))

在这里插入图片描述
结果:可以看出,当参数n_clusters为3的时候,也就是聚成3类的时候,评分最高。

  1. 使用calinski_harabasz指数calinski_harabasz_score评价法:计算Calinski和Harabasz分数。,值越大越好。
    原理:如公式所示。
    在这里插入图片描述
    其中,n表示聚类的数目 ,k 表示当前的类, trB(k)表示类间离差矩阵的迹, trW(k) 表示类内离差矩阵的迹。有关公式更详细的解释可参考论文“ A dendrite method for cluster analysis ”。可以得出 CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。
#使用calinski_harabasz指数评价法,值越大越好
from sklearn.metrics import calinski_harabaz_score
for i in range(2,7):
    #训练模型
    kmeans = KMeans(n_clusters=i, random_state=123).fit(iris_data)
    #评价
    score = calinski_harabaz_score(iris_data, kmeans.labels_)
    print("iris数据聚%d类的calinski_harabasz指数分值为:%f" %(i, score))
    

我的calinski_harabaz_score报错了,ImportError: cannot import name 'calinski_harabaz_score',估计又是版本的问题~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值