混合数据类型的聚类

时间:2019-10-26 03:12:17

标签: python scikit-learn k-means

当前,我的数据框同时包含数值和分类值(混合数据类型)。我的数据框看起来像-

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个州(州名)和7个宗教。我已经为Statename和rekigion做过get_dummies,但是噪音很大。还检测离群值。我的问题是- 1.如何为混合数据类型找到最佳聚类数。 2.在这种情况下,我使用的是k-均值算法。我可以使用k-modes或任何其他有助于结果的方法吗?因为使用k均值无法获得良好的结果 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 :(得分:0)

您可以运行类似以下代码的内容: 看一下所附的图像,在该图中您可以看到具有3个以上的聚类(对于运行该数据集的聚类)不会显着减少失真。因此,在这种情况下,最佳簇数将为3(简单的合成数据)。对于嘈杂的数据,决定可能会更困难。

参考:A. Mueller's scipy notes on 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,尝试使用弯头方法,并尝试找到一个好的簇号。

然后,假设您发现3个群集很好,则可以运行:

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)

标签包含数据帧中每一行的集群编号(三集群为0,1,2)。您也可以将其另存为datafame中的一列:

df['cluster_labels'] = labels

然后将其可视化,您可以选择2列(这比可视化要困难得多)。假设您选择了“ txn_duration”和“ amount”,您可以绘制这些列,并以如下颜色添加聚类标签:

import matplotlib.pyplot as plt
plt.scatter(df['txn_duration'],df['amount'], c=df['cluster_labels'])

elbow method