返回列表

Solution and code from 21st

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

开始: 2019-07-15 结束: 2019-10-03 反欺诈与反洗钱 数据算法赛
第21名方案与代码分享

第21名方案与代码分享

作者: bird (Grandmaster) | 比赛排名: 21st

排名前20的队伍通常不会发布解决方案。但发生的一些事情让我觉得有必要这样做。
我想说我不知道这次的大洗牌(shakeup)是否是巧合。我发布我在这次比赛中的轨迹是为了帮助那些想了解这次比赛的人。人们对这整团乱麻可能有不同的看法。你可以询问关于解决方案或代码的问题并发表评论。请不要在这里争论。

我所有的项目文件都在这个 GitHub 仓库中:https://github.com/white-bird/kaggle-ieee
如果你只想运行最佳模型,你应该运行:
f3_deepwalk.py,
fd_key.py,
fe_V307.py,
fi_yu.py,
model26.ipynb,
model32.ipynb,
内部融合内核:https://www.kaggle.com/whitebird/ieee-internal-blend

LB 9500-9520 阶段

我大部分时间都花在这里,当时我试图挖掘 count/mean/std 特征,但没有奏效。

LB 9520-9580 阶段

我意识到坏人偷卡并进行交易是为了钱,但卡片总是有一些保护措施,比如单笔交易的最大金额。所以他们需要在很长一段时间内用一张卡进行许多类似的交易,或者在短时间内用许多卡交易。这就是这次比赛的关键点——是连续的样本使其成为欺诈,而不是单个样本。
我们需要找到一些“键”来对数据进行分组:

  • 1) V307。 V 特征太多了。有些是整数,有些是浮点数。不难发现整数表示该卡与同一网站/卖家交易的次数,浮点数表示累计金额。显然,int + cardid 很容易导致误判。如果你有一些基线模型,我推荐 eli5 库来找出哪个特征最重要,这引导我发现了 V307。你可以在 model14.ipynb 中找到这些 EDA。我使用 fe_V307.py 来处理该特征。
  • 2) Deviceinfo & id。 不同的卡片在相同的地址使用相同的设备有相同的金额。这奇怪吗?所以我使用 fd_key.py 来提取它们。
  • 3) cardid + D。 我的队友发现了这一点。大家都知道 D 特征减去天数意义重大。我们发现通过对所有数据取最大值,D2 和 D15 在时间上表现最好,而 D2 和 D15 具有最大的值。相关代码在 fi_yu.py 中。
  • 4) amt + days + addr1。 这很简单但容易误判。

LB 9590-9600 阶段

所以我们都知道欺诈样本之所以是欺诈,是因为其相似样本是欺诈。为什么不让欺诈的传染性更疯狂一点呢?制作两阶段模型提高了 0.001:model26.ipynb + model32.ipynb

LB 9600-9630 阶段

这是由一个 bug 引起的。我对上面的键进行了分组,并在离线状态下获得了巨大的提升。然而,只有一个键——cardid + D——在线上表现不佳。我用了 2-3 天才发现,我是分别对训练集和测试集进行的分组。当我用所有数据对键进行分组时,线上效果有了提升。这意味着该键不像其他键那样用于制作分组特征,而是作为一个嵌入键。然后我写了一些规则用内核处理结果。这很容易理解,但带来了巨大的提升:https://www.kaggle.com/whitebird/ieee-internal-blend?scriptVersionId=21198581

还有一些我没有提到的其他小改进。如果你在阅读/运行我的代码时有任何问题,请在这里发帖。

同比赛其他方案