Scikit K-means聚类性能度量

17

我正在尝试使用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指数来衡量聚类的性能(我们寻求更大的指数) 为此,我导入jqm_cvi包(可在这里找到)

from jqmcvi import base
base.dunn(k_list)

我的问题是:除了 silhouette_score,Scikit Learn 中是否已经存在任何聚类内部评估?或者在其他知名库中?


5
您可以在此处找到概述:http://scikit-learn.org/stable/modules/clustering.html(2.3.9.聚类性能评估) - Martin Krämer
1
上面链接中的大多数性能算法都依赖于“地面真实”标签。Scikit Learn 上唯一可用的内部评估算法是轮廓分数和 Calinski-Harabaz 指数,对吗? - Leo Martins
1
在http://scikit-learn.org/stable/modules/clustering.html#clustering-performance-evaluation中提供了许多性能评估策略。 - Vivek Kumar
4个回答

8
除了轮廓系数外,肘部准则也可用于评估K-Mean聚类。它在Scikit-Learn中不可用作函数/方法。我们需要计算SSE来使用肘部准则评估K-Means聚类。
肘部准则方法的想法是选择SSE急剧下降的k(簇数)。 SSE定义为每个成员与其质心之间的平方距离之和。
对于每个k值,其中k是簇的数量,请计算平方误差和(SSE)并绘制线图。当我们增加k时,SSE趋向于减少到0(当k等于数据集中的数据点数时,SSE = 0,因为此时每个数据点都是自己的簇,它与其簇的中心之间没有误差)。
因此,目标是选择一个仍具有低SSE的较小的k值,而拐点通常表示我们通过增加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()

enter image description here

如果折线图看起来像手臂 - 在上面的折线图中有一个红色圆圈(就像角度),手臂的“肘部”是optimal k(簇数)的值。根据上面折线图中的肘部,最佳簇数为3。
注意:肘部准则具有启发式特性,可能不适用于您的数据集。根据数据集和您尝试解决的问题的直觉进行操作。
希望这可以帮助你!

6

通常,聚类被认为是一种无监督方法,因此很难建立一个良好的性能度量(正如先前的评论所建议的那样)。

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

  • K-mean:在这种情况下,您可以使用例如PCA来减少数据的维数。使用这种算法,您可以将数据绘制在2D图中,然后可视化聚类结果。但是,请注意,您在此图中看到的是数据在2D空间中的投影,因此可能不太准确,但仍然可以让您了解聚类分布情况。

  • 自组织映射(Self-organizing map):这是一种基于神经网络的聚类算法,它创建了一个离散化的表示训练样本输入空间的映射,并且是进行降维的方法(SOM)。您可以找到一个非常好的Python包somoclu,其中已经实现了该算法并提供了一种易于可视化的结果方式。该算法非常适合聚类,因为不需要先选择聚类数量(在k-mean中需要选择k,但在此处不需要)。


3
对于聚类,somoclu使用K-Means作为默认算法,并且不需要预先选择聚类数量。 - t_sologub

3

正如您所说,scikit-learn中只存在轮廓系数(Silhouette Coefficient)和Calinski-Harabaz指数。对于Dunn指数,您可以使用此链接此链接


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接