343. IEEE-CIS Fraud Detection | ieee-fraud-detection
感谢我的队友 Rob Mulla @robikscube,@raddar 和 Yang @ljjsfe。
故事始于比赛刚开放时,Rob Mulla 和 Yang 独立提交了一些内容。Yang 独立达到了 0.927 的 Private LB(私有排行榜)分数。当 CHAMPS 比赛结束后,Rob 和我决定更激烈地投入到 IEEE 这场比赛中。
我曾私下向 Rob 指出,D 特征泄露了 user_id。然而,仅使用 D 特征是不够的,我看到许多用户从 isFraud=1 变回了 isFraud=0。我联系了 Raddar,因为他是逆向工程之王(我了解他在 ELO 和 Home Credit 后处理方面的实力)。在我向他解释了 D 特征后,他立刻知道如何利用这一点,并同意加入团队。我们当时缺失的一个简单问题是,还需要强制用户拥有相同的 card1-6, P_emaildomain, addr1-2 等信息。
在 Raddar 完成上述工作后,他开始尝试强制执行其他规则,例如 C 特征应该是单调的。通过简单地将测试集中 isFraud=1 的人后处理为 0.93,将 isFraud=0 的人后处理为 0.000001,他将我们的 Private LB 从 0.927 提升到了 0.9297(当看到我们的 Public LB 飙升这么高时,Rob 和我非常高兴 Raddar 能加入我们的团队)。
Yang 在 9 月 21 日联系我们要加入,鉴于他在 Home Credit 比赛中的出色表现,我们接受了他。
然后我开始基于 Raddar 创建的 user_id 进行 LB 探测。基本上,如果一个 user_id 只出现在测试集而不在训练集中,并且它的预测值很高(比如 >= 0.15),我就把它的所有预测改为 1。如果 LB 分数提高了,我就保留;如果变差了,我就把它改为全 0。我每天持续这样做直到比赛结束;这最终为我们赢得了相当数量的 AUC。
我们编写了一些与 user_id 相关的特征(如交易数量、最大 TransactionAmt、平均 isFraud 等),如果它们能提高 CV 分数,我们就选用它们。
我们开始担心训练集和测试集之间的分布差异,因为许多人说会发生大洗牌(而且很明显许多特征在测试集中有不同的分布)。因此,我们一次拟合一个特征来预测训练集与私有测试集(这种技术称为对抗验证)。从那时起,我们分出了两个分支:一个模型保留所有特征,另一个模型只保留在对抗验证中 ROC AUC <= 60% 的特征。
此外,在进行了如此多的 LB 探测后,我们开始在完整的训练集上训练,并使用来自测试集的 LB 探测结果作为伪标签。我们使用的迭代次数大约是(第 5 折的迭代次数)* 1.1。
在最后几天,我修改了 corey_user_id(不同于 raddar_user_id),使其仅基于 D 截距,然后按 card1-6, ProductCD, and P_emaildomain 分组。每当我尝试基于我的 ID 进行任何 LB 探测时,LB 都会变差。所以我做了一个修改:如果测试集中有一个 raddar_user_id 的 isFraud=1,那么对于映射到该行的 corey_user_id,将所有预测更改为 isFraud=0.99。如果 raddar_user_id 的 isFraud=0,则将预测更改为 0.0002。为什么?因为我对 raddar_user_id 更有信心(他按更多特征分组,并强制执行 C 单调性),而我的 corey_user_id 比较粗糙。然而,做这个后处理让我们的排名跳升了大约 20 名。
最后,我们要提交两个结果:
raddar_user_id 和 corey_user_id 的伪标签上盲目训练,然后进行了类似于我上面描述的后处理。该模型的 Public LB 为 0.