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

Posted

技术标签:

【中文标题】如何在python中按条件应用聚类【英文标题】:How can I apply clustering by condition in python 【发布时间】:2019-10-03 15:41:06 【问题描述】:

我有一个大约 50 000 个样本的数据集,它包含 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

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

【问题讨论】:

Kmeans 是一种无监督算法,用外行的话来说意味着它将根据在数据中找到的某种模式对数据进行聚类。在你的情况下,你知道如何对数据进行聚类,你应用 K 意味着,只需编写规则并完成它! 如何定义小数/大数之间的界限?如果允许分隔具有多数 0 的最小数字是“大”数字怎么办? 我无法指定第一个类别何时被严格限制为制定规则。我需要有一个大多数数字 = 0 的类别,即在我的数据中有一部分我必须消除它,其中大部分 col_A 值为 0 我需要删除它们,但我不知道它们限制在哪里 难道你不能贪婪地从边界值 1 开始迭代,然后是 2、3... 看看是否给出了符合你要求的分割?我认为您需要更详细地定义您的问题。机器学习算法通常近似,除了验证准确性之外,它们不保证太多。 【参考方案1】:

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

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

【讨论】:

我应该将每个 col_B 乘以相同的数字吗? 但我需要更多地关注第一列,其中第一个类别的大多数数字必须为 0。 我不认为无监督算法在这种情况下会有用。听起来更好的选择是手动标记数据集的一部分,然后使用神经网络来学习规则。 不幸的是!我是机器学习的初学者,我从来没有学过神经网络。你能帮我如何通过使用神经网络来制作 python 源代码来解决这个问题,或者向我建议我应该阅读什么以获得解决方案【参考方案2】:

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

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

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

【讨论】:

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

以上是关于如何在python中按条件应用聚类的主要内容,如果未能解决你的问题,请参考以下文章

随机森林分类如何在幕后工作?

serversocket 类如何在同一个端口上服务多个客户端连接?

java 父类如何在运行期动态获取子类类名

外键和引用类如何在 Hibernate 实体中一起存在?

idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用

如何使用 k-means (Flann with python) 对文档进行聚类?