You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

数据集分层抽样时触发ValueError:Cannot take a larger sample than population when 'replace=False'

解决分层抽样时样本量超出分组规模的报错问题

这个问题我之前也碰到过,核心原因非常明确:你的数据集中至少有一个Label分组的样本数量不足1000条,而pandassample()方法默认使用无放回抽样(replace=False),这种情况下无法从规模更小的群体中抽取更多不重复的样本,于是抛出了这个ValueError

下面给你几种不同场景下的解决方案:

方案1:允许有放回抽样(适合可以接受重复样本的场景)

如果你的业务场景允许抽取重复数据,只需要给sample()方法加上replace=True参数,这样当分组样本量不足时,会重复抽取已有数据来凑够1000条:

Strat_d3 = d3.groupby('Label', group_keys=False).apply(lambda x: x.sample(1000, replace=True))

方案2:无放回抽样,取分组的最大可用样本量(适合要求样本不重复的场景)

如果不能接受重复样本,可以调整抽样逻辑:每个分组最多抽取1000条,若分组本身样本量不足,则直接取全部数据:

Strat_d3 = d3.groupby('Label', group_keys=False).apply(lambda x: x.sample(min(1000, len(x))))

你也可以选择按比例抽样,比如每个分组抽取30%的样本(这样所有分组的抽样比例一致,避免数量差异):

Strat_d3 = d3.groupby('Label', group_keys=False).apply(lambda x: x.sample(frac=0.3))

方案3:先排查分组规模,做均衡化抽样

如果你希望每个分组的抽样数量保持一致,可以先查看所有Label分组的样本数量:

# 查看各Label分组的样本量分布
print(d3['Label'].value_counts())

然后以样本量最小的分组为基准,统一抽取对应数量的样本,保证分层抽样的均衡性:

min_group_size = d3['Label'].value_counts().min()
Strat_d3 = d3.groupby('Label', group_keys=False).apply(lambda x: x.sample(min_group_size))

内容的提问来源于stack exchange,提问作者adnane27x

火山引擎 最新活动