Кластеризация со смешанным типом данных - PullRequest
0 голосов
/ 26 октября 2019

В настоящее время мой фрейм данных состоит из числовых и категориальных значений (смешанный тип данных). Мой фрейм данных выглядит так:

id       age      txn_duration        Statename        amount      gender     religion 
1         27        275                bihar            110          m         hindu
2         33        163               maharashtra       50           f         muslim
3         53         63               delhi             50           f         muslim
4         47        100               up                50           m         hindu
5         39        263               punjab            100          m         punjabi
6         41        303               delhi             50           m         punjabi

Существует 20 штатов (Statename) и 7 религий. Я сделал get_dummies для Statename и rekigion, но получил много шума. Также выявляют выбросы. Мой вопрос - 1. Как найти оптимальное нет кластера для смешанного типа данных. 2. В этом случае я использую k-средства algo. Могу ли я использовать k-режимы или любые другие методы, которые помогут моим результатам. Потому что я не получаю хороших результатов, используя k-means 3. Как интерпретировать результаты моего кластера. Я использую

print (cluster_data[clmns].groupby(['clusters']).mean())

Любой другой способ, которым я могу видеть или построить? Пожалуйста, предоставьте мне код

Мой код -

import pandas as pd
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import LabelEncoder
import numpy as np
#Importing libraries
import os
import matplotlib.pyplot as plt#visualization
from PIL import  Image
%matplotlib inline
import seaborn as sns#visualization
import itertools
import warnings
warnings.filterwarnings("ignore")
import io
from scipy import stats
from sklearn.cluster import KMeans
from kmodes.kprototypes import KPrototypes

cluster_data = pd.read_csv("cluster.csv")

cluster_data = pd.get_dummies(cluster_data, columns=['StateName'])
cluster_data = pd.get_dummies(cluster_data, columns=['gender'])
cluster_data = pd.get_dummies(cluster_data, columns=['religion'])

clmns = ['mobile', 'age', 'txn_duration', 'amount', 'StateName_Bihar',
       'StateName_Delhi', 'StateName_Gujarat', 'StateName_Karnataka',
       'StateName_Maharashtra', 'StateName_Punjab', 'StateName_Rajasthan',
       'StateName_Telangana', 'StateName_Uttar Pradesh',
       'StateName_West Bengal', 'gender_female',
       'gender_male', 'religion_buddhist',
       'religion_christian', 'religion_hindu',
       'religion_jain', 'religion_muslim',
       'religion_other', 'religion_sikh']
df_tr_std = stats.zscore(cluster_data[clmns])

#Cluster the data
kmeans = KMeans(n_clusters=3, random_state=0).fit(df_tr_std)
labels = kmeans.labels_

#Glue back to originaal data
cluster_data['clusters'] = labels

clmns.extend(['clusters'])

#Lets analyze the clusters
print (cluster_data[clmns].groupby(['clusters']).mean())

1 Ответ

0 голосов
/ 26 октября 2019

Вы можете запустить что-то вроде этого кода: посмотрите на приложенное изображение, на этом графике вы можете увидеть, что наличие более 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'])

elbow method

...