数据采集与整合:多源数据合并、字段对齐、数据字典建立

做信用评分建模,最头疼的不是算法,而是数据从哪里来、怎么凑到一起。我见过太多团队在模型上线前才发现,某个关键变量的含义和当初理解的不一样——那感觉,就像跑完马拉松发现终点线画错了位置。

这一章,咱们就聊数据融合的实战套路。说白了,就是把多个渠道的数据「拧」成一根绳子。

数据源的多样性与协调

信用评分的数据源,通常来自这几个方面:

  • 核心信贷系统:客户基本信息、账户余额、还款记录
  • 外部征信数据:人行征信、百行征信、多头借贷记录
  • 交易流水数据:银行流水、支付平台行为日志
  • 反欺诈平台:设备指纹、IP归属、黑名单命中记录
  • 第三方数据商:教育、就业、社保等政务数据

这些系统的数据格式、更新频率、标识字段各不相同。嗯,这里要注意:同一个客户在不同系统中的ID可能是完全不同的东西。我曾经在项目里遇到过,一家银行用身份证号作为唯一标识,而另一家合作的消费金融公司用的是自生成的客户编号——合并时直接按ID关联,结果两条完全不相关的人被强行绑定在了一起。

⚠️ 踩坑警告:千万别默认「客户编号」就是同一个东西。必须先搞清楚每套系统的ID生成规则、是否可重号、是否存在代理ID(比如理财账户ID和贷款账户ID不能混用)。

多源数据合并策略

合并方式无非这几种,我按实际场景排了个优先级:

合并方式 适用场景 我踩过的坑
硬关联(内连接) 两套数据都有高准确率的共同ID 丢失大量样本,有时损失率超过40%
全关联(外连接) 保数据完整性、后续做缺失处理 会产生大量空值列,模型前要谨慎处理
模糊匹配 ID字段有误差(如名字少一个字母) 需要设定相似度阈值,我习惯用0.85以上
逐层合并 数据源超过3个,且层级关系复杂 先按客户级合并,再按账户级追加

我个人习惯优先用硬关联。为什么?因为你想想看,如果你的客户ID都不可靠,后面做的所有特征工程都是空中楼阁。不过也别太死板——有时为了保证样本量,我会先用硬关联做一个核心集,再把模糊匹配的结果作为「候选池」单独存放,提供给模型组风险决策用。

字段对齐:统一语义与格式

不同数据源对同一个字段的定义,可能存在根本性的差异。举个最常见的例子:

  • A系统把「逾期」定义为超过还款日1天
  • B系统定义为超过3天
  • C系统甚至只标记「催收中」状态,不直接说是否逾期

你看,这三个字段虽然都叫「逾期标志」,但语义完全不同。这时候必须做字段对齐。

✅ 字段对齐清单(我每期必做):
1. 字段名统一:全部转为小写+下划线格式
2. 单位统一:金额统一为「分」还是「元」?我建议统一到「分」,避免浮点精度问题
3. 缺失值标识统一:用-99、-1还是NA?
4. 枚举值映射:比如性别字段,A系统用0/1,B系统用M/F,必须建立映射表
5. 时间格式标准化:全部转为'YYYY-MM-DD HH:MM:SS'格式,别用不同时区

这里有个小技巧——我每次做字段对齐时,会额外生成一个字段差异报告。记录每个字段在源系统和目标系统中的名字、类型、取值范围、缺失率差异。将来模型调优或者数据追责时,这个报告能救你命。

# 字段对齐示例:用一个简单的映射配置
field_mapping = {
    'cust_id': {'source': ['customer_id', 'user_no', 'client_code'],
                'type': 'string'},
    'overdue_flag': {'source': ['overdue_status', 'is_overdue', '逾期标志'],
                     'type': 'int',
                     'value_map': {'Y': 1, 'N': 0, '是': 1, '否': 0}},
    'loan_amount': {'source': ['amount', 'loan_amt', '放款金额'],
                    'type': 'float',
                    'unit': 'fen'}
}

你看,这个配置虽然简单,但能保证每次合并时都按同一套规则执行。我习惯把这类配置放在YAML文件里,方便版本管理。

数据字典:让变量可追溯

数据字典是数据仓库的说明书。没有它,半年后你回头看你建的宽表,很可能一头雾水——「这个字段到底是啥意思?」

💡 我建议的数据字典结构:
每一行对应一个变量,至少包含:变量名、中文含义、数据类型、取值范围、缺失值处理方式、来源系统、创建日期、负责人。好记性不如烂笔头,这句话在数据工程里是铁律。
变量名 中文含义 数据类型 取值范围 来源系统
cust_id 客户唯一标识 string 16位数字 核心系统
overdue_30d 近30天逾期天数 int 0-30 征信系统
mob 账龄(月) int 1-120 账户系统
target 好坏样本标签 int 0/1 模型组定义

数据字典不能只是Excel文件。我习惯把它嵌入到建表脚本的注释中,同时保持一份在线文档,方便跨团队沟通。另外,每次迭代都要更新——字段改了但字典不更新,比没有字典更坑人。

整合后的质量检查

数据合并完了,别急着往下走。得先过一遍质量检查:

  • 样本量检查:合并后的总记录数是否符合预期?少了还是多了?
  • 关键字段完整性:ID、目标变量、建模必须字段的缺失率是否在阈值内?
  • 分布偏移检查:合并前后的字段分布有没有「断层」?我常见的问题是金额字段小数点位置不对,导致分布图出现诡异的尖峰。
  • 逻辑一致性:比如逾期天数不应该大于贷款期限,性别字段不应该出现「未知」以外的值。
⚠️ 千万别偷懒:我曾经跳过这一步,结果把存管账户的测试数据混进了生产环境。模型的AUC在验证集上高达0.99,上线后直接崩溃。后来花了整整一周才定位到问题——合并时多了一个无用关联。

最后,数据整合这件事,最考验的不是技术,而是耐心和细心。把每一步都做成可复用的脚本、可追溯的日志、可查阅的字典,你后续建模的效率会翻倍。相信我,这一点我深有体会。

多源数据整合流程 核心信贷系统 外部征信数据 交易流水数据 反欺诈平台 字段对齐 + 多源合并 ID映射 | 单位统一 | 枚举映射 | 时间标准化 数据字典建立 变量名 → 含义 · 类型 · 来源 · 取值范围 · 负责人 整合后质量检查 样本量 | 字段完整性 | 分布偏移 | 逻辑一致性 🔑 核心原则:每条记录可追溯、每个字段可定位、每个转换可复现