You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL实现多数类欠采样?现有代码无法随机筛选目标值为0的行的解决方案咨询

解决欠采样SQL的问题

嘿,我明白你的问题啦!你之前的SQL之所以没起作用,是因为partition by user_id, target这个分区条件出了问题——毕竟每个user_id都是唯一的,所以每个分组里只有一行数据,row_number()生成的seq自然全是1,最后where条件等于把所有行都留下来了,根本没实现欠采样的效果。

我给你两种常用的修正方案,根据你的需求选就行:

方案1:让target=0的样本数量和target=1一致

这种方案会保留所有target=1的用户,然后随机选取和target=1数量相同的target=0用户,适合平衡两类样本的场景:

WITH target_1_data AS (
    -- 先保留所有target=1的行
    SELECT user_id, target 
    FROM dataset.mytable 
    WHERE target = 1
),
target_0_sampled AS (
    -- 对target=0的行随机排序,取和target=1数量相同的样本
    SELECT user_id, target
    FROM (
        SELECT user_id, target,
               ROW_NUMBER() OVER (ORDER BY RAND()) AS seq
        FROM dataset.mytable 
        WHERE target = 0
    ) t
    WHERE seq <= (SELECT COUNT(*) FROM dataset.mytable WHERE target = 1)
)
-- 合并两类样本
SELECT * FROM target_1_data
UNION ALL
SELECT * FROM target_0_sampled;

方案2:按比例随机选取target=0的样本

如果你想按固定比例(比如保留30%的target=0用户)来采样,可以用这个方案:

WITH target_1_data AS (
    SELECT user_id, target 
    FROM dataset.mytable 
    WHERE target = 1
),
target_0_sampled AS (
    SELECT user_id, target
    FROM dataset.mytable 
    WHERE target = 0
    ORDER BY RAND()
    -- 这里的0.3就是你想要保留的target=0样本比例,可自行调整
    LIMIT (SELECT COUNT(*) * 0.3 FROM dataset.mytable WHERE target = 0)
)
SELECT * FROM target_1_data
UNION ALL
SELECT * FROM target_0_sampled;

简单总结下核心修改点:

  • 不再按user_id分区,而是直接对所有target=0的行做全局随机排序
  • 通过ROW_NUMBER()或者LIMIT来控制采样的数量,实现欠采样的目标

内容的提问来源于stack exchange,提问作者user16228179

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:37:45