505. American Express - Default Prediction | amex-default-prediction
真是一场精彩的比赛!我非常享受其中,只希望能有更多的时间参与。首先,我要感谢 Raddar @raddar、Martin @ragnar123 以及许多慷慨分享代码和数据集的朋友们!公开分享的方案质量非常高。这也决定了我的比赛策略:创造一些原创的内容,并将其与最好的公开方案进行融合。 我的方案基于 RAPIDS cudf 进行数据处理,使用 XGB 进行训练,并使用 PyTorch Lightning 提取特征。
关于这个数据集,有两个至关重要的观察:
让我们从后一个观察开始:每个客户画像的序列长度 在模型性能中起着关键作用:
import cudf
path = '/raid/amex'
train = cudf.read_parquet(f'{path}/train.parquet',columns=['customer_ID'])
trainl = cudf.read_csv(f'{path}/train_labels.csv')
train = train.merge(trainl,on='customer_ID',how='left')
train['seq_len'] = train.groupby('customer_ID')['target'].transform('count')
train = train.drop_duplicates('customer_ID',keep='last')
train.groupby('seq_len').agg({'target':['mean','count']}).sort_index(ascending=False)
输出结果:
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
第一行是总体得分。第二行是长度为 13 的序列的得分,第三行是所有其他序列的得分。显然,短序列的得分比长度为 13 的完整序列要差得多。这也暗示了短序列是如何被截断的:更近期的画像被删除了,这可以解释得分的大幅下降,因为通常更近期的画像具有更强的预测能力。例如,假设有连续 13 个月(M1~M13),序列 A 长度为 13,序列 B 长度为 8:
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 M12 M13
A 1 1 1 1 1 1 1 1 1 1 1 1 1 1
B 1 1 1 1 1 1 1 1 1 0 0 0 0 0
其中 1 表示特征存在,0 表示特征缺失。当然,还有另一种可能性:
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 M12 M13