如何在python中按条件应用聚类

时间:2019-05-16 11:12:47

标签: python k-means unsupervised-learning

我有一个大约5万个样本的数据集,它包含2个特征,其中第一个是二进制特征,第二个是连续特征。

我想使用python来使用聚类方法来创建2个类别。

PS :我无法指定何时严格限制第一个类别以制定规则。我需要有一个大多数数字= 0的类别,即我的目标是在我的数据中必须删除一部分。它的col_A值大部分为0,我需要删除它们,但我不知道它们的限制位置

我的数据如下:

id        Col_A       Col_B
1           0           2
2           0           3
3           1          25 
4           0          17
5           0           9
6           1          30
7           1           1
8           1          12
9           1           3
10          0           6

我想得到2个簇

  • 第一类是关于包含少量数字的行,并且Col_A值的大多数为0。

  • ,第二个类别应包含更大的数字,而不管Col_A的值如何。

类别1必须具有:

id        Col_A       Col_B     
1           0           2
2           0           3
5           0           9
7           1           1
9           1           3
10          0           6

类别2必须具有:

id        Col_A       Col_B    
3           1          25 
4           0          17
6           1          30
8           1          12

如何将第一类必须以0的多数作为Col_A的值强加给聚类算法

我已经使用了以下代码,但是它不能正常工作。

from sklearn.cluster import KMeans
import numpy as np

data = np.array([[0, 2], [0, 3], [1, 25],[0, 17], [0, 9], [1, 30], [1, 1],[1, 12], [1, 3], [0, 6]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(data)
kmeans.labels_

df = pd.DataFrame(data) 
df['categories'] = kmeans.labels_

我遇到了诸如“ 18”这样的问题,必须将其归类为第2类。

Col_A      Col_B        Category
0            2           Cat_1
0            3           Cat_1
1           12           Cat_2
0           17           Cat_2
0            9           Cat_1
1           30           Cat_2
1            1           Cat_1
1           18           Cat_1
0            3           Cat_1
0            6           Cat_1

当我处理真实数据时,即使用大量样本时,我得到错误的分类。我该如何解决这种情况

2 个答案:

答案 0 :(得分:0)

首先,如果您的聚类依赖于列B并且您知道边界是什么,那么听起来好像不需要无监督算法,并且如果column_ B boundary则可以分配标签1。

如果您仍想使用无监督的聚类算法,请尝试重新缩放列。与其对列进行标准化(通常的方法)(在算法中使所有列具有相同的“重要性”),不如将列B中的所有数字乘以某个因子(比方说乘以10),然后再次进行聚类。这将使B列更加“重要”。

答案 1 :(得分:0)

Kmeans是一种无监督的学习算法,不能保证找到全局最优值。

在这种情况下,为什么不使用熊猫并按条件分配组。

df = pd.DataFrame(data)
df1 = df[df.column2 > x]
df2 = df[df.column2 <= x]