奇怪的聚类输出(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
中的标签相关。结果只是意味着每个集群中的观测值在到质心的距离方面彼此相似。
我有一个不平衡的数据集,总共有四个标签。其中两个的出现频率比另外两个高很多。我有将近一百万个观察值。
我试图通过探索 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
中的标签相关。结果只是意味着每个集群中的观测值在到质心的距离方面彼此相似。