4. 样本偏差类型(中):选择偏差——仅使用通过规则的数据作为样本,忽略被拒绝的样本

选择偏差(Selection Bias)是实时风控建模中最隐蔽、破坏力最强的样本偏差之一。当建模团队仅使用“通过规则”的样本(即历史审批通过、未触发风控拦截的样本)来训练模型,而完全丢弃被拒绝的样本时,模型将无法学习到拒绝样本的真实风险分布,导致模型在线上对高风险客群的识别能力严重退化。

4.1 选择偏差的产生机制

在实时风控系统中,样本的生成过程天然存在过滤漏斗:

  1. 全量请求 → 进入风控引擎
  2. 规则拦截 → 高风险请求被拒绝(拒绝样本)
  3. 规则通过 → 进入模型评分环节(通过样本)
  4. 模型决策 → 部分通过样本被放行
  5. 贷后表现 → 仅放行样本产生逾期标签

当建模时只取第5步“有标签的通过样本”,而忽略第2步被拒绝的样本时,就产生了截断选择偏差。模型实际上是在学习“在已有规则筛选后的低风险子集”上的风险规律,而非全量客群的真实风险分布。

核心问题:被拒绝的样本中,如果放行,其逾期率往往远高于通过样本。模型从未见过这些高风险模式,上线后一旦规则松动或新客群涌入,模型将对这些“陌生”的高风险样本完全失效。

4.2 选择偏差的量化影响

下表展示了某消费金融产品在建模时仅使用通过样本(忽略拒绝样本)导致的性能退化:

指标 全量样本(含拒绝推断) 仅通过样本(选择偏差) 退化幅度
训练样本量 500,000 120,000 -76%
坏样本率 8.5% 3.2% -62%
KS(验证集) 0.42 0.31 -26%
线上AUC(新客群) 0.78 0.61 -22%
拒绝样本逾期率(估计) 18.7% 未知(被丢弃) —

从表中可以看出,仅使用通过样本不仅大幅减少了样本量,更严重的是低估了真实坏样本率(3.2% vs 8.5%),导致模型对风险水平的判断整体偏乐观。

4.3 选择偏差在SQL中的典型表现

以下SQL模式是选择偏差最常见的代码级体现——建模人员直接从“最终放款表”取数,跳过了拒绝记录:

-- ❌ 错误做法:仅取通过规则的样本,存在选择偏差
CREATE TABLE model_training_sample AS
SELECT
    a.user_id,
    a.apply_time,
    a.feature_1,
    a.feature_2,
    a.feature_3,
    CASE WHEN b.overdue_days > 30 THEN 1 ELSE 0 END AS label
FROM approved_application a          -- 仅通过规则的申请表
LEFT JOIN loan_performance b
    ON a.loan_id = b.loan_id
WHERE a.apply_date >= '2024-01-01'
  AND a.apply_date < '2024-07-01';
-- 被拒绝的样本(rejected_application)完全未参与训练

正确的做法应当包含拒绝样本,并通过拒绝推断(Reject Inference)为拒绝样本赋予伪标签或调整权重:

-- ✅ 正确做法:合并通过样本与拒绝样本,为拒绝样本预留标签占位
CREATE TABLE model_training_sample_correct AS
SELECT
    user_id,
    apply_time,
    feature_1,
    feature_2,
    feature_3,
    -- 通过样本使用真实标签,拒绝样本标签为NULL(后续通过拒绝推断赋值)
    CASE 
        WHEN is_approved = 1 AND overdue_days > 30 THEN 1
        WHEN is_approved = 1 AND overdue_days <= 30 THEN 0
        ELSE NULL  -- 拒绝样本,待推断
    END AS label,
    is_approved AS sample_type  -- 1=通过, 0=拒绝
FROM (
    -- 通过样本
    SELECT a.*, 1 AS is_approved, b.overdue_days
    FROM approved_application a
    LEFT JOIN loan_performance b ON a.loan_id = b.loan_id
    UNION ALL
    -- 拒绝样本(无贷后表现)
    SELECT r.*, 0 AS is_approved, NULL AS overdue_days
    FROM rejected_application r
) all_samples
WHERE apply_date >= '2024-01-01'
  AND apply_date < '2024-07-01';

