奇怪的聚类输出(scikitlean kmeans)

Weird clustering output (scikitlean kmeans)

我有一个不平衡的数据集,总共有四个标签。其中两个的出现频率比另外两个高很多。我有将近一百万个观察值。

我试图通过探索 sklearn.cluster.kmeans 集群来更好地理解数据组件。

这是我的数据:

print(X)
[[68.  0.  0. ...  0.  0.  0.]
 [18.  1.  1. ...  1.  0.  0.]
 [18.  1.  1. ...  0.  0.  0.]
 ...
 [59.  0.  0. ...  0.  0.  0.]
 [48.  1.  0. ...  0.  0.  1.]
 [47.  1.  1. ...  0.  0.  0.]]

print(y)
[1 2 3 ... 3 2 3]

观察到的标签有四个水平(序数变量 0 - 3)。

这是我的代码:

scaler = StandardScaler()
scaler.fit(X)
X_scaled = scaler.transform(X)

algo1 = KMeans(n_clusters = 4)
y_pred = algo1.fit_predict(X_scaled)

mglearn.discrete_scatter(X_scaled[:, 0], X_scaled[:,1], y_pred)
plt.legend(["cluster 0", "cluster 1", "cluster 2", "cluster 3"], loc = 'best')
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

这看起来很奇怪,所以我尝试了 3 个集群。

algo2 = KMeans(n_clusters = 3)
y_pred2 = algo2.fit_predict(X_scaled)
mglearn.discrete_scatter(X_scaled[:, 0], X_scaled[:,1], y_pred2)
plt.legend(["cluster 0", "cluster 1", "cluster 2"], loc = 'best')
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

然后是 2 个集群

algo3 = KMeans(n_clusters = 2)
y_pred3 = algo3.fit_predict(X_scaled)
mglearn.discrete_scatter(X_scaled[:, 0], X_scaled[:,1], y_pred3)
plt.legend(["cluster 0", "cluster 1", "cluster 2"], loc = 'best')
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

我想弄清楚群集到底发生了什么。有没有其他方法可以让我更好地理解数据结构?

你没有提到你有多少特征,但看起来,X不仅仅是两个变量。在您的代码中,您仅使用两个特征来可视化集群,而 algo1 使用的变量多于此。

特别是,您正在使用 Feature 1 可视化聚类,它看起来是二进制的(只取值 - 1 和 1 ),所以并不是聚类不成功;您只是在非常有限的特征下可视化集群。

通过在 2-D 中绘图,您将自己局限于将聚类视为仅两个变量的函数,因此您可能会错过一些仅在 3-D 或甚至更高的维度。如果您希望继续这种方式,我建议针对所有其他特征绘制 Feature 1,然后针对所有其他特征绘制 Feature 2,依此类推。这样,您将可视化大小为 2 的所有组合下的聚类,也许这将帮助您理解某些特征对与它们所属的聚类之间的关系。

还请记住,KMeans 是一种无监督算法,因此聚类不一定与 y 中的标签相关。结果只是意味着每个集群中的观测值在到质心的距离方面彼此相似。