Scikit K-means聚类性能测量

Vip*_*oun 13 python cluster-analysis machine-learning scikit-learn 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]
Run Code Online (Sandbox Code Playgroud)

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

from jqmcvi import base
base.dunn(k_list)
Run Code Online (Sandbox Code Playgroud)

我的问题是:Scikit Learn中是否存在任何聚类内部评估(除了来自silhouette_score)?还是在另一个着名的图书馆?

感谢您的时间

Om *_*ash 8

除了 Silhouette Score 之外,Elbow Criterion 还可用于评估 K 均值聚类。它不能作为 Scikit-Learn 中的函数/方法使用。我们需要计算 SSE 来使用 Elbow Criterion 评估 K-Means 聚类。

Elbow Criterion 方法的思想是选择kSSE 突然下降的(簇数)。SSE 定义为簇中每个成员与其质心之间距离的平方和。

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

因此,目标是选择k仍具有 a的较小值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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

希望能帮助到你!


And*_*tto 6

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

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

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

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

  • “不需要先验选择集群数量” - 对于集群,somoclu 默认使用具有 8 个集群的 K-Means。 (3认同)