第25名方案
第25名方案
作者: giba.kim (团队: borabori)
比赛排名: 第25名
感谢 Kaggle、Vesta 和 IEEE-CIS 举办了这次比赛。在写下我们团队方法的总结之前,我真的很想感谢我的队友们(@yeonmin, @chocozzz, @soonhwankwon, @sunghun),没有你们的辛勤工作,我们不可能取得这么好的成绩。我所有的队友都需要一枚金牌才能成为竞赛大师。这就是为什么我们选择“borabori”(天线宝宝里的丁丁)作为我们的队名,但我们以2名之差错过了金牌。下次一定 :D
概述
我们团队建立了两个独立的流程(pipeline)。这两种不同的方法差异很大,因此它们在集成时给了我们巨大的提升(堆叠对我们不起作用)。我将在下面写下每个流程的主要概念。
第一个模型
- 识别 Client_id: 在最开始阶段,我们发现了 D1 列的真正含义,因此我们可以通过 (card1, addr1, addr2, make_account_date_D1) 来识别 client_id,尽管并不是完美匹配。
- 再次讨论 Client_id 和 Card_id: 在粗略找到识别客户的方法后,我们认为如果能弄清楚如何识别以下两组对象会很棒:(1) 每笔交易的所有者是谁(=client_id),(2) 每笔交易使用的卡的所有者是谁(=card_id)。用户可以拥有多张卡。如果能够识别这两者,我们认为按 card_groups 或 client_groups 对交易进行分组,然后从中制作聚合特征将是解决此问题的最佳方法。(通过基于 card_groups 或 client_groups 实施 GroupKfold)。
- 失败之处: 直到比赛结束的最后一天,我们都未能找到完美的条件来识别分组。因此,我们生成了多种 client_id、card_id 组合来近似真实的 client_id 和 card_id。
- 特征工程 (FE): 基于那些“模拟的组合”创建了聚合、滞后、前导特征,例如每个客户购买了多少唯一商品(=ProductCD +'_'+TransactionAmt),上一笔交易与当前交易之间的时间间隔是多少。以及对某些分类变量进行频率编码。
- 特征选择: 首先,对于分类变量,我们只取训练集/测试集之间的共同值,并将不常见的值替换为 NaN。然后,通过对抗性验证检查移除了一些列。
- 验证策略: 正如我上面提到的,我们本打算使用基于 client_groups 或 card_groups 的 GroupKfold。但我们做不到。相反,我们选择基于 month_block 的 GroupKfold(K=6) 作为验证策略。
- 模型: LGBM(goss, dart, gbdt), CATBOOST, XGBOOST。就模型性能而言,(CAT > LGBM > XGB)。单模型的分数很大程度上取决于种子。因此,我们至少用 5 个不同的种子训练了每个模型。
第二个模型
- 识别 Client_id, Card_id
- LDA, NMF: 首先将数据类型更改为字符串并连接,然后对两个组合(['card_1','addr_1'], ['card1','id_20'])实施 LDA,对一个组合(['card4','DeviceInfo'])实施 NMF。
- 特征工程 (FE): 与第一种方法类似的工作 + 对某些分类变量进行目标均值编码。
- 验证策略: 首先,将数据集分为两个子组。一个是 "ProductCD" 为 "W" 的数据,另一个是 "ProductCD" 不为 "W" 的数据。然后,对每个子组实施 StratifiedKFold(K=5)。
- 模型: LGBM(goss, dart, gbdt), CATBOOST, XGBOOST。分数方面,(CATBOOST > LGBM > XGB)。
对我们无效的方法
- 神经网络 (NN): @soonhwankwon 在这部分真的非常努力。但是很难用 NN 建立一个稳健、高分的模型。而且,将结果与基于树的提升模型进行集成/堆叠也没有效果。
- DAE (去噪自编码器)
- 堆叠