wplll

该方案围绕周粒度 stability metric 构建:先将多张关系表压缩为 case 级宽表,再使用 CatBoost 与 LightGBM 的分组 OOF 训练和概率融合,最后以按周 Gini、斜率与残差检验稳定性。

1. 整体架构流程

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 概率;真正困难在于怎样从不同 时间粒度的大量表里提取不会漂移的信号。

2. 特征构建与数据处理

我使用 VotingClassifier Home Credit 使用 Polars 读取多张表,并以 case_id 为主键归并不同 depth 的数据。数值和日期字段聚合 max/last/mean,字符串及其他字段聚合 max/last;随后从日期派生月份、星期以及日期差。 概念流程为:

多张按不同深度记录的表
  -> 每张表按 case_id 聚合(数值/日期/类别分开)
  -> 左连接为客户级宽表
  -> 缺失、冗余与类别特征处理
  -> 分组 OOF 训练
  -> CatBoost + LightGBM 概率融合

特征筛选包含三步:删除缺失率超过 0.7 的列和无信息类别列;对缺失模式相同的列,以 0.8 的 相关阈值消除冗余;保留可供模型学习的类别变量。这样的处理目标是控制宽表噪声和内存,而不是把 缺失值一概视为无用——信贷数据中的“未出现某记录”本身常有信息量。

3. 模型训练与融合

Notebook 用 StratifiedGroupKFoldgroups=WEEK_NUM,训练 GPU CatBoost,以及标准 LightGBM 和 GOSS LightGBM。随后做 soft voting,并平均 CatBoost 与 LightGBM ensemble 的输出;最终提交阶段 还使用阈值为 0.996 的校正步骤。

CatBoost 对原生类别特征和非线性交互较方便,LightGBM 适合高维聚合特征;二者的误差不完全重合时, 概率平均通常比复制同类模型更有收益。不过 ensemble 权重必须用 OOF 或时序验证确定,不能看公共 榜临时调整后就当成泛化改进。

4. 稳定性评估

分组折叠以 WEEK_NUM 隔离训练和验证。进一步的按周前推评估使用早期周训练、后续连续周验证, 并报告下面四个量:

报告项 它回答的问题
平均周 Gini 平均区分能力如何
slope 能力是否随时间下降
残差标准差 周与周之间是否忽高忽低
官方 stability metric 三者合并后的比赛目标

阈值、分段校正或后处理均在按周验证上评估,使改进同时反映风险排序和时间稳定性。

5. 实现要点

  1. depth 表的聚合必须先在各表完成,才可按 case_id join;直接明细级连接会造成笛卡尔式重复。
  2. last 的语义依赖记录时间排序,读取后应显式核验排序键。
  3. 日期差要统一参考日期,并处理缺失和不可能的负值。
  4. OOF 概率、融合权重、校准参数都应冻结在验证阶段,不能看测试集后重拟合。

6. 训练产物与提交检查

每一折训练应落盘:输入表版本、聚合列清单、删除列清单、fold 的周范围、OOF 概率和按周 Gini。 这样某次稳定性下降时,能够区分是数据 join 产生了重复、特征筛选改变了缺失模式,还是模型真的发生了 时间漂移。

模型选择应先比较同一时序折上的周曲线,再决定是否加入 ensemble。若某模型只提高少数周的 Gini、 却使斜率变负或残差扩大,就不应仅凭总体 AUC 获得更高权重。提交前还要断言 case_id 唯一、预测为 有限数、行数与 sample submission 一致。

项目链接