簡體   English   中英

更改 kmeans 模型的集群標簽

[英]changing cluster labels for kmeans model

我已經在來自 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()

對於 Kmeans,當您多次運行 fit 時,每次質心都會隨機初始化。 為了使其具有確定性,您可以使用 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 的回答)來穩定初始化隨機化可能會有所幫助——也許通過確保類似的 doc-vectors 集,針對相同的起始KMeans狀態,傾向於在相同的命名槽中找到“相同”的集群。

但在某些情況下,doc-vectors 具有不同的分布,或者初始化狀態(運氣不好)對 doc-vector 分布高度敏感,即使這種重復初始化也不能保持一致的集群。

您可能還想考慮以下一項或兩項:

(1) 初始化KMeans聚類以匹配先前運行的質心,使后面的分析偏向於創建兼容命名/居中的聚類;

(2) 在第二次運行完成后,根據(所有可能的3! 3 個集群的任意命名排列)重命名集群,使每個同名“新”集群與“先前”集群之間的總距離最小同名。

我認為問題可能是使用 .fit_predict。 試試看 .predict 看https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

嘗試:

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

類似的對我有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM