2. 样本偏差问题:申请评分卡中的样本选择性偏差、拒绝样本与通过样本的分布差异
好,咱们接着聊。上一章我讲了拒绝推断为什么重要,这一章咱们深入看看——样本偏差到底是怎么一回事。
说白了,你手头能拿到的“好客户”和“坏客户”数据,本身就不干净。为什么?因为你能观察到的,都是已经被审批通过的客户。那些被拒绝的客户,你根本不知道他们后来有没有违约。
这就引出了两个核心问题:
- 样本选择性偏差——你看到的样本,不是随机样本
- 分布差异——通过样本和拒绝样本,根本就不是同一群人
2.1 样本选择性偏差:你看到的只是冰山一角
我刚开始做评分卡时,犯过一个低级错误。当时我拿历史通过客户的还款表现去训练模型,自我感觉良好,AUC 做到 0.78。结果一上线,实际效果直接腰斩。
为什么会这样?
你想想看,审批通过的客户,本身就已经被“筛选”过一次了。银行的风控规则、信贷员的经验、甚至当时的政策导向,都决定了谁能进来。这些客户相对优质,违约率低。而拒绝的客户,大概率是风险更高的群体。
所以,你拿通过样本训练的模型,本质上是在回答:“在已经通过审批的人群里,谁更容易违约?” 而不是:“在所有申请人群里,谁更容易违约?”
这两者差别大了去了。
核心结论: 样本选择性偏差会导致模型高估通过客户的信用水平,低估拒绝客户的风险。说白了,模型会变得“过于乐观”。
2.2 拒绝样本与通过样本的分布差异
咱们用数据说话。假设你有一批申请客户,他们的收入分布是这样的:
| 客户群体 | 平均收入(元) | 收入标准差 | 违约率 |
|---|---|---|---|
| 全部申请客户 | 8,500 | 4,200 | 8.5% |
| 通过客户 | 11,200 | 3,100 | 3.2% |
| 拒绝客户 | 5,800 | 2,900 | 未知 |
看到没?通过客户的平均收入明显更高,而且收入波动更小。拒绝客户不仅收入低,而且分布更分散。如果你只用通过客户建模,模型会认为“收入低于 6000 的人很少”,但现实中,这类人恰恰是申请主力。
嗯,这里要注意——分布差异不仅体现在收入上。年龄、职业、负债率、征信查询次数……几乎所有特征都会存在偏移。我见过最夸张的一个项目,通过客户的征信查询次数中位数是 3 次,而拒绝客户的中位数是 11 次。差了将近 4 倍。
2.3 这种偏差会带来什么后果?
我总结了一下,主要有三个后果:
- 模型区分度虚高——你在通过样本上算的 KS、AUC,放到全量样本上会明显下降。我曾经有个项目,KS 从 0.45 掉到 0.28,惨不忍睹。
- 评分卡刻度偏移——你设定的 cutoff 点,在实际应用中可能完全失效。比如你定 600 分以上通过,结果实际拒绝的客户里,有 30% 其实评分在 600 以上——但他们被拒了,你根本不知道。
- 模型迭代失效——你越是用通过样本优化模型,模型就越“偏”。这是一个恶性循环。
避坑指南: 我曾经接手过一个存量评分卡,团队一直用通过样本做监控和迭代。结果三年下来,模型 KS 从 0.40 降到了 0.22。后来一查,不是模型退化了,而是样本偏差被不断放大。所以,千万别在偏差样本上反复调参,那是死路一条。
2.4 如何量化这种偏差?
我个人习惯用两个指标来评估:
- PSI(群体稳定性指标)——比较通过样本和拒绝样本在各特征上的分布差异。PSI > 0.1 就说明偏差明显了。
- 特征重要性排序对比——在通过样本和全量样本(如果有的话)上分别训练模型,看特征重要性排序是否一致。如果差异很大,说明偏差影响了模型结构。
下面我画了一张图,帮你直观理解整个偏差链条:
小技巧: 如果你手头有历史拒绝样本的征信数据(即使没有标签),也可以做分布对比。我常用的是 scipy.stats.ks_2samp 做双样本 KS 检验,看哪些特征差异显著。这能帮你快速定位偏差来源。
2.5 小结一下
样本偏差不是理论问题,是实实在在影响模型效果的问题。你想想看,如果你连“敌人”长什么样都不知道,怎么制定策略?拒绝推断的核心,就是想办法给拒绝样本“补上标签”,让模型看到完整的画面。
下一章,咱们会聊具体的拒绝推断方法。但在此之前,我建议你先回去看看自己的数据——通过样本和拒绝样本,在关键特征上差了多少?这个差距,就是你接下来要解决的问题。
公众号:蓝海资料掘金营,微信deep3321