kscorer实现最优K-means聚类自动选择

来源:我得学城
本文约3200字,建议阅读7分钟
本文介绍自动化的k值选择方法。
在Kmeans聚类算法当中,精准确定聚类数量K值一直是一件棘手的问题。
本文来源:
https://towardsdatascience.com/precision-clustering-made-simple-kscorers-guide-to-auto-selecting-optimal-k-means-clusters-51fb39fde44c
1. 介绍
无监督机器学习,特别是聚类(clustering)对各种实际业务分析项目至关重要。但是,部分聚类算法需要设置聚类的数量,这是聚类算法的重要挑战之一。
通常,在处理数据时,使用迭代方法来决定最优簇群的数量。这意味着我们要多次进行聚类,每次使用不同数量的集群,并评估相应的结果。虽然这种技术很有用,但它也有局限性。
yellowbrick是一个常用的工具,可以轻松识别最优集群的数量。然而,它也有一些缺点。一个重要的缺点是在评估多个指标时可能出现相互冲突的结果以及在图表上识别肘部(elbow)的挑战。
此外,无论使用哪个软件包,数据集的大小都会带来另一个问题。当处理大型数据集时,资源消耗困难可能会妨碍我们有效地进行迭代。如果是这种情况,考虑诸如MiniBatchKMeans之类的技术,它可以提供并行聚类。
MiniBatchKMeans 是一种 K-means 聚类算法的变体,它是 K-means 的一种加速版本。K-means 是一种无监督学习算法,用于将数据集划分为 k 个不同的组(簇),使得每个数据点都属于最接近的簇的中心。而 MiniBatchKMeans 在大规模数据集上执行 K-means 聚类时,通过随机抽取小批量(mini-batch)样本进行迭代训练,从而降低计算成本。
但是,聚类程序的高级优化可能需要一些鲜为人知的技术,下面将进一步介绍。并且,还将了解kscorer软件包,它简化了这些技术,为确定最佳聚类数量提供了更强大、更高效的方法。
聚类的高级优化技术包括:
-
降维:在应用聚类算法之前,对数据执行主成分分析(PCA)可能是有益的。这将减少数据干扰,导致更可靠的聚类过程。
-
余弦相似性:可以通过对数据应用欧几里德归一化来以(近似)余弦距离的方式使用K-means。这样,就不需要预先计算距离矩阵,例如在执行凝聚聚类时。
-
多指标评估:为了找到最优的集群数量,应依赖于多指标评估,而不是依赖于单一指标。
-
数据抽样:为了解决资源消耗问题并改善聚类结果,可以从数据中获取随机样本进行聚类操作和评估指标。从多次迭代中平均得分可以减少随机性的影响,产生更一致的结果。
下面是这个工作流的图示。
幸运的是,并不需要从头开始构建整个流程,因为kscorer软件包中已经有了这个实现。
移步 https://pypi.org/project/kscorer/
2. 深入理解
在进行聚类之前建议对数据进行缩放(scale),以确保所有特征都处于相同的水平。标准化Standardisation (以均值为中心,按标准差缩放)或最小-最大缩放Min-Max scaling (将值缩放到指定范围)是用于缩放的常见技术。
通过z-分数(z-score)标准化对特征进行标准化,确保所有特征都在相同的尺度上,防止任何一个特征由于其幅度(magnitude)而在模型调整中占主导地位。这种缩放过程可以显著影响模型的性能。
此外,K均值聚类(K-means clustering)和主成分分析(PCA)之间存在根本联系,这在Ding和He的论文《通过主成分分析进行K均值聚类》中得到了探讨。
https://ranger.uta.edu/~7Echqding/papers/KmeansPCA1.pdf
尽管最初用于不同的目的,但这些技术最终都旨在以最小的重构误差有效表示数据。PCA旨在将数据向量表示为少量特征向量的组合。相比之下,K-means聚类旨在将数据向量表示为聚类中心向量的组合。这两种方法都致力于最小化均方重构误差。
在应用PCA之后,由于可能出现计算问题(某些值可能接近零,而其他值可能相当大),我们将再次对数据进行缩放。这是有道理的,因为我们已经丢失了我们最初的特征(在PCA之后),所以将无法解释数据。
可能不常为人知的另一个有趣的相关性是余弦相似性和欧氏距离之间的关系。
进一步了解 https://medium.com/ai-for-real/relationship-between-cosine-similarity-and-euclidean-distance-7e283a277dff
当它们可以间接地互换使用时,理解这些度量之间的关系是至关重要的。这种知识在将传统的K均值聚类算法转变为球形K均值聚类算法时具有实际应用,其中余弦相似性是聚类数据的重要度量。正如之前提到的,我们可以通过对数据应用欧氏归一化来“建立”余弦相似性和欧氏距离之间的连接。
在没有真实聚类标签(ground truth cluster labels)的情况下,聚类模型的评估必须依赖于内在度量,而kscorer软件包提供了一套全面的指标,用于评估聚类的质量。这些指标为我们提供了有关被认可的集群之间分离程度的有价值的见解:
-
轮廓系数:通过计算数据点到其所不属于的最近集群的平均距离与每个数据点的平均簇内距离之间的差异来量化集群的分离。结果经过标准化,表达为两者之间的比率,较高的值表示更优越的集群分离。
-
Calinski-Harabasz指数:计算集群间散布与集群内散布的比率。在Calinski-Harabasz测试中得分较高表示更好的聚类性能,表明有明确定义的集群。
-
Davies-Bouldin指数:衡量集群间离散度与集群内离散度的比率,较低的值表示更好的聚类性能和更明显的集群。
-
Dunn指数:通过比较集群间距离(任意两个集群中心之间的最小距离)与集群内距离(簇内任意两点之间的最大距离)来评估集群质量。较高的Dunn指数表示更明确定义的集群。
在软件包中使用的指标的Python计算如下所示:
import numpy as np
from sklearn.metrics import pairwise_distances
def _calculate_dunn_index(data: np.ndarray,
labels: np.ndarray,
centroids: np.ndarray) -> float:
# https://gist.github.com/douglasrizzo/cd7e792ff3a2dcaf27f6
# https://github.com/jqmviegas/jqm_cvi/blob/master/jqmcvi/base.py
# https://python.engineering/dunn-index-and-db-index-cluster-validity-indices-set/
cluster_distances = []
for cluster_label in np.unique(labels):
cluster_points = data[labels == cluster_label]
if len(cluster_points) > 1:
intra_cluster_distances = pairwise_distances(
cluster_points, metric='euclidean', n_jobs=-1)
cluster_distances.append(np.mean(intra_cluster_distances))
inter_cluster_distances = pairwise_distances(
centroids, metric='euclidean', n_jobs=-1)
min_inter_cluster_distance = np.min(
inter_cluster_distances[inter_cluster_distances > 0])
max_intra_cluster_distance = np.max(cluster_distances)
dunn_index = min_inter_cluster_distance / max_intra_cluster_distance
return dunn_index
-
贝叶斯信息准则(BIC):BIC作为额外的并在某种程度上是独立的度量。虽然K均值不提供直接的概率模型,但BIC可以帮助估计应用K均值模型后的数据分布。这种方法提供了对集群质量更全面的评估。
所有这些指标都经过标准化,确保较高的分数始终表示明确定义的集群。这种彻底的评估对于确定数据集中最优集群的数量至关重要。
为了克服内存限制并迅速执行K均值聚类的数据预处理和评分操作,kscorer软件包利用了N个随机数据样本。这种方法确保了无缝执行,并适应不同大小和结构的数据集。类似于交叉验证技术,即使每次迭代都专注于数据的有限子集,它仍然保持了健壮的结果。
3. 亲身体验kscorer
那么,我们有一些用于聚类的数据。请注意,在这种情况下,我们假装不知道确切的集群数量。
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.preprocessing import normalize
from sklearn.metrics import balanced_accuracy_score
from sklearn.model_selection import train_test_split
from kscorer.kscorer import KScorer
from prosphera.projector import Projector
X, y = datasets.load_digits(return_X_y=True)
X.shape
# (1797, 64)
继续前进,我们将把数据集分成训练集和测试集,并拟合一个模型来检测最优的集群数量。该模型将自动搜索在3到15之间的最优集群数量。这可以轻松实现如下:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.15, random_state=1234)
ks = KScorer()
labels, centroids, _ = ks.fit_predict(X_train, retall=True)
完成拟合过程后,我们可以查看所有应用指标的缩放得分。这将帮助我们确定我们可用数据的最佳集群数量。在查看绘图时,您将注意到一些集群以相应的得分突出显示。这些标记点对应于所有指标中平均得分的局部最大值,因此代表选择最优集群数量的最佳选项。
现在,我们可以评估我们的新集群标签与真实标签的匹配程度。请确保在实际业务场景中通常不会有这个选项。
在聚类中采用不曾见过的数据进行聚类是一种不寻常的做法。但请注意,这不是典型的聚类任务。一个不同且通常更有用的策略是使用集群标签制作一个分类器,将集群标签作为目标。这将使得将集群标签分配给新数据变得更容易。
# to make vectors precisely normalized
centroids = normalize(centroids)
labels_unseen = ks.predict(X_test, init=centroids)
y_clustd = pd.Series(labels).replace(dict(enumerate(order)))
y_unseen = pd.Series(labels_unseen).replace(dict(enumerate(order)))
balanced_accuracy_score(y_train, y_clustd)
# 0.7024905027180692
balanced_accuracy_score(y_test, y_unseen)
# 0.5984686219340951
最后,对我们的数据进行一个新鲜的交互式视角。
因此,这就是我们使用kscorer软件包深入研究K均值聚类的方式,该软件包简化了找到最优集群数量的过程。由于其复杂的度量和并行处理,它已被证明是数据分析的实用工具。
编辑:王菁
校对:林亦霖

更多推荐


所有评论(0)