如何在保留少数类的所有样本的同时,为多数类的欠采样行编写bigquery SQL?

如何在保留少数类的所有样本的同时,为多数类的欠采样行编写bigquery SQL?,sql,google-bigquery,Sql,Google Bigquery,我正在尝试获取二进制分类问题的数据。数据集严重失衡。我可以下载数据并对大多数类进行欠采样,但我想知道如何使用BigQuerySQL直接进行欠采样 换句话说,我想选择目标列为1的所有样本,如果目标列为0,则忽略大量数据 样本数据集 id feat_1 feat_2 target 1 x_1 y_1 0 2 x_2 y_4 1 3 x_3 y_1 0 4 x_1

我正在尝试获取二进制分类问题的数据。数据集严重失衡。我可以下载数据并对大多数类进行欠采样,但我想知道如何使用BigQuerySQL直接进行欠采样

换句话说,我想选择目标列为
1
的所有样本,如果目标列为
0
,则忽略大量数据

样本数据集

id   feat_1    feat_2    target
1     x_1        y_1       0
2     x_2        y_4       1
3     x_3        y_1       0
4     x_1        y_1       1
5     x_2        y_4       0
6     x_2        y_1       0
.
.
.

我是否可以选择目标
0
的随机样本,以便在随机抽样中不会完全丢失feat_2值?

您可以尝试执行以下命令从表中获取一些随机值

SELECT * FROM table where rand() < Sample_no/Total_no and  target=0
从表中选择*,其中rand()

其中,
Sample\u no
是您需要作为输出的样本记录的数量,
Total\u no
是表上记录的数量。

您可以在每个
feat\u 2
中提取一行
0

select t.*
from (select t.*,
             row_number() over (partition by feat_2, target order by rand()) as seqnum
      from t
     ) t
where target = 1 or seqnum = 1;
上面返回所有
1
s,然后每个
feat\u 2
返回一行
0

如果希望每个
feat_2
有一行偏向
1
s,则可以使用:

select t.*
from (select t.*,
             row_number() over (partition by feat_2 order by target desc, rand()) as seqnum
      from t
     ) t
where seqnum = 1;