返回列表

[1st Place Solution] My Betting Strategy

608. Home Credit - Credit Risk Model Stability | home-credit-credit-risk-model-stability

开始: 2024-02-05 结束: 2024-05-27 信贷风控 数据算法赛
第一名方案:我的投注策略
作者:yuuniee  |  比赛:Home Credit 信用风险模型稳定性竞赛(第一名)

第一名方案:我的投注策略

大家好,我是 yuuniee。
感谢本次比赛的举办方 Home Credit 及工作人员、Kaggle 工作人员以及所有参与者。

方案概览

在不使用度量化作弊(Metric Hacking)的情况下,我的模型池的私有排行榜最高得分约为 0.53。

众所周知,本次比赛分为两个阶段。
第一阶段是机器学习(ML),第二阶段是度量化作弊(MH)。
下面我将简要介绍每个阶段。
(如果您只关心机器学习部分,请只阅读第一阶段。)

第一阶段 – 机器学习

感谢在比赛初期编写了精彩的探索性数据分析(EDA)与解决方案笔记的 @sergiosaharovskiy@greysky,同时感谢许多参与者提供的各种见解。

  1. 交叉验证策略:采用 StratifiedGroupKFold,并分别以无 shuffle 与有 shuffle 两种方式测试训练。以我的经验,CV 差异在 0.001~0.005 区间时与排行榜(LB)相关性较低,而差异超过 0.01 时相关性较高。通过调节模型参数提升的 CV 与 LB 相关性也较低,而通过特征工程(FE)提升的 CV 与 LB 相关性则相对较高。
  2. 特征工程:没有特别之处,主要是针对每个变量计算 Max、Min、Avg、Var、First、Last 以及 Max‑Min 差值。(代码整理后会在后续发布。)
  3. LGBM:相比 Catboost 表现略逊,但在模型融合中仍然好用。特征数量较少的原因是部分特征(主要是类别型)因在 LGBM 中导致性能下降和过拟合而被剔除,另外又添加和删除了若干略有不同的特征。
  4. 深度神经网络(DNN):使用 Denselight 模型,基于 LightAutoML 库。库中存在一些 bug,我自行修复了几个,但整体而言它是一个不错的库。起初我打算先用 Denselight 进行轻量测试,再用更大的模型(如 FT‑Transformer 等)构建最终方案。出乎意料的是,我未能创建或找到能够超越 Denselight 性能的模型。或许是我的实现有误,亦或是数据本身对过拟合较为敏感,因而简单的模型效果更好。
  5. Catboost:是本次比赛表现最佳的模型,我认为它在大量类别特征(约 117 个)上表现尤为出色。

期间,我的公开排行榜成绩接近前五,比赛似乎进行得非常顺利。然而……

未奏效的方法

  • Transformer 类模型,如 Tabnet、TabTransformer、FT‑Transformer 等。
  • 按时间段(月、周等)统计的收入、支出和税费。
  • 个体收入、支出与税费之间的差异。
  • K‑means 聚类。

第二阶段 – 度量化作弊(MH)

在比赛初期,@at7459 对 MH 的问题提出了质疑,随后在比赛后半段,@johnpateha 宣布 MH 再次出现。

此外,感谢众多参与者提供的各种评论和方案。你们的建议拓宽了我的知识面。特别是上述两位,他们是真正的科学家和新闻工作者,本可以隐藏这一发现并从中获利,却选择向所有人公开(何不考虑 Kaggle 为此类分享颁发特别奖?)。虽然问题未得到解决,但我们从中至少学到了一些(?),并得以采取最低程度的防范措施。

@johnpateha 发表《Metric hack again, sorry》后,我尝试进行数据逆向分析,发现 date_decisionmin_refreshdate_3813885D 之间的差值与 WEEK_NUM 有很高的相关性(约 0.9 以上)。(详细信息请参见 @eivolkova 在比赛结束后立即发布的代码。)

以及 @at7459 提出的方法:

DEVIDE = 1/2
REDUCE = 0.02
condition = df['WEEK_NUM'] < (df['WEEK_NUM'].max()-df['WEEK_NUM'].min())*DEVIDE+df['WEEK_NUM'].min()
df.loc[condition, 'score'] = (df.loc[condition, 'score'] - REDUCE).clip(0)

基于此,我在改变 REDUCEDEVIDE 参数后提交并检查得分细节,得到如下结果:

  1. 公开/私有测试数据的划分跨越了整个时间段,难以确定具体的分布,私有部分的最佳值大概分布在 1/4 到 3/4 之间。
  2. 在我的模型中,公开排行榜最佳的 REDUCE 参数为 0.03,私有部分的最佳值大概分布在 0.02 到 0.04 之间。

顶级选手之间的纯模型性能差距只有 0.00X,而上述调节值引起的差距达到 0.0X,在这个阶段对我来说变成了赌博。

有人会压低,有人会压高。在这里,我信任自己的模型,选择了中性方案,即 DEVIDE=1/2REDUCE=0.03,这是预期分布的中位数。我预计高位或低位下注者会夺冠,而我约有 50% 的概率进入前十。

结论

  • 第一次选定的提交是 Phase 1 中使用最佳 CV 分数的“无作弊”模型,第二次选定的提交是对其进行度量化作弊的版本。(我认为 Metric Hack 较大概率有效,但也提交了无作弊版本以防万一)
  • 与单纯分享解决方案相比,我认为更应该详细分享我的经验,以改进本次比赛中出现的不足。
  • 我的排名靠的是运气,虽然提交的是最佳私有分数,但它可能并非最佳方案。
  • 虽然由于度量化作弊事件比赛的结尾有些黯淡,但主办方和工作人员仍辛勤工作,使其成为了一次有意义且成功的比赛。
  • 基于此,我们期待未来能有更完善的制度。

谢谢!

同比赛其他方案