4、样本设计与定义:好客户/坏客户定义、观察期与表现期设定、样本抽样方法
好,咱们进入第四章。样本设计这块,说白了就是给模型「喂什么数据」的问题。我见过太多项目,模型算法选得再好,样本定义一塌糊涂,最后上线效果惨不忍睹。你想想看,地基没打好,房子能稳吗?
4.1 好客户与坏客户的定义
这是整个建模的起点。定义错了,后面全白搭。我个人习惯把「好/坏」定义分成三个层次:
- 业务层定义:跟业务方对齐,逾期多少天算坏?是30+、60+还是90+?
- 数据层定义:在数据表里怎么标记?用逾期天数字段还是用催收状态字段?
- 模型层定义:最终给模型喂的标签是0/1,还是多分类?
我在项目中遇到过最坑的事:业务方说「逾期30天就算坏」,结果数据里发现大量客户逾期29天就还款了,然后第31天又逾期。这种「反复逾期」的客户,你按30天一刀切,模型根本学不到真实风险。
常见的定义方式有这几种:
| 定义方式 | 说明 | 适用场景 |
|---|---|---|
| 逾期天数法 | 逾期≥X天即为坏 | 数据充足,逾期行为稳定 |
| 催收状态法 | 进入M3+催收阶段即为坏 | 催收流程标准化 |
| 损失金额法 | 实际损失超过阈值 | 大额信贷,关注实际损失 |
| 复合定义法 | 逾期天数+催收状态+损失金额 | 风控体系成熟 |
4.2 观察期与表现期设定
这个知识点,我当年刚入行时吃了不少亏。观察期和表现期,说白了就是「用哪段时间的数据去预测哪段时间的结果」。
- 观察期:用来提取特征的时间窗口。比如过去6个月的交易行为、还款记录。
- 表现期:用来判断客户好坏的时间窗口。比如未来12个月内是否逾期。
为什么会这样设定?你想想看,如果观察期和表现期重叠了,那就相当于「用今天的结果预测今天的结果」,模型会学到很多伪相关。我见过有人把观察期设成1个月,表现期设成3个月,结果模型上线后完全失效——因为1个月的数据根本看不出客户的还款意愿。
核心原则:观察期和表现期必须严格不重叠。观察期在时间轴上位于表现期之前。
具体怎么设?我一般遵循这个经验:
- 观察期长度:至少6个月,最好12个月。太短了特征不稳定,太长了数据稀疏。
- 表现期长度:根据产品周期来。信用卡一般12-24个月,消费贷6-12个月,房贷24-36个月。
- 时间窗口对齐:所有样本的观察期和表现期在时间轴上要一致。比如都是「2022年1月-6月观察,2022年7月-2023年6月表现」。
嗯,这里要注意:如果产品上线时间短,表现期不够长怎么办?我常用的方法是「滚动窗口法」——把时间轴切成多个重叠的窗口,每个窗口都做一次观察期+表现期的切片。这样能最大化利用有限的数据。
4.3 样本抽样方法
样本抽样,说白了就是「怎么从海量客户里挑出有代表性的那一批」。直接全量建模?数据量太大,计算资源扛不住。而且坏客户通常很少,直接建模模型会偏向好客户。
我常用的三种方法:
4.3.1 分层抽样
按某个关键特征(比如年龄、收入、地区)把客户分成若干层,每层内随机抽样。这样做的好处是:保证每个子群体都有代表性。
举个例子:
# 伪代码示例
# 按收入分层:低收入、中收入、高收入
# 每层抽取相同比例(比如20%)
low_income = df[df['income'] == 'low'].sample(frac=0.2)
mid_income = df[df['income'] == 'mid'].sample(frac=0.2)
high_income = df[df['income'] == 'high'].sample(frac=0.2)
sample = pd.concat([low_income, mid_income, high_income])
我在项目中遇到过:直接用随机抽样,结果抽出来的样本里高收入客户占比过高,模型对低收入客户预测不准。后来改成按收入分层抽样,问题就解决了。
4.3.2 过采样
坏客户太少?那就把坏客户复制几份,让模型「多看几眼」。常用的方法有:
- 随机过采样:简单复制坏客户样本
- SMOTE:在坏客户之间插值生成新样本
- ADASYN:根据难度自适应生成样本
4.3.3 欠采样
好客户太多?那就从好客户里随机扔掉一部分,让好客户和坏客户数量接近。缺点很明显:浪费数据。
我个人习惯的做法是「混合采样」:先对坏客户做SMOTE过采样,再对好客户做随机欠采样,让最终比例控制在1:2到1:5之间。这样既保留了坏客户的信息,又不会让好客户数据浪费太多。
4.4 本章知识体系
下面这张图,是我自己总结的样本设计全流程。你可以把它当成一个检查清单:
这张图我用了很多年,每次做新项目都拿出来对照一遍。你把它保存下来,做样本设计时逐项检查,基本不会出大问题。
最后说一句:样本设计没有标准答案。不同产品、不同数据、不同业务阶段,定义和抽样方法都要灵活调整。我见过有人把信用卡的坏客户定义直接套用到现金贷上,结果模型效果一塌糊涂。记住:理解你的业务和数据,比套用任何模板都重要。
公众号:蓝海数据掘金营,微信deep3321