我可以改变啥来让 k-means 以 Python 中预期的方式对我的数据进行聚类?

Posted

技术标签:

【中文标题】我可以改变啥来让 k-means 以 Python 中预期的方式对我的数据进行聚类?【英文标题】:What can I change to get k-means to cluster my data the way it's expected to in python?我可以改变什么来让 k-means 以 Python 中预期的方式对我的数据进行聚类? 【发布时间】:2019-08-23 07:42:39 【问题描述】:

我正在处理一项任务,该任务要求我们对数据集 (data-set is here) 执行 20 维 K-Means 聚类,并通过将聚类与分类箱进行比较来测试其纯度。我已经尝试了几天来找到显示有意义聚类的聚类和 bin 范围的组合,但我没有运气。据我所知,所有集群都出现在所有范围内的某一点上。

我已经使用 python 以及 pandas 和 sklearn 库来尝试实现这一点。根据我们的任务,代表“以小时为单位的旷工”的最后一列将被排除在聚类之外,然后分箱进行比较。我已经使用 KMeans 方法创建了集群列表,并将它们附加到一个新的数据框中,该数据框仅包含 ID、缺席小时数、集群和分箱缺席时间范围。当我查看这张表时,我发现几乎没有发生可观察到的集群,因为所有集群都出现在所有范围内。这是我的表的前几行(按簇排序):

      ID  Absenteeism time in hours  Cluster Absentee hours bins
 0    11  4                          0        (3.0, 9.0]        
 415  13  4                          0        (3.0, 9.0]        
 414  18  4                          0        (3.0, 9.0]        
 413  20  3                          0        (2.0, 3.0]        
 412  3   4                          0        (3.0, 9.0]        
 411  24  2                          0        (-0.1, 2.0]       
 410  20  8                          0        (3.0, 9.0]        
 409  11  8                          0        (3.0, 9.0]        
 408  3   8                          0        (3.0, 9.0]        
 416  33  4                          0        (3.0, 9.0]        
 407  36  0                          0        (-0.1, 2.0]       
 405  1   0                          0        (-0.1, 2.0]       
 404  36  8                          0        (3.0, 9.0]        
 403  36  3                          0        (2.0, 3.0]        
 402  36  2                          0        (-0.1, 2.0]       
 401  1   8                          0        (3.0, 9.0]        
 400  13  0                          0        (-0.1, 2.0]       
 399  10  8                          0        (3.0, 9.0]        
 398  3   16                         0        (15.0, 120.0]     
 406  24  0                          0        (-0.1, 2.0]       
 397  23  8                          0        (3.0, 9.0]   

然后在表格中:

 242  14  2                          4        (-0.1, 2.0]       
 552  28  2                          4        (-0.1, 2.0]       
 244  18  8                          4        (3.0, 9.0]        
 296  34  3                          4        (2.0, 3.0]        
 297  13  8                          4        (3.0, 9.0]        
 298  3   1                          4        (-0.1, 2.0]       
 299  22  64                         4        (15.0, 120.0]     
 300  5   0                          4        (-0.1, 2.0]       
 301  11  16                         4        (15.0, 120.0] 

据我所知,集群似乎没有像预期的那样聚集。正如我之前所说,我已经在这方面工作了好几天,我已经完成了数小时的研究、阅读文档、观看 youtube 视频、阅读了数十个教程,但我似乎无法弄清楚我到底是什么,如果有的话。我做错了。我尝试了从 k=3 到 k=6 的集群,其中包含各种大小的箱。我的导师似乎很确定我们应该使用这个数据集找到有效的聚类。我不确定我是否缺少一些东西。我的代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sys
from sklearn.cluster import KMeans

pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
np.set_printoptions(threshold = sys.maxsize)
pd.set_option('display.max_colwidth', -1)
pd.set_option('display.max_rows', -1)



# import dataset as pandas dataframe
absences = pd.read_excel('Absenteeism_at_work.xls')

#set columns to be used for k-means (exclide absentee hours)
xRange = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
x = absences.iloc[:, xRange].values

bins = [-0.1, 2, 3, 9, 15, absences['Absenteeism time in hours'].max()]
absences['Absentee hours bins'] = pd.cut(absences['Absenteeism time in hours'], bins)


#perform clustering
kmeans = KMeans(n_clusters = 5)
kmeans.fit(x)
labels = kmeans.labels_
#print(labels)

#add labels column to original dataframe
absences['Cluster'] = labels

#print relevant columns
columns = ['ID', 'Absenteeism time in hours', 'Cluster', 'Absentee hours bins']
sorted_by_cluster = absences[columns].sort_values(['Cluster'])
print(sorted_by_cluster)

非常感谢您提供的任何意见。我的理解是,我绝对应该看到垃圾箱和集群之间的某种相关性。提前谢谢大家。

【问题讨论】:

您可能需要计算 homogeneity score 来评估您的集群是否真的表现不佳。 谢谢,很棒的资源。我试过了,得到了 1.0,但我不相信我做对了。我知道labels_pred 应该是kmeans.labels_ 但我应该为labels_true 输入什么?我的垃圾箱列表? 从不包含 ID 列... 我需要使用除最后一列之外的所有列。讲师特别指出我们应该进行20维聚类分析。 那么你应该教育你的导师。对 ID 进行李尔平方优化是废话 【参考方案1】:

适当地预处理您的数据!

不包括 ID 列。

不要使用编码列(不要计算 ICD 代码的差异)。

为什么要包括星期几?

想想算法试图优化什么功能 - 这对您的数据有任何意义吗?

【讨论】:

感谢您的输入,但正如我在您上面的评论中回复的那样,我明确要求包括除最后一列之外的所有列。 如果那真的是预期的,而不是对你的误解。 这确实是预期的结果,并不是我的误解。考虑到我多次与她确认这是真的,而且她擅长数据挖掘,我认为在任务的目标和范围内这可能不是什么大不了的事。

以上是关于我可以改变啥来让 k-means 以 Python 中预期的方式对我的数据进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章

我应该做些啥来让它显示变量而不是值?

我必须做些啥来改变我的音频可视化器的视觉效果?

访问字典中的对象时可以使用啥来实现

我应该包括啥来制作 boost.python 扩展?

我可以在 Swift 中使用啥来代替“for”

我可以做些啥来提高 Lua 程序的性能?