返回列表

11th Place Solution

343. IEEE-CIS Fraud Detection | ieee-fraud-detection

开始: 2019-07-15 结束: 2019-10-03 反欺诈与反洗钱 数据算法赛
第11名解决方案

第11名解决方案

作者: Kain | 比赛排名: 第11名

祝贺所有顶尖团队,尤其是金牌区的各位。这对我们(至少对我来说 😎)是一场艰难的比赛。

我们的解决方案基于堆叠。我个人是以大约20个模型的堆叠开始这场比赛的,在添加了越来越多的oof(out-of-fold,袋外)预测后(起初使用Roman的KFold(k=5, shuffle=False)验证方案,LB分数约为0.9419),我继续添加了来自以下来源的oof预测:

  • 大多数公共Kernel模型;
  • 基于分类特征 + 数值特征PCA生成的数据训练的LGBM;
  • 在分类特征的不同编码(目标编码、CatBoost编码、证据权重编码等)+ 数值特征上训练的XGB;
  • 在数值特征的不同子集上训练的Lasso(使用均值和中位数填充);
  • 在数值特征的不同子集上训练的Ridge(使用均值和中位数填充);
  • 在计数特征的不同子集上训练的LGBM/Ridge(每个特征进行计数编码);
  • 在计数特征(每个特征计数编码)+ 计数的独热编码上训练的LGBM/Ridge;
  • 在计数特征(每个特征计数编码)+ 计数的独热编码(使用截断SVD降维)上训练的LGBM/Ridge;
  • 在计数特征的不同子集上训练的高斯朴素贝叶斯(每个特征计数编码);
  • 在计数特征子集上训练的多项式朴素贝叶斯;
  • 在V特征子集上训练的一元逻辑回归(通过它们与目标之间的Spearman相关性挑选);
  • 在分类特征 + 部分数值特征(使用Kolmogorov-Smirnov检验挑选)上训练的LGBM/XGB;
  • 使用此代码在原始分类特征 + 数值特征上训练的几个NFFM、FFM模型;
  • 使用此代码在分类特征子集上训练的LibFM;
  • 在分类 + 数值特征的不同子集上训练的CatBoost(所有特征视为分类特征并输入CatBoost编码API);
  • 在原始数据上训练的NN(分类数据嵌入 + 数值数据的不同填充方法),采用不同架构;
  • 在分类特征的2d、3d、4d交互子集上训练的LGBM/XGB;
  • 在PCA处理后的数据集(数值数据)的不同子集上训练的Extra Tree分类器;
  • 以及在数值特征的一小部分子集上训练的KNN。

完成这些后,我最终得到了大约900多个oof预测。通过使用LGBM作为分类器的RFE(递归特征消除)从这些oof中选出大约120个,我在LB上达到了0.9552。之后,我与现在的队友组队,我们汇集了各自的特征和oof预测。ynktk有一个在大约2000个特征上训练的XGB,得分为0.9528,他在研究单模型时使用与我相同的验证方法创建了许多oof预测。ynktk从一开始就使用KFold + 暴力特征工程(数据的各种聚合),而我的其他队友主要基于按月GroupKFold的验证进行特征工程(FE),因此在多样性方面非常有帮助。幸运的是,在一两天后我们达到了0.9579。

在阅读了Konstantin关于making them do friendship(让他们建立友谊)的帖子以及他使用CatBoost的经历后,我开始寻找“魔法”(在我看来他的魔法很可能是某种形式的交互)。首先,我专注于分类特征的交互,特别是card1-card6和地址,然后我将C和D特征添加到我的交互中。在对CatBoost进行了大量实验后,我发现了特征card1 + date.day - D1(视为分类特征)并与队友分享(后来Youngsoo Lee发现card1 + card6 + addr1 + addr2 + date.day - D1是一个更好的选择)。在专注于这个特征并基于它添加新的oof预测后,我们达到了AUC=0.9649。

我们最好的堆叠模型是一个5次Bagging的XGB(比LGBM稍好),使用大约190个oof预测(从大约1100多个oof池中选择)进行训练,在LB上得分为0.9650,CV分数为0.9644。

同比赛其他方案