2017-03-12 49 views
1

我正在开发一个项目,旨在利用我的数据集的集群结构来改进用于Binray分类的受监督的主动学习分类器。我用下面的代码中使用scikit-leanr的K均值执行群集我的数据,X随机抽样每个集群的百分比

k = KMeans(n_clusters=(i+2), precompute_distances=True,).fit(X) 
df = pd.DataFrame({'cluster' : k.labels_, 'percentage posotive' : y}) 
a = df.groupby('cluster').apply(lambda cluster:cluster.sum()/cluster.count()) 

这两个类是正(由1表示)和负(用0表示),并存储在一个数组y。 此代码首先集群X,然后在数据框中存储每个簇的数量和其中的正实例的百分比数。

我现在想从每个群集中随机选择点,直到我采样了15%。我怎样才能做到这一点?

如这里要求是包括测试数据集的简化脚本:

from sklearn.cluster import KMeans 
import pandas as pd 
X = [[1,2], [2,5], [1,2], [3,3], [1,2], [7,3], [1,1], [2,19], [1,11], [54,3], [78,2], [74,36]] 
y = [0,0,0,0,0,0,0,0,0,1,0,0] 
k = KMeans(n_clusters=(4), precompute_distances=True,).fit(X) 
df = pd.DataFrame({'cluster' : k.labels_, 'percentage posotive' : y}) 
a = df.groupby('cluster').apply(lambda cluster:cluster.sum()/cluster.count()) 
print(a) 

注:的真实数据是由数以千计的功能和成千上万的数据实例的大得多。

针对@SandipanDey

我不能告诉你太多,但基本上我们正在处理一个高度不平衡的数据集(1:10,000),我们只能识别少数类实例兴趣召回率> 95%,同时减少所需标签的数量。 (召回需要与医疗保健有关。)

少数示例集群在一起,任何包含正实例的集群通常至少包含x%,因此通过抽样x%我们确保我们确定所有与任何正面实例聚类。因此,我们能够快速减小数据集的大小,并有可能带来积极的影响。这个组合数据集可以用于主动学习。我们的做法是由松散'Hierarchical Sampling for Active Learning'

+0

我不认为你也代表否定与1也。无论如何,你发布一个(小)示例数据集来做到这一点? – Denziloe

+1

@Denziloe好,赶紧编辑吧。将很快添加小型测试数据集。 – scutnex

+0

@Denziloe添加了测试数据集。 – scutnex

回答

1

启发。如果我​​的理解是否正确,下面的代码应该服务宗旨:

import numpy as np 

# For each cluster 
# (1) Find all the points from X that are assigned to the cluster. 
# (2) Choose x% from those points randomly. 

n_clusters = 4 
x = 0.15 # percentage 

for i in range(n_clusters): 

    # (1) indices of all the points from X that belong to cluster i 
    C_i = np.where(k.labels_ == i)[0].tolist() 
    n_i = len(C_i) # number of points in cluster i 

    # (2) indices of the points from X to be sampled from cluster i 
    sample_i = np.random.choice(C_i, int(x * n_i)) 
    print i, sample_i 

只是出于好奇,你打算怎么使用这些x%点主动学习?

+1

谢谢!已经提供了方法的简要说明 – scutnex

+0

非常感谢@scutnex添加描述,非常感谢。 –