创建将样本与组关联的一维数组

时间:2018-11-09 18:57:34

标签: python machine-learning indexing

这并不是一个技术问题,而是编写清晰的代码之一,因为我觉得我当前的解决方案可能会更容易。如您所见,我在机器学习领域工作,并且研究了Sklearns train_test_split之类的函数,但它们并不能完全满足我的需求。

免责声明

考虑到我要执行的相对简单的任务,我认为以下代码笨重且难看。我已尽力将其描述得尽可能简单。

问题

我有一个未知长度n的样本列表。每个样本都与一个“数据组”相关联 我有一个名为数据组的类的列表data_groups,具有名称和分数属性。 分数表示与该数据组相关的样本总数的哪一部分。

data_groups = [Datagroup('train',0.70),
               Datagroup('test', 0.15),
               Datagroup('val',  0.15)]

现在我想要一个长度为n的向量,该向量可以告诉我样本对应于哪个数据组。

当前解决方案

我们要做的第一件事是根据给定的分数计算每组中有多少个样本。当前的方法有点粗糙(将舍入引起的所有误差都通过从第一组中减去而被盲目考虑)并且体积大:

# Get all the fractions from the `data_groups` list
fractions = [group.frac for group in data_groups]

# Compute the rough number of samples per data_group
group_samples_n = np.ceil([frc * len(sample_list) for frc in fractions]).astype(int) 

# Account for rounding errors
    group_samples_n[0] = group_samples_n[0] - sum(group_samples_n) + len(sample_list)

第二个问题是将这些信息转换为所需的标签数组,并且看起来整体上过于庞大:

# Get where each group would end
cumulative_samples = np.cumsum(group_samples_n)

# Preallocate array
pt_groups_idx = np.full(len(pt_paths), np.nan)

# Set start
pt_groups_idx[:cumulative_samples[0]] = 0
# Loop over the rest
for i in range(1,len(cumulative_samples)):
    pt_groups_idx[cumulative_samples[i-1]:cumulative_samples[i]] = i
pt_groups_idx = pt_groups_idx.astype(int)

如果您知道任何功能,我可能会尝试使此代码更具可读性,或者知道任何(部分)解决方案,请发表评论! 预先感谢。

0 个答案:

没有答案