使用分类变量的 Kmeans

Posted

技术标签:

【中文标题】使用分类变量的 Kmeans【英文标题】:Kmeans using categorical variables 【发布时间】:2020-04-06 04:37:41 【问题描述】:

我有一个包含所有分类变量的大型数据集 45421 * 12(行 * 列)。我的数据集中没有数值变量。我想使用这个数据集来构建无监督的聚类模型,但是在建模之前我想知道这个数据集的最佳特征选择模型。 而且我无法为这个数据集绘制肘曲线。我在 k 均值肘法中给出了 k = 1-1000 的范围,但它没有给出任何最佳集群图并且需要 8-10 小时才能执行。如果有人提出更好的解决方案来解决这个问题,那将是一个很大的帮助。

代码:

data = 'UserName':['infuk_tof', 'infus_llk', 'infaus_kkn', 'infin_mdx'], 
       'UserClass':['high','low','low','medium','high'], 
       'UserCountry':['unitedkingdom','unitedstates','australia','india'], 
       'UserRegion':['EMEA','EMEA','APAC','APAC'], 
       'UserOrganization':['INFBLRPR','INFBLRHC','INFBLRPR','INFBLRHC'], 
       'UserAccesstype':['Region','country','country','region'] 

df = pd.DataFrame(data) 

【问题讨论】:

你能举一个你的数据集的几行的例子吗?您是否使用 scikit-learn 进行 K-means? 是的。我正在将 scikit-learn 用于 K-means。这些是我的数据集的一些行。数据= '用户名':['infuk_tof','infus_llk','infaus_kkn','infin_mdx'],'用户类':['高','低','低','中','高'] , 'UserCountry':['unitedkingdom','unitedstates','australia','india'], 'UserRegion':['EMEA','EMEA','APAC','APAC'], 'UserOrganization':[ 'INFBLRPR','INFBLRHC','INFBLRPR','INFBLRHC'] 'UserAccesstype':['Region','country','country','region'] df = pd.DataFrame(data) 【参考方案1】:

为了能够运行Kmeans 或任何其他模型,您首先需要将分类变量转换为数值。

使用OneHotEncoder的示例:

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

data='UserAccesstype': ['Region', 'country', 'country', 'region'],
 'UserCountry': ['unitedkingdom', 'unitedstates', 'australia', 'india'],
 'UserOrganization': ['INFBLRPR', 'INFBLRHC', 'INFBLRPR', 'INFBLRHC'],
 'UserRegion': ['EMEA', 'EMEA', 'APAC', 'APAC']

df = pd.DataFrame(data)

  UserAccesstype    UserCountry UserOrganization UserRegion
0         Region  unitedkingdom         INFBLRPR       EMEA
1        country   unitedstates         INFBLRHC       EMEA
2        country      australia         INFBLRPR       APAC
3         region          india         INFBLRHC       APAC

enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(df.values)

X_for_Kmeans = enc.transform(df.values).toarray()

X_for_Kmeans
array([[1., 0., 0., 0., 0., 1., 0., 0., 1., 0., 1.],
       [0., 1., 0., 0., 0., 0., 1., 1., 0., 0., 1.],
       [0., 1., 0., 1., 0., 0., 0., 0., 1., 1., 0.],
       [0., 0., 1., 0., 1., 0., 0., 1., 0., 1., 0.]])

使用X_for_Kmeans 进行 Kmeans 拟合。干杯

【讨论】:

仅仅因为您可以这样做并不意味着您应该这样做。没有明确定义的指标来定义分类空间中数据点之间的距离,这是一个活跃的研究领域(参见此处,例如:link.springer.com/article/10.1007/s12652-019-01445-5)【参考方案2】:

对于这样的分类数据,K-means 不是合适的聚类算法。您可能想寻找一种 K-modes 方法,不幸的是,它目前不包含在 scikit-learn 包中。您可能想查看 github 上可用的 kmode 包:https://github.com/nicodv/kmodes,它遵循您在 scikit-learn 中使用的大部分语法。

更多内容,请看这里的讨论:https://datascience.stackexchange.com/questions/22/k-means-clustering-for-mixed-numeric-and-categorical-data

【讨论】:

以上是关于使用分类变量的 Kmeans的主要内容,如果未能解决你的问题,请参考以下文章

在数据库级别使用混合变量的 kmeans 实现

使用聚类算法(Kmeans)进行数据降维并作为分类算法逻辑回归(logistic Regression)的数据预处理步骤实战

matlab 聚类分析kmeans和cluster的区别

为我的 kmeans 聚类数据创建散点图时遇到问题

具有单个输入变量的 kmeans 聚类图

三个特征变量怎么聚类python