【问题标题】:Clustering with mixed data type混合数据类型的聚类
【发布时间】:2019-10-26 16:19:42
【问题描述】:

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

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 个宗教。我已经为 Statename 和 rekigion 完成了 get_dummies,但噪音很大。还检测异常值。我的问题是 - 1. 如何找到混合数据类型的最佳聚类数。 2. 在这种情况下,我使用的是 k-means 算法。我可以使用 k-modes 或任何其他有助于我的结果的方法吗?因为我使用 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())

【问题讨论】:

    标签: python scikit-learn k-means


    【解决方案1】:

    您可以运行如下代码: 查看随附的图像,在该图中,您可以看到拥有 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)
    

    labels 包含数据框中每一行的集群编号(0、1、2 表示 3 个集群)。您也可以将其另存为 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'])
    

    【讨论】:

    • 得到这个错误:ValueError:无法将字符串转换为浮点数:'hindu'。我的数据框包含数字和分类数据。有什么帮助吗?
    • 我的第二个和第三个问题有什么线索吗?在这种情况下,我使用的是虚拟变量。如果我使用标签编码器然后对其进行缩放并进行聚类,这是一个好方法吗?
    猜你喜欢
    • 2019-11-12
    • 2020-11-05
    • 2020-02-09
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多