考虑不平衡的分层抽样分为3组

Posted

技术标签:

【中文标题】考虑不平衡的分层抽样分为3组【英文标题】:Stratified sampling into 3 sets considering unbalance 【发布时间】:2021-01-16 09:29:48 【问题描述】:

我已经调查了Stratified sample in pandas、stratified sampling on ranges 等,但他们没有专门评估我的问题,因为我希望将数据随机分成 3 组。

我有一个 10k 行的不平衡数据框,10% 是正类,90% 是负类。我试图找出一种方法将此数据帧拆分为 3 个数据集,考虑到不平衡,分别为数据帧的 60%、20%、20%。但是,这种拆分必须是随机且不可替换的,这意味着如果我将 3 个数据集放在一起,它必须等于原始数据帧。

通常我会使用train_test_split(),但它仅在您希望拆分为两个而不是三个数据集时才有效。

有什么建议吗?

可重现的例子:

df = pd.DataFrame("target" : np.random.choice([0,0,0,0,0,0,0,0,0,1], size=10000), index=range(0,10000,1))

【问题讨论】:

【参考方案1】:

两次使用 train_test_split() 怎么样? 第一次,使用train_size=0.6,获得60%的训练集和40%(测试+有效)集。 第二次,使用train_size=0.5,获得了 50%*40%=20% 的验证和 20% 的测试。 此解决方法对您有效吗?

【讨论】:

这是一种解决方法,但严格来说不是随机的,因为最后一个拆分是前一个拆分的子拆分。 您能再解释一下吗?如果随机,你的意思是每个样本有 60% 的机会在训练中,20% 的机会在验证中,20% 的机会在测试中,这对所有样本都是一样的,那么方法以上应该是随机的。为什么你认为不是?

以上是关于考虑不平衡的分层抽样分为3组的主要内容,如果未能解决你的问题,请参考以下文章

train_test_split, 关于随机抽样和分层抽样

来自不平衡数据的分层平衡采样(机器学习)[重复]

随机森林的分层抽样-Python

cut与分层抽样(Stratified Sampling)

分层区组随机化及R语言实现(blockrand包)

随机抽样的 SQL 分区