4、样本设计与定义:好客户/坏客户定义、观察期与表现期设定、样本抽样方法

好,咱们进入第四章。样本设计这块,说白了就是给模型「喂什么数据」的问题。我见过太多项目,模型算法选得再好,样本定义一塌糊涂,最后上线效果惨不忍睹。你想想看,地基没打好,房子能稳吗?

4.1 好客户与坏客户的定义

这是整个建模的起点。定义错了,后面全白搭。我个人习惯把「好/坏」定义分成三个层次:

  • 业务层定义:跟业务方对齐,逾期多少天算坏?是30+、60+还是90+?
  • 数据层定义:在数据表里怎么标记?用逾期天数字段还是用催收状态字段?
  • 模型层定义:最终给模型喂的标签是0/1,还是多分类?

我在项目中遇到过最坑的事:业务方说「逾期30天就算坏」,结果数据里发现大量客户逾期29天就还款了,然后第31天又逾期。这种「反复逾期」的客户,你按30天一刀切,模型根本学不到真实风险。

⚠️ 避坑指南:我曾经在某个消费金融项目里,直接用了业务给的「逾期60天」定义。结果模型上线后,坏账率预测偏差很大。后来复盘发现,很多客户在逾期50天左右就失联了,60天定义太滞后。最后我们改成了「逾期45天且催收无效」作为坏客户定义。

常见的定义方式有这几种:

定义方式 说明 适用场景
逾期天数法 逾期≥X天即为坏 数据充足,逾期行为稳定
催收状态法 进入M3+催收阶段即为坏 催收流程标准化
损失金额法 实际损失超过阈值 大额信贷,关注实际损失
复合定义法 逾期天数+催收状态+损失金额 风控体系成熟
💡 我的建议:别只用单一维度。我一般会先做「逾期天数分布分析」,看看数据在哪个天数上出现「断崖式下跌」——那个点往往就是天然的分界线。

4.2 观察期与表现期设定

这个知识点,我当年刚入行时吃了不少亏。观察期和表现期,说白了就是「用哪段时间的数据去预测哪段时间的结果」。

  • 观察期:用来提取特征的时间窗口。比如过去6个月的交易行为、还款记录。
  • 表现期:用来判断客户好坏的时间窗口。比如未来12个月内是否逾期。

为什么会这样设定?你想想看,如果观察期和表现期重叠了,那就相当于「用今天的结果预测今天的结果」,模型会学到很多伪相关。我见过有人把观察期设成1个月,表现期设成3个月,结果模型上线后完全失效——因为1个月的数据根本看不出客户的还款意愿。

核心原则:观察期和表现期必须严格不重叠。观察期在时间轴上位于表现期之前。

具体怎么设?我一般遵循这个经验:

  1. 观察期长度:至少6个月,最好12个月。太短了特征不稳定,太长了数据稀疏。
  2. 表现期长度:根据产品周期来。信用卡一般12-24个月,消费贷6-12个月,房贷24-36个月。
  3. 时间窗口对齐:所有样本的观察期和表现期在时间轴上要一致。比如都是「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 本章知识体系

下面这张图,是我自己总结的样本设计全流程。你可以把它当成一个检查清单:

样本设计核心流程 第一步:定义好/坏客户 逾期天数法 | 催收状态法 | 损失金额法 | 复合定义法 第二步:设定观察期与表现期 观察期(特征提取)→ 表现期(标签判定) 第三步:样本抽样 分层抽样 | 过采样(SMOTE) | 欠采样 | 混合采样 输出:建模样本集(特征+标签)

这张图我用了很多年,每次做新项目都拿出来对照一遍。你把它保存下来,做样本设计时逐项检查,基本不会出大问题。

最后说一句:样本设计没有标准答案。不同产品、不同数据、不同业务阶段,定义和抽样方法都要灵活调整。我见过有人把信用卡的坏客户定义直接套用到现金贷上,结果模型效果一塌糊涂。记住:理解你的业务和数据,比套用任何模板都重要。


公众号:蓝海数据掘金营,微信deep3321