我正在开展一个项目,旨在利用我的数据集的集群结构来改进用于binray分类的监督主动学习分类器。我使用以下代码使用scikit-leanr的K-Means实现来集群我的数据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%,我们确保我们识别具有任何正实例的所有聚类。因此,我们能够快速减少具有潜在积极因素的数据集的大小。然后可以将该parital数据集用于主动学习。我们的方法受'Hierarchical Sampling for Active Learning'
的启发答案 0 :(得分: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%
积分进行主动学习?