我已经查看了Sklearn stratified sampling docs、pandas docs以及Stratified samples from Pandas和sklearn stratified sampling based on a column,但它们都没有解决这个问题。
我正在寻找一种快速的pandas/sklearn/numpy方法来从数据集中生成大小为n的分层样本。但是,对于少于指定采样数的行,它应该取所有的条目。
具体例子:
谢谢你们!
我已经查看了Sklearn stratified sampling docs、pandas docs以及Stratified samples from Pandas和sklearn stratified sampling based on a column,但它们都没有解决这个问题。
我正在寻找一种快速的pandas/sklearn/numpy方法来从数据集中生成大小为n的分层样本。但是,对于少于指定采样数的行,它应该取所有的条目。
具体例子:
谢谢你们!
5条答案
按热度按时间hmtdttj41#
当传递数字到sample时使用
min
。考虑 Dataframedf
nzkunb0c2#
扩展
groupby
的答案,我们可以确保样本是平衡的。为此,当所有类的样本数〉=n_samples
时,我们可以只取n_samples
作为所有类的样本数(前面的答案)。当少数类包含〈n_samples
时,我们可以取所有类的样本数与少数类的样本数相同。sc4hvdpw3#
下面的示例总共有N行,其中每个组都按其原始比例显示为最接近的整数,然后使用以下命令对索引进行混洗和重置:
简短而甜蜜:
长版本
pu3pd22g4#
所以我尝试了上面所有的方法,它们仍然不太是我想要的(会解释为什么)。
步骤1:是的,我们需要
groupby
这个目标变量,让我们称之为target_variable
。所以代码的第一部分看起来像这样:我设置了
group_keys=False
,因为我没有尝试将索引继承到输出中。步骤2:使用
apply
从target_variable
内的各种类中进行采样。这就是我发现上面的答案不太普遍的地方。在我的例子中,这是我在
df
中的标签编号:所以你可以看到我的
target_variable
是多么的不平衡。我需要做的是确保我把S1
标签的数量作为每个类的最小样本数量。这就是@piRSquared答案所缺少的。然后你要在类编号的
min
(这里是799
)和每个类的编号之间进行选择。这不是一个通用规则,你可以选择其他编号。例如:它将给予最小类的
max
与每个类的数量的比较。他们回答中的另一个技术问题是,建议您在采样后对输出进行洗牌。就像您不希望所有
S1
样本都在连续的行中,那么S2
,你要确保你的行是随机堆叠的,这时sample(frac=1)
就进来了,值1
是因为我想在洗牌后返回所有的数据。如果您出于任何原因需要更少的样本,请随意提供像0.6
这样的分数,它将返回原始样本的60%。步骤3:最后一行对我来说是这样的:
我在
np.unique(df['target_variable]. return_counts=True)[1]
中选择索引1,因为这适合于将每个类的编号作为numpy array
。请根据需要随意修改。sdnqo3pr5#
根据使用者
piRSquared
的回应,我们可能有: