今天给大家介绍一个聚类和降维结合的项目,分为两块内容:
-
直接使用原数据,经过数据预处理和编码后,基于原生的K-Means和PCA/T-SNE实现用户的聚类
-
使用基于Transformer的预训练模型转换后的高维数据,再使用K-Means和PCA/T-SNE实现用户的聚类
本文先介绍第一种方案的完整过程。
1 项目导图
整个项目的导图:
2 导入库
In 1:
3 读取数据
In 2:
数据的探索性分析过程,了解数据基本信息:
In 3:
Out3:
In 4:
Out4:
In 5:
Out5:
In 6:
Out6:
In 7:
Out7:
结果表明数据中没有缺失值。
In 8:
4 数据预处理Preprocessing
主要是针对分类型的数据进行编码工作:
In 9:
In 10:
Out10:
设定数据预处理器:
In 11:
5 创建pipeline
In 12:
In 13:
Out13:
In 14:
Out14:
6 异常处理(ECOD)
基于Python Outlier Detection库进行异常值处理(Kmeans对异常值敏感)。
另外一种方法ECOD(empirical cumulative distribution functions for outlier detection)基于经验累积分布函数的异常值检测方法。
In 15:
Out15:
In 16:
In 17:
In 18:
Out18:
图片
查看数据量:
In 19:
Out19:
In 20:
Out20:
7 聚类建模(K-Means)
7.1 肘图识别k值
聚类过程中的k值如何确定?介绍基于肘图的方法
In 21:
Out21:
我们可以看到k=6的时候是最好的。
7.2 轮廓系数变化
In 22:
不同k值下的轮廓系数对比:
7.3 实施聚类
从结果来说,k=6或者5效果都还OK,在这里我们最终选择k=5进行聚类分群:
In 23:
7.4 评价聚类效果
聚类效果如何评价?常用的三种评价指标:
-
Davies-Bouldin指数
-
Calinski-Harabasz Score
-
Silhouette Score
In 24:
Davies-Bouldin指数
Davies-Bouldin指数是聚类算法的一种评估方法,其值越小则表示聚类结果越好。该指数的原理是通过比较不同聚类簇之间的距离和不同聚类簇内部距离来测量聚类的效果。其计算方法如下:
-
对于每一个聚类簇,计算其中心点(centroid)。
-
计算每个聚类簇内点与其中心点的距离,并求其平均值,得到聚类内部距离(intra-cluster distance)。
-
计算不同聚类簇之间中心点的距离,并求其平均值,得到聚类间距离(inter-cluster distance)。
-
对于每个聚类簇,计算其Davies-Bouldin指数:除该簇外所有其他簇中心点与该簇中心点距离的平均值与该簇内部距离的比值。
-
对所有聚类簇的Davies-Bouldin指数求平均值,得到聚类总体的Davies-Bouldin指数。
通过Davies-Bouldin指数,我们可以比较不同聚类算法、不同参数下的聚类效果,从而选择最佳的聚类方案。Davies-Bouldin指数能够考虑到聚类结果的波动情况,对于相似的聚类结果,其Davies-Bouldin指数较大。因此,Davies-Bouldin指数能够区分不同聚类结果的相似程度。
此外,Davies-Bouldin指数没有假设聚类簇形状和大小的先验知识,因此可以适用于不同聚类场景。
Calinski-Harabasz Score
Calinski-Harabasz Score是一种用于评估聚类质量的指标,它基于聚类中心之间的方差和聚类内部的方差之比来计算。该指数越大,表示聚类效果越好。
Calinski-Harbasz Score是通过评估类之间方差和类内方差来计算得分,具体公式表示为:
其中,代表聚类类别数,代表全部数据数目,是类间方差,是类内方差。
的计算公式:
trace只考虑了矩阵对角上的元素,即类中所有数据点到类的欧几里得距离。
的计算公式为:
其中,是类中所有数据的集合,是类q的质点,是所有数据的中心点,是类数据点的总数。
Silhouette Score
Silhouette Score表示为轮廓系数。
Silhouette Score 是一种衡量聚类结果质量的指标,它结合了聚类内部的紧密度和不同簇之间的分离度。对于每个数据点,Silhouette Score 考虑了以下几个因素:
-
a:数据点到同簇其他点的平均距离(簇内紧密度)
-
b:数据点到最近不同簇的平均距离(簇间分离度)
具体而言,Silhouette Score 计算公式为:
轮廓系数的取值在 -1 到 1 之间,越接近 1 表示聚类效果越好,越接近 -1 则表示聚类结果较差。
In 25:
8 降维(基于Prince.PCA)
参考官网学习地址:https://github.com/MaxHalford/prince
8.1 降维函数
In 26:
8.2 降维可视化
下面是基于2个主成分的可视化绘图函数:
In 27:
下面是基于3个主成分的可视化绘图函数:
In 28:
8.2.1 2维
下面是2维可视化的效果:
In 29:
In 30:
可以看到聚类效果并不是很好,数据并没有隔离开。
8.2.2 3维
下面是3维可视化的效果:
In 31:
In 32:
从结果中看到,聚类效果并不是很好,样本并没有分离开。
前面3个主成分的占比总共为27.98%,不足以捕捉到原始的数据信息和模式。下面介绍基于T-SNE的降维,该方法主要是用于高维数据的降维可视化:
9 降维优化(基于T-SNE)
取出部分样本
In 33:
Out33:
9.1 实施2D降维
9.1.1 降维
In 34:
In 35:
In 36:
9.1.2 可视化
In 37:
9.2 实施3D降维
9.2.1 降维
对聚类后的结果实施T-SNE降维:
In 38:
In 39:
In 40:
9.2.2 降维结果可视化
In 41:
对比两种降维方法在二维效果上的比较:很明显,T-SNE的效果好很多~
10 基于LGBMClassifer的分类
将无异常的原始数据df_no_outliers作为特征X,聚类后的标签clusters_predict作为目标标签y,建立一个LGBMClassifer分类模型:
10.1 建立模型
In 42:
Out42:
LGBMClassifier
10.2 shap可视化
In 43:
从结果中可以看到,age字段是最为重要的。
10.3 模型预测
In 44:
In 45:
10.4 聚合结果
In 46:
以聚类的簇结果cluster为分组字段:
-
统计数值型字段的均值(mean)
-
分类型字段的最高频数字段(分组后的第一个数据信息)
In 47:
Out47:
|
| cluster | job | marital | education | housing | loan | age | balance | default | | — | — | — | — | — | — | — | — | — | — | | 0 | 4 | technician | single | secondary | yes | no | 32.069740 | 794.696306 | no | | 1 | 2 | blue-collar | married | secondary | yes | no | 34.569409 | 592.025644 | no | | 2 | 3 | management | married | secondary | yes | no | 42.183012 | 7526.310217 | no | | 3 | 0 | management | married | tertiary | no | no | 43.773960 | 872.797951 | no | | 4 | 1 | blue-collar | married | secondary | no | no | 50.220989 | 836.407504 | no |
如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料