对于二进制分类,我如何按列对数据进行采样,以便 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) 标签(值 0
或 1
)。这个数据集是不平衡的——它包含的零比一个多得多。数据如下:
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])]
)
这里我基本上是对不同的组应用不同的函数。
我有一个包含毛皮列的大型数据集,第三列包含 (binay) 标签(值 0
或 1
)。这个数据集是不平衡的——它包含的零比一个多得多。数据如下:
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])]
)
这里我基本上是对不同的组应用不同的函数。