Scikit K-means聚类性能测量

时间:2017-05-04 13:55:56

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

我正在尝试使用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中是否已存在任何群集内部评估(除了来自silhouette_score)?还是在另一个着名的图书馆?

感谢您的时间

3 个答案:

答案 0 :(得分:1)

通常,聚类被视为无监督方法,因此难以建立良好的性能指标(如前面的评论中所述)。

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

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

  • 自组织地图这是一种基于神经网络的聚类算法,可以创建训练样本输入空间的离散化表示,称为地图,因此,减少维数的方法(SOM)。你可以找到一个名为somoclu的非常好的python包,它已经实现了这个算法,并且可以直观地显示结果。这个算法非常适合聚类,因为不需要先验选择聚类数(以k表示你需要选择k,这里没有)。

答案 1 :(得分:0)

正如你所说,只有剪影系数和Calinski-Harabaz指数存在于scikit-learn中。对于Dunn索引,您可以使用thisthis链接。

答案 2 :(得分:0)

除“轮廓分数”外,“肘部标准”还可用于评估K均值聚类。在Scikit-Learn中不能作为功能/方法使用。我们需要计算SSE,以使用“肘准则”评估K-Means聚类。

“肘标准”方法的想法是选择SSE突然减小的k(簇数)。 SSE定义为簇的每个成员与其质心之间的平方距离的总和。

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

因此,目标是选择一个较小的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()

enter image description here

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

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

希望对您有帮助!