为啥这个 Iris 数据集上的 silhouette_score 总是返回 0?

Posted

技术标签:

【中文标题】为啥这个 Iris 数据集上的 silhouette_score 总是返回 0?【英文标题】:Why is silhouette_score always returning 0 on this Iris dataset?为什么这个 Iris 数据集上的 silhouette_score 总是返回 0? 【发布时间】:2018-11-26 04:20:50 【问题描述】:

我正在测试 Scikitlearn 的一些功能,虽然它们的 example 对我来说工作得很好并返回一个数字表示剪影,但当我在 Iris 数据集上执行等效操作时,它会显示一个聚类,然后总是为剪影平均:

from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt

iris = datasets.load_iris()

print(dir(iris))
print(iris.DESCR)
#print(iris.data[:,1:3]) second and third part of each, columns.
X = iris.data[:, 1:3]

for i in range(2,11):
    model = KMeans(n_clusters=i, random_state=0)
    model.fit(X)
    #print(model.labels_) #Different number for each "cluster" found.
    centroids = model.cluster_centers_
    #Separate xs [:, 0], ys [:,1] and scatter plot:
    plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=170, zorder=10, c='m')
    plt.scatter(X[:, 0], X[:, 1], c=model.labels_)
    #print(plt.scatter.__doc__) # <--- what are the arguments?
    plt.xlabel("Sepal width")
    plt.ylabel("Petal length")
    print(X)
    print(model.labels_)
    print('For %d clusters the average silhouette score is %d' % (i, silhouette_score(X, model.labels_)))
    plt.show()

为什么要这样做,因为它似乎给了它一个与 Scikit 示例相似的 X 数组和标签?

【问题讨论】:

您正在从float 转换为int (%d),请在打印时使用%f 【参考方案1】:

将您的打印语句切换为:

print('For %f clusters the average silhouette score is %f' % (i, silhouette_score(X, model.labels_)))

或者:

print('For  clusters the average silhouette score is '.format(i, silhouette_score(X, model.labels_)))

或者:

print(f"For i clusters the average silhouette score is silhouette_score(X, model.labels_)")

...解决了这个问题。

正如@shahaf 在 cmets 中所说,您正在从 float 转换为 int (%d)。

【讨论】:

以上是关于为啥这个 Iris 数据集上的 silhouette_score 总是返回 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 LinearSVC 在这个数据集上效果这么差?

为啥在 Google Colab 中重新启动运行时后 KMeans 的 silhouette_score 会发生变化?

为啥每次我在这个特定数据集上运行 train-test split 时我的内核都会死掉?

sklearn Clustering:在大型数据集上确定最佳集群数量的最快方法

计算大数据的相异矩阵

sklearn各种分类器简单使用