Что я могу изменить, чтобы заставить k-means кластеризовать мои данные так, как это ожидается в python? - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю над заданием, которое требует от нас 20-мерной кластеризации K-средних для набора данных ( набор данных здесь ) и для проверки его чистоты путем сравнения кластеров с бункеры классификации. В течение нескольких дней я пытался найти комбинацию кластеров и диапазонов бинов, которые показывают значительную кластеризацию, но мне не повезло. Из того, что я могу сказать, все кластеры появляются во всех диапазонах в той или иной точке.

Я использовал библиотеки python, pandas и sklearn для достижения этой цели. Согласно нашему заданию, последний столбец, представляющий «прогулы в часах», должен быть исключен из кластеризации, а затем скопирован для последующего сравнения. Я создал список кластеров, используя метод KMeans, и добавил их к новому фрейму данных, содержащему только идентификатор, количество отсутствующих часов, кластер и диапазоны отсутствующих часов в бинарном формате. Когда я смотрю на эту таблицу, я вижу очень мало наблюдаемой кластеризации, поскольку все кластеры встречаются во всех диапазонах. Вот первые несколько строк моей таблицы (отсортированные по кластерам):

      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)

Любой вклад, который вы могли бы предоставить, был бы очень признателен. Насколько я понимаю, я определенно должен видеть какую-то корреляцию между мусорными ведрами и кластерами. Спасибо всем заранее.

1 Ответ

0 голосов
/ 02 апреля 2019

Предварительно обработайте ваши данные соответствующим образом!

Не включать столбцы идентификаторов.

Не используйте кодированные столбцы (не вычисляйте различия кодов ICD).

Зачем вы включаете день недели и т. Д.? 1007 *

Подумайте, какую функцию пытается оптимизировать алгоритм - имеет ли это смысл для ваших данных?

...