我可以改变啥来让 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 中预期的方式对我的数据进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章