【发布时间】: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 进行李尔平方优化是废话。
标签: python pandas scikit-learn cluster-analysis k-means