【发布时间】:2018-05-14 11:44:19
【问题描述】:
考虑如下所示的类分布偏斜的人口
ErrorType Samples
1 XXXXXXXXXXXXXXX
2 XXXXXXXX
3 XX
4 XXX
5 XXXXXXXXXXXX
我想从 40 个中随机抽取 20 个样本,而不会对参与人数较少的任何课程进行欠采样。例如在上面的情况下,我想采样如下
ErrorType Samples
1 XXXXX|XXXXXXXXXX
2 XXXXX|XXX
3 XX***|
4 XXX**|
5 XXXXX|XXXXXXX
即-1型和-2型的5个和-3型的,-3型的2个和-4型的3个
- 这保证我的样本大小接近我的目标,即 20 个样本
- 没有一个课程参与其中,尤其是课程 -3 和 -4。
我最终写了一个迂回的代码,但我相信可以有更简单的方法来利用 pandas 方法或一些 sklearn 函数。
sample_size = 20 # Just for the example
# Determine the average participaction per error types
avg_items = sample_size / len(df.ErrorType.unique())
value_counts = df.ErrorType.value_counts()
less_than_avg = value_counts[value_counts < avg_items]
offset = avg_items * len(value_counts[value_counts < avg_items]) - sum(less_than_avg)
offset_per_item = offset / (len(value_counts) - len(less_than_avg))
adj_avg = int(non_act_count / len(value_counts) + offset_per_item)
df = df.groupby(['ErrorType'],
group_keys=False).apply(lambda g: g.sample(min(adj_avg, len(g)))))
【问题讨论】:
-
所以提供的数据是您实际拥有的数据还是为了说明问题?
-
@Bharath:用于说明目的。
-
出于好奇,您是否可以向我们展示实际数据的样本?我看到的所有数据都是要替换的正则表达式。但这与字符串无关吧?
-
数据采用
pandas.dataframe的形式,包含 100 列和数百万行各种数据类型(字符串、整数、浮点数、基数)。我用来分层的类是一个类别代码,目前有 15 个类别代码,但会增长。我的用例是 ML,而不是一些文本处理。请参考我在问题中包含的示例代码。 -
现在很有趣。您想要从每行中抽取最多 5 个样本的样本,对吗?即使一行少于 5 行,它们都应该存在。
标签: python pandas scikit-learn statistics