4.4 选择偏差的三种常见子类型

  • 截断偏差(Truncation Bias):完全丢弃拒绝样本,模型只学习通过样本的分布。这是最严重的形式。
  • 样本选择偏差(Sample Selection Bias):虽然保留了拒绝样本,但拒绝样本的标签缺失,且未做任何推断处理,导致模型训练时自动忽略这些样本。
  • 生存偏差(Survivorship Bias):只观察“存活”到贷后表现期的样本,忽略了早期被拒绝或提前结清的样本,导致模型高估风险。
实战建议:在搭建实时风控SQL流水线时,务必在ETL阶段保留全量申请记录(含拒绝),并增加 is_approved 标记字段。拒绝样本的标签虽然缺失,但可以通过模糊展开法或两阶段模型法进行推断,避免选择偏差。

4.5 选择偏差的SVG流程示意图

下图展示了选择偏差如何从全量样本中“截断”出有偏的训练集:

选择偏差产生示意图:仅通过样本 vs 全量样本 全量申请样本(100%) 规则引擎拦截 拒绝样本(约40%) 通过样本(约60%) ❌ 被丢弃(无标签) ✅ 进入模型训练 模型:仅学习通过样本的低风险模式 对拒绝样本的高风险模式完全未知 选择偏差导致模型在线上遇到“陌生”高风险客群时,AUC下降可达0.15~0.25

4.6 选择偏差的检测与修复策略

在实时风控SQL流水线中,可以通过以下步骤检测和修复选择偏差:

步骤 SQL/操作 目的
1. 偏差检测 SELECT sample_type, COUNT(*) FROM all_samples GROUP BY sample_type 统计通过样本与拒绝样本的比例,若拒绝样本占比>20%且未被纳入训练,则存在选择偏差
2. 分布对比 对比通过样本与拒绝样本在关键特征(如收入、年龄、多头借贷数)上的分布差异 若拒绝样本的特征分布与通过样本存在显著偏移(KS>0.2),则偏差严重
3. 拒绝推断 使用模糊展开法:对拒绝样本按通过概率分层,赋予加权伪标签 为拒绝样本补充标签,使训练集更接近全量分布
4. 模型校准 在模型输出层增加拒绝样本偏移校正项 调整模型对拒绝样本的预测概率,使其与真实风险对齐
5. 线上监控 实时监控模型评分在拒绝回捞样本上的分布变化 若模型对回捞样本的评分持续偏高,说明选择偏差未被有效修复
常见误区:有些团队认为“拒绝样本没有真实标签,所以无法使用”,于是直接丢弃。这是错误的。拒绝样本虽然没有贷后表现标签,但可以通过规则引擎的拦截强度作为弱标签,或使用半监督学习方法进行推断。完全丢弃拒绝样本等于主动放弃40%~60%的样本信息,模型上线后必然出现严重的性能衰退。

4.7 选择偏差与拒绝推断的SVG架构图

下图展示了如何通过拒绝推断将拒绝样本重新纳入训练流程,修复选择偏差:

拒绝推断修复选择偏差:全量样本训练架构 全量申请样本 拒绝样本(无标签) 通过样本(有标签) 拒绝推断模块 模糊展开 / 两阶段模型 拒绝样本 + 伪标签 全量训练集(无选择偏差) 拒绝推断将拒绝样本的“未知风险”转化为可学习的信号,使模型覆盖全量客群分布

4.8 实战要点总结

  • 不要只从放款表取数:建模SQL必须 UNION ALL 通过表与拒绝表,保留 is_approved 标记。
  • 拒绝样本占比越高,选择偏差越严重:当拒绝率 > 30% 时,必须使用拒绝推断,否则模型上线后KS可能下降0.1以上。
  • 拒绝推断不是万能药:推断的准确性依赖于通过样本与拒绝样本的可比性。若规则引擎存在系统性偏差(如对某群体全部拒绝),推断效果会受限。
  • 线上A/B测试验证:修复选择偏差后,建议在线上进行小流量A/B测试,对比新旧模型在拒绝回捞样本上的表现。