如何在保留少数类的所有样本的同时,为多数类的欠采样行编写bigquery SQL?
我正在尝试获取二进制分类问题的数据。数据集严重失衡。我可以下载数据并对大多数类进行欠采样,但我想知道如何使用BigQuerySQL直接进行欠采样 换句话说,我想选择目标列为如何在保留少数类的所有样本的同时,为多数类的欠采样行编写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
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;