构建并评价聚类模型
聚类分析:
即在没有给定类别标签的情况下根据数据的相似度进行样本分组。将无标签标记的数据聚集为多个簇,每个簇就是一类,是一种非监督学习的方法。
应用:
从消费者数据库中区分出不同的消费群体,并概括出每一类消费者的消费习惯或者模式;
也可作为数据分析算法中其他分析算法的一个预处理步骤,如异常值识别、连续特征离散化等。
使用sklearn估计器构建K-Means聚类模型
-
聚类划分原则:
组内举例最小化,组间举例最大化。 -
常用的聚类方法:
有那么五六种。
-
常用的聚类分析算法:
算法名称 | 算法描述 |
---|---|
K-Means | K-均值聚类也称为快速聚类法,在最小误差函数的基础上将数据划分为预定的类数K,适用于处理大量数据。 |
K-中心点 | K-中心点算法不采用簇对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心。 |
系统聚类 | 只适合小数据量时使用,大数据量时速度很慢。 |
sklenrn.cluster
中包含的聚类算法及适用范围:
有那么六种。
这些不同模型的使用方法是大同小异的,基本都是先用对应的函数简历模型,然后用.fit()方法来训练模型,训练好之后,就可以用.label_的方法给出样本数据的标签,或者是可以用.predict的方法预测新的输入的标签。
此外,Scipy库也提供了一个聚类子库scipy.cluster,里边提供了一些聚类算法,如层次聚类,但没有sklearn那么全面。
-
聚类算法实现需要sklearn的估计器,该估计其有两个方法:
fit
和predict
。
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
模块提供算法评价模型。
模型评价的方法太多了。我们选择适合的就好,掌握几种常见方法即可。
- 使用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指数最大
- 使用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类的时候,评分最高。
- 使用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'
,估计又是版本的问题~