[50/50 python采样

问题描述 投票:-2回答:2

我有一个数据集,该数据集的二进制目标变量分割为4/96%。我想创建一个50/50分割的数据子集。我想知道你们认为在Python中执行此操作的最佳方法是,如果我想保留所有4%的0,并将其与相同数量的1匹配,或者从每个级别使用固定数量进行采样。谢谢!

python pandas numpy sampling
2个回答
0
投票

您可以groupby()您的二进制变量,然后从每个组中采样。

生成一些随机数据:

>>> df = pd.DataFrame([{'variable': ''.join(random.sample('abcdefghijklmnopqrstuvwxyz', 4)), 'outcome': (random.random() > .94)} for i in range(100)])

>>> print(df)
    outcome variable
0     False     irlk
1     False     ylmp
2     True      przk
3     False     xldf
4     False     oxsp
5     False     uytn
6     False     ifmw
7     True      lepa
8     False     zfvm
...
99    False     qjek
100   False     umtw

根据需要提供样品:

>>> num_samples = 3
>>> df.groupby('outcome').apply(lambda x: x.sample(num_samples))
            outcome variable
outcome                     
False   71    False     jdrp
        98    False     eqrj
        78    False     tnzl
True    29     True     uvjr
        36     True     tiwn
        63     True     tabr

0
投票

一般的答案(不是硬性地连接到4/96拆分)是将数据分为两组(0组和1组),然后从每个分区中根据需要进行采样。 (该技术称为“ stratified random sampling”)。

# Partition based on the target variable
group0 = [record for record in data if not record.target_variable]
group1 = [record for record in data if record.target_variable]

# Pick as many as needed from each partition
subgroup0 = random.sample(group0, k=4) 
subgroup1 = random.sample(group1, k=4)

# Combine and shuffle the results
combined = subgroup0 + subgroup1
random.shuffle(combined)
© www.soinside.com 2019 - 2024. All rights reserved.