对于二进制分类,我如何按列对数据进行采样,以便 2/3 的数据包含零,而 1/3 的数据包含 1?

For a binary classification, how can I sample data by column so that 2/3 of the data contains zeros and 1/3 contains ones?

我有一个包含毛皮列的大型数据集,第三列包含 (binay) 标签(值 01)。这个数据集是不平衡的——它包含的零比一个多得多。数据如下:

3   5   0   0.4
4   5   1   0.1
5   13  0   0.5
6   10  0   0.8
7   25  1   0.3
:   :   :   :

我知道我可以获得包含 50% 零和 50% 1 的平衡子集,例如:

df_sampled = df.groupby(df.iloc[:,2]).sample(n=20000, random_state=1)

但是我该如何修改上面给出的单行代码来改变零和一的比例呢?例如,我如何(通过第三列)对这些数据进行采样,以便 2/3 的数据包含零,而 1/3 的数据包含 1?

这是一个可能的解决方案:

n_samples = 90000 # total number of samples

df_sampled = pd.concat(
    [group.sample(n=int(n_samples * 2 / 3)) if label == 0
     else group.sample(n=int(n_samples * 1 / 3))
     for label, group in df.groupby(df.iloc[:, 2])]
)

类似的解决方案是:

n_samples = 90000 # total number of samples
ratios = [2 / 3, 1 / 3]

df_sampled = pd.concat(
    [group.sample(n=int(n_samples * ratios[label]))
     for label, group in df.groupby(df.iloc[:, 2])]
)

这里我基本上是对不同的组应用不同的函数。