我有一个数据集,该数据集的二进制目标变量分割为4/96%。我想创建一个50/50分割的数据子集。我想知道你们认为在Python中执行此操作的最佳方法是,如果我想保留所有4%的0,并将其与相同数量的1匹配,或者从每个级别使用固定数量进行采样。谢谢!
您可以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
一般的答案(不是硬性地连接到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)