изменение меток кластера для модели kmeans - PullRequest
0 голосов
/ 30 января 2020

Я приспособил модель Kmeans к вложениям документов из модели Doc2Ve c, чтобы кластеризовать вложения и получать визуализацию, а также наиболее частые термины для каждого кластера. Я смог сделать это нормально и каждый раз получать одну и ту же визуализацию.

Когда я запускаю 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()

Ответы [ 2 ]

1 голос
/ 30 января 2020

для Kmeans, когда вы работаете в форме несколько раз, каждый раз центроид будет случайным образом инициализироваться. Чтобы сделать его детерминированным c, вы можете использовать параметры 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') 
0 голосов
/ 31 января 2020

Стабилизация рандомизации при инициализации путем указания random_state (на ответ @ qaiser) может помочь - возможно, путем обеспечения одинаковых-i sh наборов do c -векторов для одного и того же начального состояния KMeans, как правило, найдите «одинаковые» кластеры в слотах с одинаковыми именами.

Но могут быть ситуации, когда векторы do c имеют другое распределение, или когда инициализированное состояние (по счастливой случайности) очень чувствительно к распределению c -vector, где даже это повторяется -инициализация не поддерживает когерентные кластеры.

Вы также можете рассмотреть один или оба из:

(1) инициализации кластеров KMeans для соответствия центроидам предыдущего прогона, чтобы сместить последующий анализ к созданию совместимых именованных / центрированных кластеры;

(2) после окончания второго прогона переименуйте кластеры, в соответствии с которыми (из всех возможных 3! произвольных перестановок именования из 3 кластеров) остается наименьшее возможное общее расстояние между каждым «новым» кластером одного и того же имя для «предыдущего» кластера с тем же именем.

...