category
风控建模
date
May 12, 2026
Published
Published
slug
jdjt-v3-credit-risk-modeling
status 1
summary
本文记录了 JDJT V3 风控建模项目的完整技术方案与实验结果,涵盖数据处理、特征工程、模型训练、评估体系和交付物管理。
tags
风控
建模
LightGBM
XGBoost
特征工程
信贷风控
type
Post
信贷风控建模实战:从特征工程到模型交付的完整流程
本文记录了 风控建模项目的完整技术方案与实验结果,涵盖数据处理、特征工程、模型训练、评估体系和交付物管理。
项目背景
信贷风控模型的核心目标是:在用户申请时点,基于三方数据和业务特征,预测其未来逾期风险。与通用机器学习任务不同,风控建模有几个硬约束:
- 标签观察窗成熟度:不同逾期标签需要不同的观察期,未成熟的样本不能混入
- 申请时点一致性:所有特征必须在申请决策时可见,严禁信息穿越
- 时间外推验证:模型必须在未来的 OOT(Out-of-Time)样本上验证泛化能力
- 主体隔离:同一客户多次复借时,需要评估模型对新客的泛化能力
数据与标签体系
输入数据
建模输入为聚合后的
df_merge,一行对应一个申请/合同维度样本,包含:- 申请侧基础字段
- 贷中衍生特征
resp_msg三方 JSON 数据(主要特征来源)
- 合同维度贷后标签
- 标签成熟度字段
风险标签
每个标签独立建模,不做多任务混合训练:
标签 | 含义 | 成熟度字段 |
y_fpd | 首期 D1+ 逾期 | y_fpd_valid |
y_fpd_d7 | 首期 D7+ 逾期 | y_fpd_d7_valid |
y_fpd_m1 | 首期 D30+ 逾期 | y_fpd_m1_valid |
y_3m_m1 | 前三期任一期 D30+ | y_3m_m1_valid |
y_m2_plus | 合同周期内 D60+ | y_full_valid |
y_m3_plus | 合同周期内 D90+ | y_full_valid |
样本规模
最终建模样本量约 90 万行 × 3000 个候选特征,属于典型的高维稀疏场景。
特征工程
resp_msg 全量展开
resp_msg 是三方数据的 JSON 字段,包含丰富的风险信号。采用"全量展开,后续筛选"策略:展开后的字段分为三层:
- 可直接候选层:申请时点明确可见、业务含义清晰
- 待审查层:口径不稳定、来源不清晰
- 禁止入模层:贷后字段、审批后字段、外部回填字段
变量筛选流程
关键指标口径:
指标 | 计算样本 | 用途 |
IV | Train | 衡量变量区分能力 |
单变量 AUC | Train | 衡量变量单独排序能力 |
月度稳定性 | Train | 衡量开发期内变量波动 |
Valid PSI | Valid vs Train | 稳定性观察 |
单变量 AUC 使用方向无关口径:
single_auc = max(raw_auc, 1 - raw_auc),避免负相关强变量被误杀。内存优化
由于数据规模达到 90 万行 × 3000 特征,直接复制宽表会导致内存不足。采用低内存改造:
- 上下文构建阶段只保留窄控制表
- 切分阶段只保存行索引和必要控制字段
- 变量筛选只在抽样行上 materialize 全量候选特征
- 模型训练阶段只 materialize 最终入模变量
实验设计
切分策略
支持两种开发期切分:
策略 | 说明 | 适用场景 |
A | 开发期内按天抽样切分 Train/Valid | 模型横向比较、调参 |
B | 开发期尾部时间窗作为 Valid | 时间稳定性验证 |
主体隔离
口径 | 说明 |
C1 | 不做客户隔离,贴近真实业务流量 |
C2 | OOT Test 做客户隔离,检查新客泛化能力 |
C3 | Train/Valid/Test 全流程客户隔离 |
主实验采用 C1,稳健性分析补充 C2。
两阶段实验
第一阶段:基线实验
- 不做 Optuna 调参
- 快速比较:目标标签 × 模型类型 × 切分策略 × 不平衡策略
- 筛选较优候选组合
第二阶段:Top 候选精调
- 只对第一阶段 Top 候选做 Optuna 超参数搜索
- 调参目标:
OOT AUC - penalty(Train-Valid gap) - penalty(Valid-OOT gap)
实验结果
最佳模型汇总
标签 | 最佳模型 | 切分 | 不平衡策略 | Train AUC | Valid AUC | OOT AUC | KS | 特征数 |
y_fpd | XGBoost | A | class_weight | 0.624 | 0.604 | 0.585 | 0.125 | 104 |
y_fpd_d7 | LightGBM | B | none | 0.717 | 0.649 | 0.598 | 0.155 | 125 |
y_fpd_m1 | XGBoost | A | none | 0.639 | 0.619 | 0.599 | 0.177 | 121 |
y_3m_m1 | XGBoost | A | none | 0.652 | 0.644 | 0.625 | 0.194 | 118 |
y_m2_plus | LightGBM | A | none | 0.835 | 0.812 | 0.794 | 0.463 | 125 |
y_m3_plus | LightGBM | A | class_weight | 0.857 | 0.833 | 0.816 | 0.559 | 128 |
泛化差距分析
标签 | Train-Valid Gap | Valid-OOT Gap | 评估 |
y_fpd | 0.020 | 0.019 | 稳定 |
y_fpd_d7 | 0.067 | 0.051 | 过拟合风险 |
y_fpd_m1 | 0.021 | 0.019 | 稳定 |
y_3m_m1 | 0.007 | 0.020 | 稳定 |
y_m2_plus | 0.022 | 0.018 | 稳定 |
y_m3_plus | 0.024 | 0.017 | 稳定 |
关键发现
- 短期标签预测难度大:y_fpd、y_fpd_m1 的 OOT AUC 在 0.58-0.60 区间,接近随机水平
- 长期标签效果好:y_m2_plus、y_m3_plus 的 OOT AUC 超过 0.79,KS 超过 0.46
- y_fpd_d7 过拟合:Train-Valid Gap 达到 0.067,需要关注模型稳定性
- 泛化差距可控:除 y_fpd_d7 外,所有模型的 Train-Valid/Valid-OOT Gap 都在 0.03 以内
最佳模型超参数
y_fpd (XGBoost)
y_m2_plus (LightGBM)
代码架构
项目按职责拆分为以下模块:
最小使用方式:
交付物
每个最终模型输出:
model_bundle.pkl- 模型包
model_meta.json- 模型元信息
best_params.json- 最佳超参数
final_model_feature_list.csv- 入模变量清单
feature_screening_reason_report.csv- 变量筛选原因
model_layer.pmml- PMML 导出(可选)
业务验证方向
当前模型已具备基本区分能力,下一步需要补充:
- 固定通过率下坏账率对比:在 30%/40%/50% 通过率下,坏账率下降多少
- 收益/损失 proxy 模拟:不同 cutoff 下的预期收益和损失
- 分群验证:新老客、渠道、产品维度的分群效果
- 上线监控:分数 PSI、关键变量 PSI、月度 AUC/KS
总结
本项目构建了一套面向信贷风控的时间外推建模框架,核心特点:
- 标签成熟度过滤:避免未成熟样本造成的标签偏误
- 两阶段实验:先基线筛选,再精调最优
- 泛化差距惩罚:调参目标同时考虑 OOT 效果和泛化差距
- 完整交付链路:从特征筛选到模型导出的可复现流程
实验结果显示,长期逾期标签(y_m2_plus、y_m3_plus)的预测效果较好(OOT AUC > 0.79),而短期标签(y_fpd、y_fpd_m1)仍有提升空间,可能需要引入更多实时特征或调整标签定义。
*项目代码:JDJT_V3*
*建模框架:LR / LightGBM / XGBoost + Optuna*
*验证方式:时间外推 OOT + 主体隔离*