Я приспособил модель Kmeans к вложениям документов из модели Doc2Ve c, чтобы кластеризовать вложения и получать визуализацию, а также наиболее частые термины для каждого кластера. Я смог сделать это нормально и каждый раз получать одну и ту же визуализацию.
Когда я запускаю kmeans.fit_predict на модели, она выдает мне список меток кластеров в соответствии с кластерами, которые я указал для тех же самых длина как количество вложений документов у меня есть. Проблема возникает при многократном запуске модели, которая дает одинаковый разброс на кластер каждый раз, но метки кластера изменятся после многократного запуска. Например,
- Прогон 1 - 0: 100, 1: 100, 2:10
- Прогон 2 - 0:99, 1: 101, 2:10
- Прогон 3 - 2: 100, 0: 100, 1:10
- Прогон 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()