4. 数据基础与准备
治愈概率建模的上限,往往不由算法决定,而由数据基础决定。催收场景中的数据天然具有多源、异构、强时序、高缺失的特点:同一个客户,可能在核心业务系统里有账户状态,在催收系统里有跟进记录,在支付网关里有还款流水,在外部征信里有历史逾期表现。如果这些数据没有被正确地对齐到“账户—时间”粒度,后续无论用逻辑回归还是梯度提升树,得到的治愈概率都只是噪声的拟合。本节围绕数据来源、账户级与还款级数据组织方式、清洗与缺失值处理三条主线,给出可直接落地的工程方法。
一、催收数据的主要来源与角色
催收建模的数据通常来自五类系统,每类系统承担不同的信息职责:
- 核心业务系统(账务系统):提供账户级静态属性与当前欠款状态,如授信额度、放款金额、剩余本金、逾期天数(DPD)、逾期阶段(M1/M2/M3)、应还日期、利率、产品类型。
- 催收作业系统:记录催收动作与结果,如外呼次数、接通时长、短信/信函触达、承诺还款(PTP)、承诺日期、跟进坐席、催收策略队列。
- 支付与还款流水系统:提供还款级明细,包括还款时间、还款金额、还款渠道、冲销顺序(本金/利息/费用)、是否部分还款、是否代扣成功。
- 客户与合同系统:提供客户画像与合同信息,如年龄、地区、职业、收入区间、合同期限、担保方式。
- 外部数据源:征信报告、多头借贷、黑名单、失联修复结果等,用于补充还款意愿与还款能力信号。
这些来源在建模中的角色不同:账务系统定义“谁欠多少、欠多久”,催收系统定义“我们做了什么”,还款流水定义“客户实际做了什么”,外部数据定义“客户还可能怎么做”。治愈概率本质上是“在给定催收动作与客户状态下,未来某时间窗内结清或恢复到正常状态的概率”,因此四类信息缺一不可。
二、账户级与还款级数据的组织方式
账户级数据以“账户—观察日”为主键,一行代表一个账户在某个时点的状态快照。还款级数据以“还款事件”为主键,一行代表一次还款行为。两者需要通过账户ID和时间窗进行聚合对齐。常见做法是:以观察日为锚点,向前取固定时间窗(如30天、90天)的还款流水,聚合成还款行为特征,再与账户级快照拼接。
| 数据层级 | 主键 | 典型字段 | 在治愈模型中的作用 |
|---|---|---|---|
| 账户级 | 账户ID + 观察日 | DPD、剩余本金、逾期阶段、额度、产品类型 | 定义风险状态与治愈目标的基础口径 |
| 还款级 | 还款流水号 | 还款时间、金额、渠道、冲销明细、是否部分还款 | 构造还款能力、还款意愿、历史履约特征 |
| 催收级 | 催收动作ID | 外呼次数、接通、PTP、承诺日期、坐席 | 构造催收强度与响应特征,控制策略偏差 |
| 外部级 | 客户ID + 查询日 | 征信查询次数、多头、历史逾期、黑名单 | 补充还款意愿与外部负债压力 |
一个常见的工程实现如下:先按账户ID和观察日生成建模样本骨架,再分别聚合还款、催收、外部数据,最后左连接。聚合时要注意时间窗不能跨越观察日之后的信息,否则会造成标签泄漏。
-- 账户级样本骨架
SELECT account_id, observe_date, dpd, remaining_principal, product_type
FROM account_snapshot
WHERE observe_date BETWEEN '2024-01-01' AND '2024-06-30';
-- 还款级聚合:观察日前90天还款行为
SELECT account_id, observe_date,
COUNT(*) AS repay_cnt_90d,
SUM(repay_amount) AS repay_amt_90d,
MAX(repay_amount) AS max_repay_90d,
SUM(CASE WHEN repay_amount < due_amount THEN 1 ELSE 0 END) AS partial_cnt_90d
FROM repayment_event r
JOIN account_snapshot a
ON r.account_id = a.account_id
AND r.repay_time >= DATE_SUB(a.observe_date, INTERVAL 90 DAY)
AND r.repay_time < a.observe_date
GROUP BY account_id, observe_date;
三、数据清洗的关键步骤
催收数据清洗不是简单的去重和补空,而是围绕“口径一致性”和“时间一致性”展开。建议按以下顺序执行:
- 主键与粒度校验:确认账户级快照在“账户ID+观察日”上唯一,还款流水在“流水号”上唯一,避免重复关联导致金额翻倍。
- 时间字段规范化:统一时区与日期格式,检查还款时间是否早于放款时间、催收时间是否晚于观察日等逻辑矛盾。
- 金额与状态一致性:校验剩余本金、应还金额、还款金额之间的勾稽关系,识别冲销异常与负数金额。
- 异常值与截断:对DPD、还款金额、外呼次数等做分位数截断,避免极端值主导树模型分裂。
- 标签口径确认:明确“治愈”的定义,如观察日后30天内DPD恢复至0,或结清全部欠款,并确保标签只使用观察日之后的信息。
标签泄漏是催收建模最常见的致命错误。例如用“观察日后是否还款”作为标签,却把“观察日后还款金额”作为特征,模型AUC会虚高到0.95以上,但上线后完全失效。所有特征必须严格限定在观察日之前可获取。
四、缺失值处理:先理解缺失机制,再选择策略
催收数据的缺失往往不是随机的。外呼接通时长缺失,可能意味着客户失联;收入字段缺失,可能集中在特定渠道或地区。处理前应先区分三类缺失机制:完全随机缺失(MCAR)、随机缺失(MAR)、非随机缺失(MNAR)。对MNAR,缺失本身往往就是强信号,应保留“是否缺失”的指示变量。
- 数值型特征:优先使用中位数填充,并附加缺失指示列;对金额类可考虑按产品类型分组填充。
- 类别型特征:将缺失单独作为一类“Unknown”,避免用众数掩盖业务含义。
- 时间序列类特征:如还款间隔,缺失可填充为“无还款行为”对应的特殊值,而不是简单均值。
- 高缺失率特征:缺失率超过70%且业务解释弱的字段,建议直接剔除,避免引入噪声。
实操建议:在特征工程阶段同时保留“原始值+缺失指示”,让模型自行学习缺失的业务含义。对树模型而言,缺失指示往往比填充值本身更有区分度。
五、案例复盘:一次因粒度错位导致的模型失败
某消费金融团队在构建治愈概率模型时,直接将还款流水与账户快照按账户ID关联,未控制时间窗,导致同一账户的多条还款记录被重复匹配到多个观察日。结果是“还款金额”特征被放大了数倍,模型在训练集上表现优异,但上线后治愈概率普遍偏高,催收策略误判为“客户会还”,减少了高价值账户的催收投入,回收率反而下降。复盘后,团队重新按“账户ID+观察日+前90天窗口”聚合还款特征,并加入时间一致性校验,模型KS从虚高的0.52回落到真实的0.34,但上线后的排序能力显著提升。
这个案例说明:催收数据准备的核心不是“把数据拼起来”,而是“在正确的时间粒度上,用正确的口径,拼出观察日之前可获取的信息”。账户级数据定义状态,还款级数据定义行为,清洗与缺失值处理保证口径一致,四者共同构成治愈概率建模的可信基础。