引入

链接

Competition Link: https://hub.crunchdao.com/competitions/causality-discovery

Code link: https://github.com/Ori-Replication/ADIA-Lab-Causal-Discovery

致谢

首先,我们十分感谢CrunchDAO和ADIA Lab带来的比赛。感谢所有工作人员的付出,你们的付出造就了这场精彩激烈的比赛。其次,感谢我的学校上海科技大学的宣传,并感谢告知了我这场比赛信息的两位同学——感谢他们对我的关心,让我得以了解到这场比赛。

这场比赛和这篇Solution均由来自上海科技大学的洪沐天和来自厦门大学的顾国勤共同完成。

解决方案

题目重述与分析

image.png

本次比赛中,我们的目标是进行因果关系的识别。具体来说,在一个因果图中,我们已知一个因果关系 X→Y ,其中X,Y是两个节点。除此之外,因果图中还有其他的节点,我们将它们以数字 0-9 中的某个数字命名。这些节点可能在 X 与 Y 的因果关系中充当一些角色,比如,上图中的 1 是 X 与 Y 两个节点的原因,0 则是 X 与 Y 两个节点的结果,而 2 与 X 和 Y 独立。

主办方基于因果图和某种规则生成了对于数据的观测,就如同上图左侧的那样,进行了1000次的观测。而我们的目标是一个分类任务:将其他节点 v 与 X Y 的边进行分类,比如 v→X,如果这条边存在,则为 1 ,否则为 0。这是最终我们被要求提交的格式,即分类 v 与 X, Y 边的存在与类型。更进一步,我们可以发现,v与X的可能的关系有三种,即 v→X, X→v 和 独立。与 Y 的同样有三种,这样排列组合就得到了九种关系。然而,其中有一种是不可能的,即 Y → v → X 这种情况,因为因果图必须是无环的。我们基于此,将这个问题定义为一个八分类问题。

具体来说,这八个类别分别为:

Confounder X←v→Y
Collider X→v←Y
Mediator X→v→Y
Cause of X v→X
Cause of Y v→Y
Consequence of X X→v
Consequence of Y Y→v
Independent v

简要思路(TLDR)

本次比赛我们采用的主要思路为,先创建大量特征,再使用提升树模型将这些特征集成起来,进行有监督的训练。我们的代码框架基于官方提供的 supervised_baseline 代码。

在本次比赛过程中,我们主要的精力花费在了特征工程上。这些特征包括各种相关系数,信息论特征,离散化统计指标特征,回归系数特征,无监督因果发现算法特征,检验特征,结构方程特征等多个种类的特征,具体的解释可见下文的特征工程-相关系数特征

在比赛的过程中,我们针对特征进行快速的迭代检验,我们通过探索性数据分析、阅读文献、浏览python库、检索、与生成式人工智能讨论等多种方式搜集可能有用的生成特征的方法,然后通过对应的方法处理数据,将新的特征与之前的特征合并后使用模型进行训练,观察是否能够给模型带来提升。最开始,我们使用随机森林以快速迭代,当我们发现随机森林性能随特征数量增加达到瓶颈后,就转换为使用LGBM模型进行检验。一般来说,我们贪心地选择能够给模型带来提升的特征,放弃导致性能下降的特征。同时,我们也通过数据增强等手段提高了分数。

在最终,我们尝试了多种模型融合策略。但在最终的提交中,我们选择了集成三个 XGBoost 模型,分别使用 7000, 7500, 8000 个分类器(其余参数相同,当然我们选择了三个幸运数字作为随机种子🤣),由于我们考虑到在私榜评测的训练数据会增加,因此我们适当增加了分类器的数量,相比于本地,最优的分类器数量为 7000。

详细步骤