343. IEEE-CIS Fraud Detection | ieee-fraud-detection
哇,这真是一次痛快淋漓的经历!
首先,我当然要感谢 Kaggle 设立了这么棒的比赛,还要感谢我出色的队友 @psilogram,能与您合作是我的荣幸,我学到了很多东西!感谢您决定与我并肩作战。
这是一场不可思议的比赛。我将重点介绍我为了支持和增强 Silogram 的模型而运行的非模型流程。我的解决方案经历了无数次迭代,这里只提及最后的方案。另外——这里写的都不是什么绝对真理,只是我个人的发现。
指引我的主要原则是 Lynn 的说明:
我们标记逻辑是将报告的信用卡拒付定义为欺诈交易(isFraud=1),并且在其之后发生的、与用户账户、电子邮件地址或账单地址直接相关的交易也被标记为欺诈。
经过一些 EDA(探索性数据分析),我发现一旦某个客户有过一次欺诈行为,大多数情况下该客户未来的所有交易也会是欺诈。我的目标是创建卡片分组,如果我们发现其中一个是欺诈,就可以将它们全部标记为欺诈,并且保留训练集中的欺诈记录,以便在未来将这些客户标记为欺诈。
我们可以通过卡片、date-d1、addr1+2、dist1+2 来分组识别客户,但有很多缺失值(NA),如果只有 addr1 不同,可能是不同的客户,而当它是 NA 时,我们无法知道它是谁,所以我采取了不同的方法。
我将从我用到的分组开始讲起,然后继续讲我是如何发现这些的,所有这些都是通过迭代脚本完成的。在每个分组中,都有多重健全性检查,以考虑因数据缺失而丢失的信息。例如,V307 不是 TransactionAmt 的简单累计求和,它是过去 30 天的累计,如果一张卡有超过 1 个月的连续数据,有时 V307 不会等于前一个 V307 + 前一个交易金额,而且如果客户两次交易间隔超过 30 天,V307 会失去信号变为 0。我无法列出所有的检查和轮次,但我会说明一般准则。
使用 unique_card1-6 和 date-D1,通过 V307 = CumSum(TransactionAmt)(过去 30 天内,TransactionDT - 2592000)识别下一笔交易,并且要么 Date-D3 = 上一笔交易的日期,要么 V322 = 前一个 V322 + 1(当 D3 为 NA 时)。
按 id_19+id_20+id_31+DeviceInfo 分组,通过 V264 = CumSum(TransactionAmt)(过去 30 天内,TransactionDT - 2592000)识别下一笔交易,V218 = 上一笔交易的 V218 + 1,并且共享相同的 D1 或 D4。
按 id_19+id_20+id_31+DeviceInfo 分组,通过 V203 = CumSum(TransactionAmt)(过去 30 天内,TransactionDT - 2592000)识别下一笔交易,V168 = 上一笔交易的 V168 + 1,并且共享相同的 D8。
“用户分组”这种类型跨越了不同的卡片。其中一些仅适用于特定的 ProductCD。这使我可以填充数据中的许多 NA,包括 addr、dist、card 特征。
我的集成输出是:
利用这些,Silogram 能够在集成中使用额外的特征,使模型能够将其发现的欺诈交易,并将该交易的整个组标记为更高的欺诈概率。
我相信还有很多事情可以做,Silogram 和我在最后一天都有突破,使我们的分数显著提高,但没有足够的时间进一步探索。
我现在认为,在阅读了其他人的文章后——我在分组方面可能采取了过于保守的方式,或者选择的逻辑生成的组质量不如其他人。我做了大量的 EDA,但可能因为睡眠不足而过于疲惫,有时我会盯着数据发呆,大脑仿佛融化了。也许值得不时地以全新的视角重新审视我所有的假设。
...........
作为题外话。我在比赛开始时使用了 Power BI 模型,允许自己在仪表板中拖放和对象交互功能。这非常有价值,因为我可以即时拖拽 card、addr、D1,并有一个度量值显示所有在训练集和