【问题标题】:changing cluster labels for kmeans model更改 kmeans 模型的集群标签
【发布时间】:2020-05-15 16:12:39
【问题描述】:

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

当我在模型上运行 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()

【问题讨论】:

    标签: python machine-learning k-means doc2vec


    【解决方案1】:

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

    尝试:

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

    类似的工作对我有用

    【讨论】:

      【解决方案2】:

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

      但在某些情况下,文档向量具有不同的分布,或者初始化状态(运气不好)对文档向量分布高度敏感,即使这种重复初始化也无法保持一致的集群。

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

      (1) 初始化KMeans 集群以匹配先前运行的质心,使后面的分析偏向于创建兼容命名/居中的集群;

      (2) 在第二次运行完成后,重命名集群,根据哪个(在所有可能的3! 3 个集群的任意命名排列中)使每个同名的“新”集群之间的总距离尽可能小到'prior' 同名集群。

      【讨论】:

        【解决方案3】:

        对于 Kmeans,当你多次运行 fit 时,每次 centroid 都会随机初始化。为了使其具有确定性,您可以使用 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') 
        

        【讨论】:

          猜你喜欢
          • 2020-07-20
          • 2013-07-15
          • 2016-07-20
          • 2016-11-09
          • 2020-12-21
          • 2015-04-05
          • 1970-01-01
          • 2020-09-08
          • 2021-08-20
          相关资源
          最近更新 更多