4. 样本偏差类型(中):选择偏差——仅使用通过规则的数据作为样本,忽略被拒绝的样本
选择偏差(Selection Bias)是实时风控建模中最隐蔽、破坏力最强的样本偏差之一。当建模团队仅使用“通过规则”的样本(即历史审批通过、未触发风控拦截的样本)来训练模型,而完全丢弃被拒绝的样本时,模型将无法学习到拒绝样本的真实风险分布,导致模型在线上对高风险客群的识别能力严重退化。
4.1 选择偏差的产生机制
在实时风控系统中,样本的生成过程天然存在过滤漏斗:
- 全量请求 → 进入风控引擎
- 规则拦截 → 高风险请求被拒绝(拒绝样本)
- 规则通过 → 进入模型评分环节(通过样本)
- 模型决策 → 部分通过样本被放行
- 贷后表现 → 仅放行样本产生逾期标签
当建模时只取第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流程示意图
下图展示了选择偏差如何从全量样本中“截断”出有偏的训练集:
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测试,对比新旧模型在拒绝回捞样本上的表现。