该方案围绕周粒度 stability metric 构建:先将多张关系表压缩为 case 级宽表,再使用 CatBoost 与 LightGBM 的分组 OOF 训练和概率融合,最后以按周 Gini、斜率与残差检验稳定性。
Home Credit – Credit Risk Model Stability
预测的是每位客户的违约概率,但官方先按 WEEK_NUM 分周计算 Gini,再把周 Gini 拟合为一条直线。
最终分数为:
[ mean(gini)+88.0\times min(0, slope)-0.5\times std(residuals). ]
下降趋势会受很强惩罚,残差波动也会扣分。所以单次随机切分的 AUC 或 Gini 即使漂亮,也不能证明
模型在时间维度稳定。提交本身很简单:每个 case_id 一条 score 概率;真正困难在于怎样从不同
时间粒度的大量表里提取不会漂移的信号。
我使用
VotingClassifier Home Credit
使用 Polars 读取多张表,并以 case_id 为主键归并不同 depth 的数据。数值和日期字段聚合
max/last/mean,字符串及其他字段聚合 max/last;随后从日期派生月份、星期以及日期差。
概念流程为:
多张按不同深度记录的表
-> 每张表按 case_id 聚合(数值/日期/类别分开)
-> 左连接为客户级宽表
-> 缺失、冗余与类别特征处理
-> 分组 OOF 训练
-> CatBoost + LightGBM 概率融合
特征筛选包含三步:删除缺失率超过 0.7 的列和无信息类别列;对缺失模式相同的列,以 0.8 的
相关阈值消除冗余;保留可供模型学习的类别变量。这样的处理目标是控制宽表噪声和内存,而不是把
缺失值一概视为无用——信贷数据中的“未出现某记录”本身常有信息量。
Notebook 用 StratifiedGroupKFold,groups=WEEK_NUM,训练 GPU CatBoost,以及标准 LightGBM
和 GOSS LightGBM。随后做 soft voting,并平均 CatBoost 与 LightGBM ensemble 的输出;最终提交阶段
还使用阈值为 0.996 的校正步骤。
CatBoost 对原生类别特征和非线性交互较方便,LightGBM 适合高维聚合特征;二者的误差不完全重合时, 概率平均通常比复制同类模型更有收益。不过 ensemble 权重必须用 OOF 或时序验证确定,不能看公共 榜临时调整后就当成泛化改进。
分组折叠以 WEEK_NUM 隔离训练和验证。进一步的按周前推评估使用早期周训练、后续连续周验证,
并报告下面四个量:
| 报告项 | 它回答的问题 |
|---|---|
| 平均周 Gini | 平均区分能力如何 |
| slope | 能力是否随时间下降 |
| 残差标准差 | 周与周之间是否忽高忽低 |
| 官方 stability metric | 三者合并后的比赛目标 |
阈值、分段校正或后处理均在按周验证上评估,使改进同时反映风险排序和时间稳定性。
case_id join;直接明细级连接会造成笛卡尔式重复。last 的语义依赖记录时间排序,读取后应显式核验排序键。每一折训练应落盘:输入表版本、聚合列清单、删除列清单、fold 的周范围、OOF 概率和按周 Gini。 这样某次稳定性下降时,能够区分是数据 join 产生了重复、特征筛选改变了缺失模式,还是模型真的发生了 时间漂移。
模型选择应先比较同一时序折上的周曲线,再决定是否加入 ensemble。若某模型只提高少数周的 Gini、
却使斜率变负或残差扩大,就不应仅凭总体 AUC 获得更高权重。提交前还要断言 case_id 唯一、预测为
有限数、行数与 sample submission 一致。