返回列表

40th place solution | MLPs, ResNet, TabNet & Clustering

407. Mechanisms of Action (MoA) Prediction | lish-moa

开始: 2020-09-03 结束: 2020-11-30 药物研发 数据算法赛
第40名方案 | MLPs, ResNet, TabNet & 聚类

第40名方案 | MLPs, ResNet, TabNet & 聚类

作者: Ravox
比赛排名: 第40名

恭喜获胜者们!

以下是我的方法:

交叉验证 (CV)

作为任何 Kaggle 比赛最重要的部分,即寻找一个好的交叉验证框架,在这次比赛中简直是一场噩梦。我最初使用了 10 折交叉验证,但它对公开排行榜的泛化能力很差,于是我切换到了 多标签分层 10 折交叉验证。由于对 LB 的泛化能力依然较弱,我决定只保留那些能同时改善我的 CV 和 LB 分数的改动。我认为这是本次比赛的关键。我也尝试过 Chris Deotte 的 CV 策略,但发现它并不比我原来的 CV 泛化得更好,所以我坚持使用了多标签分层 10 折交叉验证。

模型

以下是我最终集成中使用的模型:

  • MLPs (4 个模型):
    我的灵感来自 这个 Notebook。在我最终的集成中,我使用了 4 个 MLP:2 种不同的架构(层数不同),其中一个使用了新的 CV 框架(来自 Chris Deotte),另一个还预测了非评分标签。
    CV (最佳 MLP):0.01571 // LB:0.01834
  • ResNet (1 个模型):
    我首先在本地重新实现了 这个 Notebook,并将其转换为 PyTorch。
    CV:0.01601 // LB:0.01854
  • TabNet (1 个模型)
    TabNet 在这次比赛中表现惊人。我之前不熟悉这个模型,这是一个令人愉快的发现。我从 这里 描述的实现开始,仅通过更改参数就将 LB 降到了 0.01827。关键在于设置 n_shared = 1n_independent = 1。同时切换到 OneCycleLR 调度器并减少权重衰减也很重要。
    CV:0.01569 // LB:0.01827

训练

有几个要素至关重要。我在所有模型中都使用了这些超参数:

  • 对每个折中使用不同随机种子训练的 5 个模型进行平均
  • 权重衰减:8e-6
  • 标签平滑:1e-4
  • OneCycleLR 调度器,25 个 epoch,max_lr 为 5e-3,div_factor 为 1e3

模型集成

没有什么花哨的,只是加权平均。
最佳权重:
0.5 * MLPs + 0.1 * ResNet + 0.4 * TabNet
CV (不包括使用新 CV 框架训练的 MLP):0.01556 // LB:0.01821

聚类

我们知道有些药物同时出现在训练集和测试集中。此外,在给定 drug_id 后,我们发现按频率计算有 8 种药物占主导地位。所以我想我们可以做一些聚类,找到接近这 8 种药物形成的聚类的测试药物。我首先训练了一个 t-SNE 模型,将这 8 种药物 + 公开测试集的基因+细胞特征空间降维到 2 维。然后,在绘图时,我注意到这 8 种药物中有 5 种具有清晰、分离的聚类。因此,对于接近这 5 种药物聚类中心(在 2 维空间中,使用 L2 距离)的测试数据点,我将我集成模型当前的预测与这 5 种药物的标签进行了混合。令人惊讶的是,这帮助我的公开 LB 从 0.01821 提升到了 0.01819,这在私有 LB 上分别对应 0.01611 和 0.01609。我甚至没有检查这对 CV 有多少帮助。为了保险起见,我只在两个最终提交中的一个使用了这种聚类方法。

同比赛其他方案