更改 kmeans 模型的集群标签

changing cluster labels for kmeans model

我已将 Kmeans 模型拟合到来自 Doc2Vec 模型的文档嵌入上,以对嵌入进行聚类并获得可视化效果以及每个聚类的最频繁术语。我已经能够很好地做到这一点并且每次都获得相同的可视化效果。

当我 运行 模型上的 kmeans.fit_predict 时,它会根据我指定的与我拥有的文档嵌入数相同长度的集群为我提供集群标签列表。当 运行 多次对模型进行 运行 处理时,每次都会为每个集群提供类似的分布,但在多次 运行 对模型进行处理后,集群标签会发生变化。例如,

  1. 运行 1 - 0:100, 1:100, 2:10
  2. 运行 2 - 0:99 , 1:101, 2:10
  3. 运行 3 - 2:100, 0:100, 1:10
  4. 运行 4 - 0:100, 1:100, 2:10

我尝试保存模型并多次使用同一个模型,但遇到了同样的问题。这会导致每个聚类中最常见的术语和聚类在可视化中的位置发生变化,从而改变其解释方式。我打算使用标签作为分类方法,但这不是不可能吗?我不确定这是否是我的代码的问题,或者这是否是正常行为,如果有人能提供帮助,我将不胜感激。

df = pd.read_csv("data.csv")
d2v_model = Doc2Vec.load("d2vmodel")

clusters = 3
iterations = 100

kmeans_model = KMeans(n_clusters=clusters, init='k-means++', max_iter=iterations) 
X = kmeans_model.fit(d2v_model.docvecs.vectors_docs)
l = kmeans_model.fit_predict(d2v_model.docvecs.vectors_docs)
labels = kmeans_model.labels_.tolist()

pca = PCA(n_components=2).fit(d2v_model.docvecs.vectors_docs)
datapoint = pca.transform(d2v_model.docvecs.vectors_docs)

df["clusters"] = labels
cluster_list = []
cluster_colors = ["#FFFF00", "#008000", "#0000FF"] 
plt.figure
color = [cluster_colors[i] for i in labels]
plt.scatter(datapoint[:, 0], datapoint[:, 1], c=color)
centroids = kmeans_model.cluster_centers_
centroidpoint = pca.transform(centroids)
plt.scatter(centroidpoint[:, 0], centroidpoint[:, 1], marker="^", s=150, c="#000000")

plt.show()

for i in range(clusters):
    df_temp = df[df["clusters"]==i]
    cluster_words = Counter(" ".join(df_temp["Body"].str.lower()).split()).most_common(25)
    [cluster_list.append(x[0]) for x in cluster_words]
    cluster_list.clear()

对于Kmeans,当你运行多次拟合时,每次质心都会随机初始化。要使其具有确定性,您可以使用 random_state 参数。你可以参考文档 https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

 kmeans_model = KMeans(n_clusters=clusters, init='k-means++', max_iter=iterations, random_state = 'int number need to given') 

通过指定 random_state(根据@qaiser 的回答)来稳定初始化随机化可能会有所帮助——也许通过确保针对相同起始 KMeans 状态的类似文档向量集,往往会在相同命名的插槽中找到 'same' 个集群。

但是在某些情况下,doc-vectors 具有不同的分布,或者初始化状态(运气不好)对 doc-vector 分布高度敏感,即使这种重复初始化也不能保持连贯集群。

您可能还想考虑以下一项或两项:

(1) 初始化 KMeans 集群以匹配先前的 运行 的质心,以偏向于创建兼容的 named/centered 集群的后期分析;

(2) 在第二个 运行 完成后,重命名集群(在 3 个集群的所有可能 3! 任意命名排列中)在每个 [= 之间留下尽可能小的总距离25=] 同名集群到 'prior' 同名集群。

我认为问题可能在于使用 .fit_predict。试试 .predict 见 https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

尝试:

l = kmeans_model.predict(d2v_model.docvecs.vectors_docs)

类似的工作对我来说