返回列表

6th place solution

339. Recursion Cellular Image Classification | recursion-cellular-image-classification

开始: 2019-06-27 结束: 2019-09-26 药物研发 数据算法赛
第6名方案

第6名方案

作者: Oleg Yaroshevskiy
团队: Andriy Yaroshevskiy, Pajari, Vitaliy Fedorovych
发布时间: 2019-09-27

各位 Kagglers 好啊!比赛办得不错,恭喜所有获胜者以及所有学到了新东西的人。感谢并祝贺我的队友 Andriy ( @ayaroshevskiy ),Sasha ( @pajari ),Vitaliy ( @ladler0320 )。这是我们非常简单直接的方案的简短总结。

关于“数据泄露”

我不想在定义上争论。但实际上,那只是目标类别的共现,我建议在每个多分类挑战的 EDA(探索性数据分析)中都要检查这一点,就像检查类别不平衡一样。EDA 是必须的。
例如:
df.groupby(["experiment", "plate"]).sirna.apply(lambda x: x.sort_values().unique())
那么它们为什么会以这种方式共现?为什么实验只在板内进行混洗?我想这是设计上的原因,对于 1100 多个类别来说,很难对每一个实验都进行混洗,但无论如何,这些知识显著降低了误差。

关键点:分配问题

正如大家所知,关键在于利用神经网络的原始/softmax 预测结果来解决分配问题。所以我们也使用了匈牙利算法。

详细方法

  • 验证。我使用了 30/33 个实验作为验证集,分为3折。(另外 3 个实验进入所有折)。我通过迭代手动交换实验以对齐它们的分数。HUVEC-18 也被放入了训练集。我们发现 Public LB 包含 U2OS-04,很难为该特定实验取得好成绩。我从我们的大多数提交中删除了它,以查看其他三种细胞的分数。但这同时也给了我们一个机会,即其他人可能会过拟合 Public LB。Private U2OS-05 没问题,看起来更像 U2OS-03/U2OS-01。
  • 图像归一化。组织者提供了像素统计数据,所以我们按原样使用——通过均值/标准差缩放所有实验。在比赛结束时,我发现用 U2OS-02 的均值/标准差缩放 U2OS-04 将其分数提高了 10%。但谁在乎 Public LB 的实验呢 ¯\_(ツ)_/¯
  • 网络。我们在 Kaggle Kernels 中训练了第一个带有 softmax 的分类模型——EfficientNet-b0,当时还没有 GPU 配额限制。然后是在我的 2x1080ti 开发机上。由于缺乏 GPU,我没有太多时间进行建模,但我发现 EfficientNets 的效果明显优于 Densenets 和 Resnets/SE-Resnets。b0 的一折大约需要 9 小时,但 CPU 是瓶颈。
  • 强力增强。所有翻转/旋转。概率为 0.8 的强力亮度和对比度调整。Gamma 变换,通道丢弃。我发现一件事——uint8 增强的效果不如 float,因为存在分布离散化的问题。
  • 训练过程。我用 Adam 训练所有东西,使用 ReduceOnPlateau 和一些预热迭代。我花了很多时间试图理解为什么人们声称 SGD 效果更好,但没机会——Adam 像往常一样表现更好。
  • 对照组。我们简单地将训练和测试(!)对照组作为附加类别 1108:1139 添加进去。这显著提高了分数。

第一次迭代

预训练的 EfficientNets b0、b1、b2 取得了几乎相同的分数,但混合它们的原始预测然后解决分配问题很好地提升了分数。平均这 3 个模型的分数为 0.744/0.750(3 种细胞,U2OS-04 已剔除)Public LB 和 0.990 Private LB(第 13 名)。

伪标签

我看到了几种如何拆分测试实验进行伪标签的策略。实际上我尝试了大约 6 种策略,进行了一两次 PL 迭代。最后我采用了非常谨慎的策略——软标签和在折之间平衡拆分实验:

pl_all_folds = ["HEPG2-10", "HUVEC-19", "RPE-10", "U2OS-05"]
pl_folds = [["HEPG2-08", "HUVEC-17", "HUVEC-23", "RPE-08"],
        ["HEPG2-09", "HUVEC-20", "HUVEC-21", "RPE-09"],
        ["