Вы можете запустить что-то вроде этого кода: посмотрите на приложенное изображение, на этом графике вы можете увидеть, что наличие более 3 кластеров (для набора данных, на котором он был запущен) не обеспечивает значительного уменьшения искажений. Таким образом, оптимальное число кластеров в этом случае будет 3 (простые синтетические данные). Для шумных данных решение может быть труднее.
Ссылка: A. Скудные заметки Мюллера о sklearn
import matplotlib.pyplot as plt
distortions = []
for i in range(1, 11):
km = KMeans(n_clusters=i,
random_state=0)
km.fit(X)
distortions.append(km.inertia_)
plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()
Редактировать для ValueError : Для ValueError: вам нужны только цифры, так что вы можете сделать так:
df_numerics = df.drop(['Statename', 'gender', 'religion], axis=1)
Вы также можете удалить другие столбцы, которые вы не хотите включать в кластерный анализ.
с помощью df_numerics, попробуйте метод elbow и найти хороший номер кластера.
Тогда, скажем,Вы узнали, что 3 кластера были хорошими, вы можете запустить:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)
метки содержат номера кластеров (0,1,2 для 3-кластеров) для каждой строки в вашем фрейме данных. Вы также можете сохранить этов качестве столбца в вашем datafame:
df['cluster_labels'] = labels
Затем для его визуализации вы можете выбрать 2 столбца (больше, чем это сложно визуализировать). Допустим, вы выбрали «txn_duration» и «сумму», чтобы построить эти столбцы и добавить метки кластеров в следующем цвете:
import matplotlib.pyplot as plt
plt.scatter(df['txn_duration'],df['amount'], c=df['cluster_labels'])