Skip to content

AMEX - Default Prediction Kaggle竞赛精华总结

Info

作者:Vincent,发布于2022-08-30,阅读时间:约7分钟,微信公众号文章链接:

1 概述

美国著名金融服务公司American Express(AMEX)在Kaggle上举办了一个数据科学竞赛,要求参赛者针对信用卡账单数据预测持卡人是否在未来会逾期。其中,各个特征都做了脱敏处理,AMEX提供了特征前缀的解释:

D_* = 逾期相关的变量
S_* = 消费相关的变量
P_* = 还款信息
B_* = 欠款信息
R_* = 风险相关的变量

下表为竞赛的数据示意(值为虚构,仅做参考)

customer_ID S_2 P_2 ... B_2 D_41 target
000002399d6bd597023 2017-04-07 0.9366 ... 0.1243 0.2824 1
0000099d6bd597052ca 2017-03-32 0.3466 ... 0.5155 0.0087 0

其中'B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68'特征为类别型的数据。比赛的目标是对于每一个customer_ID,预测其在未来逾期(target = 1,否则target = 0)的可能性。其中负样本已经做了欠采样(采样率为5%)。近日比赛已经结束,本文将选取目前已经公开代码的方案及一些讨论进行总结,和大家一起学习社区中优秀的思路和具体实现。

2 准备工作

由于数据量相对于Kaggle提供的实验环境很大,因此有一些工作是围绕内存的优化展开的,比如AMEX data - integer dtypes - parquet format将浮点型的数据转化为了整型,并将数据以parquet format格式存储,有效地减少了内存的开销。类似的数据压缩方案还有AMEX-Feather-Dataset

60M sample_submission.csv
32G test_data.csv
16G train_data.csv
30M  train_labels.csv

同时,本次竞赛的评价指标是客制化的,融合了top 4% capturegini,许多方案都参考了Amex Competition Metric (Python)Metric without DF的代码进行模型性能的评价。

3 探索性数据分析

在对数据建模前,透彻地了解它非常关键,探索性数据分析(Exploratory Data Analysis)成为了许多后续工作的基础。在AMEX的竞赛中,Kagglers在这一阶段的工作关注点主要有:

  • 检查缺失值
  • 检查重复的记录
  • 标签的分布
  • 每位客户信用卡账单数量及账单日分布
  • 类别型变量及数值型变量的分布,是否有异常值
  • 特征之间的相关性
  • 人为噪音
  • 训练集和测试集中特征分布对比

针对这些分析,高分笔记本有如下:

4 特征工程 & 建模

4.1 特征工程

因为数据为信用卡账单,一个客户有多个账单,而最后预测目标是以客户为单位的,因此融合不同时间的账单数据成为了许多方案的关注点,如:

  • 针对连续型变量,以客户为单位对每个特征在所有时间范围内求均值、标准差、最小值、最大值、最近一次账单的值,以及最近一个账单和最开始账单特征的差值、比率等。
  • 针对类别型变量,以客户为单位对每个特征在所有时间范围内计数,最近一次账单的值,每个特征值出现的次数,将其转化为数值型变量。随后再根据模型类别做编码(或不手动编码,让模型自己处理)。

相关的高分笔记本主要有:

4.2 模型设计、训练及推理

高分方案基本是XGBoost,LightGBM,CatBoost,Transformer, TabNet以及这些模型的集成,各路高手为了提高分数各显神通,在此针对一些高分思路进行讨论。

Chris Deotte是一位在Nvidia工作的Kaggle Grandmaster,他贡献了许多基础的解决方案(如XGBoostTensorFlow GRUTensorFlow Transformer)供参考,这些工作为社区提供了很好的工作起点,而Chris最终的方案排名15/4875,使用Transformer并加入了LightGBM知识蒸馏,详见15th Place Gold – NN Transformer using LGBM Knowledge Distillation

Transformer和LGBM知识蒸馏
  • 首先在原始数据上训练LightGBM,将cross validation中的out of fold(OOF)预测结果存下,同时对test集进行预测做pseudo labeling,同时将OOF和test preds送入Transformer进行训练
  • Transformer从零开始训练是比较困难的,但借助知识蒸馏,Transformer接受了来自LightGBM的教育,同时带有伪标签的测试集数据量很大,这些都帮助了Transformer进行学习。由于Transformer与LightGBM结构迥异,借助于注意力机制,Transformer学习到的信息也有所不同,使得最后在模型融合时有更好的效果。
  • 然后Transformer继续基于原始的训练集再次进行训练,这其中融合了nested cross validation,seed blending等方法
  • 最终使用50%/50%集成LightGBM和Transformer的输出

私榜第二名的团队也对方案(2nd place solution - team JuneHomes)进行了分享(其称源码会稍后公开),在JuneHomes的分享里,除了技术本身,还有很多最佳实践:

  • 团队为了协作,使用了AWS的计算资源,同时对各个过程进行了版本管理(如流程版本,特征工程版本,模型版本等)
  • 首先借助社区中的思路去除了一些数据中的噪音,然后进行一些手动特征工程的尝试,但效果有限,最终还是选择了使用上文提及的统计量。
  • 在特征选择时,主要依赖于LightGBM的特征重要性和Permutation importance循环迭代特征选择,并用模型CV结果中的AUC做验证。作者也提到其团队尝试了其他的特征选择的办法,但都不如该方法稳定。
  • 做模型选择时,作者经过很多实验最后选择了LightGBM,同时还针对账单较少的客户单独建模,最后进行集成。作者的实验表明Stacking作用很小,不同的seed和特征工程的顺序对于结果同样影响甚微。
  • 最后作者分享了团队的最开始的项目计划,将全过程工作流里值得注意的点及相关的资料详细地记录了下来,按照计划井井有条地执行,真是赢得实至名归!

相比之下,第一名的方案1st solution 基本是一个大熔炉,并且作者没有详细描述,在此不做讨论。

5 总结

在本次比赛中,很多有用的信息和技巧来源于Discussion模块,因此本文也做了一些精华的摘录:

也有许多kagglers分享了很有借鉴意义的解决方案,以下是一些笔记本:

希望这次的分享对你有帮助,欢迎在评论区留言讨论!


Viewed times

Comments