比赛信息
American Express - Default Prediction
https://www.kaggle.com/c/amex-default-prediction/
本次比赛的目的是根据客户每月的客户资料预测客户未来不偿还信用卡余额的概率。目标二元变量是通过观察最近一次信用卡对帐单后 18 个月的绩效窗口计算得出的,如果客户在最近一次对帐单日期后的 120 天内未支付到期金额,则将其视为违约事件。
该数据集包含每个客户在每个报表日期的汇总配置文件特征。特征是匿名和规范化的,分为以下一般类别:
D_* = Delinquency variables S_* = Spend variables P_* = Payment variables B_* = Balance variables R_* = Risk variables
with the following features being categorical: ['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68'].
比赛特点
比赛是典型的结构化二分类比赛,数据集只知道字段类型,进行了匿名处理。 比赛数据原始大小50GB,原因是数据集列加入了float64精度的噪音。 比赛数据由于噪音等缘故导致训练一个模型需要较长时间。 排行榜排名重叠严重,最终大家的模型精度差异在万分位。
A榜/B榜 排名变化
在排行榜中由于只显示千分位,导致给常非常多同学在A榜重叠在0.799的精度,在切榜之后有600+同学重叠在0.807的精度。
有非常多的同学排名有波动,但如果没有过拟合排行榜,A榜和B榜是整体一致的。下面是两位排名上升的同学。
Team: takoihiroaki
Rank: 1987 -> 153
Score: 0.79906 -> 0.80756
Team: Robert Hatch
Rank: 406 -> 49
Score: 0.79992 -> 0.80798
优胜选手分享
第2名
https://www.kaggle.com/competitions/amex-default-prediction/discussion/347637
计算资源与项目管理
我们队友每个人都有自己的机器/资源(GCP/AWS/本地)。我们只用过几次Kaggle平台。所以我们要解决的第一件事是使用统一的机器来保存所有的代码和模型。我们决定选择 AWS。
我想说的是,我们可以用Kaggle资源实现相同的结果,但对团队管理来说压力会更大一些。我们不想在 WS 上花很多钱,只在模型需要500+内存时才使用。
这里我们给大家一些资源使用的建议:资源管理非常关键是找到瓶颈并消除它以使您的团队最有效。同时不要鲁莽地烧钱——限制你的预算。如果可能进行任何优化,尽快进行以节省时间和资源。
我们尝试使用 neptune.ai 进行实验记录跟踪。代码每次运行都是内部版本化的(以版本号进行区分),所有项目的结构为:
- Initial preprocess -> artifact cleaned and joined df
- FE -> Many aligned (by uid) dfs with separated features
- Features selection -> dictionary we selection metadata
- Holdout Model (fe check and tuning) -> Local validation oof preds / holdout preds/ model / model metadata
- Full model run -> Model / Model metadata
- Prediction -> each fold oof predictions / cv split metadata / test predictions
基础思路
我们想通过这一步实现几件事:
将训练集和测试集合并进行特征处理; 尝试删除数据集噪音(我们没有使用公开的处理后的数据,虽然公开的Radar数据集与我们数据集的相似度是99%) 将 Customer ID
进行人工编码,进一步压缩内存;将数据集拆分为Train Public Private 划分统一的交叉验证,并将列按照类型分开进行存储;
特征工程
我们逐步增加特征,初步的特征只有100多个。所以我们用蛮力从头开始,当然没有必要应用“nunique”(例如二进制特征)。
我们进行的特征工程如下,最终有7千多个特征。具体的思路如下:
all_aggregations = {
'agg_func': ['last','mean','std','median','min','max','nunique'],
'diff_func': ['first','mean','std','median','min','max'],
'ratio_func': ['first','mean','std','median','min','max'],
'lags': [1,2,3,6,11],
'special': ['ewm','count_month_enc','monotonic_increase','diff_mean','major_class',
'normalization','top_outlier','bottom_outlier','normalization_mean','top_outlier_mean','top_outlier_mean']
}
pca (horizonal and vertical) + horizontal combinations + horizontal aggregations.
agg_func -> normal aggregations by uid
diff_func -> diff last - xxx -> std diff worked better than any other
ratio_func -> ratio_func last/xxx
lags -> diff last - Nx
special -> some special transformations -> count_month_enc worked well for categorical / emw for continous
由于数据存在时间区分,因此在统计特征时需要考虑聚合之后的特征是否需要进行归一化。
最终模型
Dart lgbm (0.801 public) GBDT lgbm (0.799 public) Catboost models (0.799 public)
lgb_params = {
'boosting_type': 'dart',
'objective': 'cross_entropy',
'metric': ['AUC'],
'subsample': 0.8,
'subsample_freq': 1,
'learning_rate': 0.01,
'num_leaves': 2 ** 6,
'min_data_in_leaf': 2 ** 11,
'feature_fraction': 0.2,
'feature_fraction_bynode':0.3,
'first_metric_only': True,
'n_estimators': 17001, # -> 5000 for gbdt
'boost_from_average': False,
'early_stopping_rounds': 300,
'verbose': -1,
'num_threads': -1,
'seed': SEED,
}
这里没有什么特别的。帮助我们将 Train CV 与 LB 对齐的主要因素是min_data_in_leaf
的设置。参数调整主要是人工调参得到。
第11名
https://www.kaggle.com/competitions/amex-default-prediction/discussion/347668
我希望在比赛中做一些原创的东西,并将其与最好的公共解决方案相结合。我的解决方案基于用于数据帧处理的 RAPIDS cudf、用于训练的 XGB 和用于特征提取的 pytorch代码。
让我们从后一个观察开始:每个客户资料的序列长度在模型性能中起着至关重要的作用:
target
mean count
seq_len
13 0.231788 386034
12 0.389344 10623
11 0.446737 5961
10 0.462282 6721
9 0.450164 6411
8 0.447300 6110
7 0.418430 5198
6 0.387670 5515
5 0.392635 4671
4 0.416221 4673
3 0.358602 5778
2 0.318465 6098
1 0.335742 5120
很明显,序列长度13是最常见的,但平均违约率也显着降低。乍一看我认为这意味着较短的序列更容易预测,因为它们有更多的阳性样本。但是在检查我的交叉验证结果时,我很快就被证明是错误的:
Fold 0 amex 0.7990 logloss 0.2144
Fold 0 L13 amex 0.8214 logloss 0.1928
Fold 0 Other amex 0.6724 logloss 0.3289
第 1 行是总分。第 2 行是长度为 13 的序列的得分,第 3 行是所有其余序列的得分。显然,较短的序列比长度为 13 的完整序列的得分要差得多。
我们想根据当月和之前所有月份的特征值来预测下个月的特征。当我们有下个月的预测时,我们可以将其用作输入的一部分并再次预测,依此类推。
由于我们预测的是特征,而不是目标,我们可以使用训练数据和测试数据来训练我们的模型。RNN 结构非常简单:只有一个 GRU 层和一些 FC 层。RNN 的性能相当不错。就所有 178 个数值特征的 RMSE 而言,GRU 的验证 RMSE 为 0.019。为简单起见,所有特征都经过对数转换和 fillna(0)。
剩下的就很简单了,在预测缺失的月份之后,现在每个序列的长度都是13。例如,上个月没有一个特征 P_2,现在我们有 13 个特征 P_2_M_1 到 P_2_M_13。这些是我创建的最有用的功能。
对于下游分类器,我只使用 XGB。通过改变 RNN 超参数、XGB 超参数和不同的特征组合,我最终得到了 7 个 XGB 模型,它们的集合是 0.7993 CV 和 0.799 public LB。用最好的公共解决方案和非凡的运气来平均它,我的最终提交最终进入了金牌区。
第12名
https://www.kaggle.com/competitions/amex-default-prediction/discussion/347786
基础特征工程:https://www.kaggle.com/code/thedevastator/amex-features-the-best-of-both-worlds
时序聚合特征:min, max, mean, std for the last 3 and last 6 months
使用adversarial validation筛选特征,从4300+筛选得到1300+特征。
对customer在验证集的数据按照月份进行拆分,预测得到多个oof predicitons,并将预测结果进行聚合得到新的特征。
第15名
https://www.kaggle.com/competitions/amex-default-prediction/discussion/347740
在基础特征空间上加入了PCA特征,将趋势相同的特征进行乘机,对类别特征进行embedding。
模型包括以下几个:
LightGBM,Focal Loss和Logloss一起进行训练; MLP,使用20折进行训练; Transformer + MLP:依次训练;
第17名
https://www.kaggle.com/competitions/amex-default-prediction/discussion/347641
模型包含LightGBM和NN Transformer。对于训练集标签先使用LightGBM进行重新打标,然后训练NN Transformer。
NN Transformer使用了4 layer transformer without skip connections,最终连个模型加权得到最终的结果。
第18名
https://www.kaggle.com/competitions/amex-default-prediction/discussion/347908
与12名类似,对customer在验证集的数据按照月份进行拆分,预测得到多个oof predicitons,并将预测结果进行聚合得到新的特征。
其他的特征包括:
last-mean features and last-min/max std,mean,min,max for categoricals (nunique,count,first,mean). percentage change features
模型包括:
LGBM (Max cv 0.79932 Private 0.80731) XGB (Max CV 0.7984 Priv. 0.80687) Tabnet (MAX CV 0.793133 Private 0.80447) Tabformer ( MAX CV 0.79507 Private 0.80480)
第19名
https://www.kaggle.com/competitions/amex-default-prediction/discussion/347858
| dels | Cross Val | private LB | public LB | Description | Core Features |
|---|---|---|---|---|---|
| LGBM | .7973 | 0.80687 | 0.79906 | 3 models with different seed+ 2 public models | Diff+Last |
| XG Boost | .7972 | 0.80639 | 0.79718 | 3 models with different seed+ 1 public model | HMA+Last |
| CAT Boost | .7952 | 0.80468 | 0.79614 | 3 models with different seed | HMA+diff+Last |
| NN-1 | .7923 | 0.80190 | 0.79240 | 3 models with different seed | HMA+Last |
| NN-2 | .7921 | 0.80186 | 0.79188 | 2 models with different seed | diff + Last |
| TABNET | .7933 | - | - | single model trained last day to introduce diversity | HMA + Last |
# 竞赛交流群 邀请函 #

添加Coggle小助手微信(ID : coggle666)
每天Kaggle算法竞赛、干货资讯汇总
与 24000+来自竞赛爱好者一起交流~





