在sklearn中使用轮廓分数进行高效的k-means评估

时间:2014-05-15 19:41:08

标签: python scikit-learn cluster-analysis

我在约100万个项目上运行k-means聚类(每个项目表示为~100个特征向量)。我已经为各种k运行了聚类,现在想要使用sklearn中实现的轮廓分数来评估不同的结果。试图在没有采样的情况下运行它似乎不可行并且需要花费相当长的时间,因此我假设我需要使用采样,即:

metrics.silhouette_score(feature_matrix, cluster_labels, metric='euclidean',sample_size=???)

然而,我并不清楚适当的采样方法是什么。在给定矩阵大小的情况下,对于使用什么尺寸的样本,是否有经验法则?采用我的分析机可以处理的最大样本,或者采用更小样本的平均值更好吗?

我在很大程度上要求,因为我的初步测试(使用sample_size = 10000)产生了一些非常不直观的结果。

我也愿意采用其他更具可扩展性的评估指标。


编辑以显示问题:对于不同的样本大小,该图显示了作为群集数量enter image description here的函数的轮廓分数

增加样本量似乎可以减少噪音,这并不奇怪。奇怪的是,鉴于我有100万个非常异质的向量,2或3是“最佳”聚类数。换句话说,什么不直观的是,当我增加聚类数量时,我会发现轮廓得分或多或少单调下降。

3 个答案:

答案 0 :(得分:1)

其他指标

  1. 弯头方法:计算每个K解释的%方差,并选择曲线开始平稳的K. (这里有一个很好的描述https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set)。显然,如果你有k ==数据点数,你可以解释100%的方差。问题是所解释的方差改善在何处开始趋于平稳。

  2. 信息理论:如果您可以计算给定K的可能性,那么您可以使用AIC,AICc或BIC(或任何其他信息理论方法)。例如。对于AICc,它只是平衡可能性的增加,因为随着您需要的参数数量的增加而增加K.在实践中,您所做的只是选择最小化AICc的K.

  3. 您可以通过运行替代方法来获得大致相应的K的感觉,这些方法可以让您重新估算群集的数量,例如DBSCAN。虽然我还没有看到这种方法用于估算K,但可能不宜像这样依赖它。但是,如果DBSCAN在这里也为您提供了少量的群集,那么您的数据很可能是您可能不会欣赏的(即您没有那么多群集预期)。

  4. 抽样多少

    看起来你已经从你的情节中回答了这个问题:无论你的采样是什么,你都会在轮廓得分中获得相同的模式。所以这些模式似乎对抽样假设非常有效。

答案 1 :(得分:0)

kmeans汇聚到当地最低点。起始位置在最佳簇数中起着至关重要的作用。通常使用PCA或任何其他降维技术来降低噪音和尺寸以进行kmeans是一个好主意。

只是为了完整起见而添加。通过“围绕medoids分区”获得最佳簇数可能是个好主意。它相当于使用轮廓法。

对于不同大小的样本,奇怪观察的原因可能是不同的起点。

综上所述,评估手头数据集的可聚合性非常重要。可跟踪均值是按此处讨论的最差对比率Cornerstone

答案 2 :(得分:0)

由于没有一种可以被广泛接受的确定最佳聚类数的最佳方法,因此所有评估技术,包括 Silhouette Score Gap Statistic 等。从根本上依赖某种形式的试探性/尝试性和错误性论证。所以对我来说,最好的方法是尝试多种技术,并且不要对任何一种方法都过度自信。

对于您来说,应该在整个数据集上计算出理想,最准确的分数。但是,如果您需要使用部分样本来加快计算速度,则应使用计算机可以处理的最大样本量。基本原理与从感兴趣的人群中获取尽可能多的数据点相同。

还有一个问题是,Silhouette Score的sklearn实现使用随机(非分层)采样。您可以使用相同的样本量(例如sample_size=50000)多次重复计算,以了解样本量是否足够大以产生一致的结果。