我已经从Doc2Vec模型中将Kmeans模型应用于文档嵌入,以对嵌入进行聚类,并获得可视化效果以及每个聚类中最常用的术语。我已经能够做到这一点,并且每次都能获得相同的可视化效果。
当我在模型上运行kmeans.fit_predict时,它会根据我指定的聚类为我提供一个聚类标签列表,其长度与我嵌入的文档数相同。多次运行模型时会出现问题,它每次给每个集群一个类似的分布,但是多次运行后集群标签会改变。例如,
我尝试保存模型并多次使用相同的模型,但是遇到相同的问题。这会导致每个群集中最常用的术语以及群集在可视化中的位置发生变化,从而改变了它的解释方式。我打算将标签用作分类方法,但这不是不可能吗?我不确定我的代码是否有问题,或者如果有人可以帮助,这是否是正常行为,将不胜感激。
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()
答案 0 :(得分:1)
对于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')
答案 1 :(得分:0)
通过指定random_state
(根据@qaiser的回答)来稳定初始化随机数可能会有所帮助-可能是通过确保针对相同的起始KMeans
状态的类似文档向量集趋向于找到“相同”群集位于相同的命名插槽中。
但是在某些情况下,文档向量具有不同的分布,或者初始化状态对文档向量分布高度敏感(运气不佳),即使这种重复初始化也无法保持一致的簇。
您可能还需要考虑以下一项或两项:
(1)初始化KMeans
聚类以匹配先前运行的质心,以使以后的分析偏向于创建兼容命名/居中的聚类;
(2)在第二次运行结束后,根据要重命名的集群(在所有可能的3!
3个集群的任意命名排列中),使每个相同名称的“新”集群之间的总距离最小到同名的“先前”群集中。
答案 2 :(得分:0)
我认为问题可能出在 .fit_predict 的使用上。试试看 .predict 看 https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
试试:
l = kmeans_model.predict(d2v_model.docvecs.vectors_docs)
类似的对我有用