【问题标题】:Scikit K-means clustering performance measureScikit K-means 聚类性能度量
【发布时间】:2017-10-02 18:03:33
【问题描述】:

我正在尝试使用 K-means 方法进行聚类,但我想衡量我的聚类的性能。 我不是专家,但我渴望了解有关集群的更多信息。

这是我的代码:

import pandas as pd
from sklearn import datasets

#loading the dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data)

#K-Means
from sklearn import cluster
k_means = cluster.KMeans(n_clusters=3)
k_means.fit(df) #K-means training
y_pred = k_means.predict(df)

#We store the K-means results in a dataframe
pred = pd.DataFrame(y_pred)
pred.columns = ['Species']

#we merge this dataframe with df
prediction = pd.concat([df,pred], axis = 1)

#We store the clusters
clus0 = prediction.loc[prediction.Species == 0]
clus1 = prediction.loc[prediction.Species == 1]
clus2 = prediction.loc[prediction.Species == 2]
k_list = [clus0.values, clus1.values,clus2.values]

现在我已经存储了我的 KMeans 和三个集群,我正在尝试使用 Dunn Index 来衡量我的集群性能(我们寻求更大的索引) 为此,我导入了 jqm_cvi 包(可用here

from jqmcvi import base
base.dunn(k_list)

我的问题是:Scikit Learn 中是否已经存在任何聚类内部评估(来自剪影分数的除外)?还是在另一个知名图书馆?

感谢您的宝贵时间

【问题讨论】:

标签: python machine-learning scikit-learn cluster-analysis sklearn-pandas


【解决方案1】:

通常,聚类被认为是一种无监督的方法,因此很难建立良好的性能指标(如之前的 cmets 中所建议的那样)。

不过,可以从这些算法(例如 k-means)中推断出许多有用的信息。问题是如何为每个集群分配语义,从而衡量算法的“性能”。在许多情况下,一个很好的方法是通过集群的可视化。显然,如果您的数据具有高维特征,就像在许多情况下发生的那样,那么可视化就不是那么容易了。让我建议两种方法,使用 k-means 和另一种聚类算法。

  • K-mean:在这种情况下,您可以使用例如PCA 来降低数据的维度。使用这种算法,您可以将数据绘制在 2D 图中,然后可视化您的集群。但是,您在此图中看到的是数据在 2D 空间中的投影,因此可能不是很准确,但仍然可以让您了解集群的分布方式。

  • 自组织映射这是一种基于神经网络的聚类算法,它创建训练样本输入空间的离散表示,称为映射,因此是进行降维的方法(SOM)。你可以找到一个非常棒的 Python 包,名为 somoclu,它已经实现了这个算法,并且是一种可视化结果的简单方法。该算法非常适合聚类,还因为不需要先验选择聚类的数量(在 k-mean 中您需要选择 k,这里没有)。

【讨论】:

  • does not require a priori selection of the number of cluster - 用于聚类 somoclu 默认使用具有 8 个聚类的 K-Means。
【解决方案2】:

如您所说,scikit-learn 中仅存在轮廓系数和 Calinski-Harabaz 指数。对于 Dunn 索引,您可以使用 thisthis 链接。

【讨论】:

    【解决方案3】:

    除了轮廓得分外,Elbow Criterion 还可用于评估 K-Mean 聚类。它在 Scikit-Learn 中不能作为函数/方法使用。我们需要计算 SSE 以使用 Elbow Criterion 评估 K-Means 聚类。

    Elbow Criterion 方法的思想是选择 SSE 突然下降的k(no of cluster)。 SSE 被定义为集群的每个成员与其质心之间的平方距离之和。

    计算k 的每个值的平方误差和(SSE),其中kno. of cluster 并绘制折线图。随着k的增加,SSE趋向于向0减小(SSE=0,当k等于数据集中数据点的数量时,因为每个数据点都是自己的集群,并且它与中心之间没有误差其集群)。

    所以我们的目标是选择一个小的k 值,它仍然有一个low SSE,而肘部通常表示,我们通过增加k 开始收益递减。

    鸢尾花数据集示例:

    import pandas as pd
    from sklearn.datasets import load_iris
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    
    iris = load_iris()
    X = pd.DataFrame(iris.data, columns=iris['feature_names'])
    #print(X)
    data = X[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)']]
    
    sse = {}
    for k in range(1, 10):
        kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data)
        data["clusters"] = kmeans.labels_
        #print(data["clusters"])
        sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
    plt.figure()
    plt.plot(list(sse.keys()), list(sse.values()))
    plt.xlabel("Number of cluster")
    plt.ylabel("SSE")
    plt.show()
    

    如果折线图看起来像手臂 - 上面折线图中的红色圆圈(如角度),则手臂上的“肘部”是optimal k(簇数)的值。根据折线图中的上弯,最优聚类数为3。

    注意:Elbow Criterion 本质上是启发式的,可能不适用于您的数据集。根据数据集和您要解决的问题遵循直觉。

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2015-04-11
      • 1970-01-01
      • 2021-01-19
      • 2020-10-28
      • 2011-08-13
      • 2013-08-08
      • 2013-02-14
      • 2018-01-14
      相关资源
      最近更新 更多