使用分类变量的 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)进行数据降维并作为分类算法逻辑回归(logistic Regression)的数据预处理步骤实战