返回列表

10th Place Solution: XGB with Autoregressive RNN features

505. American Express - Default Prediction | amex-default-prediction

开始: 2022-05-25 结束: 2022-08-24 信贷风控 数据算法赛
第10名方案:结合自回归RNN特征的XGB模型

第10名方案:结合自回归RNN特征的XGB模型

作者: Jiwei Liu (Grandmaster)
比赛: Amex Default Prediction

真是一场精彩的比赛!我非常享受其中,只希望能有更多的时间参与。首先,我要感谢 Raddar @raddar、Martin @ragnar123 以及许多慷慨分享代码和数据集的朋友们!公开分享的方案质量非常高。这也决定了我的比赛策略:创造一些原创的内容,并将其与最好的公开方案进行融合。 我的方案基于 RAPIDS cudf 进行数据处理,使用 XGB 进行训练,并使用 PyTorch Lightning 提取特征。

关于这个数据集,有两个至关重要的观察:

  • 拥有大量来自“未来”的测试数据可用。
  • 短序列(长度小于13)是导致性能不佳的罪魁祸首。

序列长度的重要性

让我们从后一个观察开始:每个客户画像的序列长度 在模型性能中起着关键作用:

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