返回列表

Private 41st Solution summary

517. Open Problems - Multimodal Single-Cell Integration | open-problems-multimodal

开始: 2022-08-15 结束: 2022-11-15 基因组学与生物信息 数据算法赛
Private 41st Solution summary

Private 第41名 方案总结

作者: Yoshio Sugiyama | 比赛排名: 41st

感谢所有的Kagglers和竞赛组织者。

这篇笔记记录了我在本次比赛中的工作。

这是一场测试“领域泛化性能”的比赛,Private测试数据来自训练数据中不存在的未来日期。另一方面,数据存在日期变化的因素,完全忽略日期特征是不可取的。

首先,我们进行了对抗训练(区分训练数据和测试数据的任务),发现Citeseq数据可以达到99%的分类准确率。我们担心使用这套特征进行训练会导致对训练数据的过拟合。然而,当我们减少特征数量以降低对抗训练的准确率时,Public LB的分数也大幅下降。

因此,我们决定设计某种生物学特征,并通过模型多样化来提高泛化性能。

✨ 结果

  • Private: 0.769
  • Public: 0.813

🖼️ 解决方案

🌱 预处理

  • Citeseq
    • 输入数据通过PCA降维至100维。
    • 另一方面,重要列的数据被保留。
    • 使用 Ivis 无监督学习 生成了100维特征。
    • 此外,我们将线粒体RNA细胞的总和添加到了特征中。
    • 元数据中的细胞类型被添加到了特征中。
  • Multiome
    • 对于具有相同列名前缀的每个组,PCA将维度减少到每个约100维。
    • 使用 Ivis 无监督学习生成了100维特征。

🤸 预训练

  • 进行对抗训练(区分训练数据和测试数据的任务),被误判的训练数据被用作良好的验证数据。
  • 对Multiome进行细胞类型的预测,并将其作为特征添加。

🏃 训练

  • 使用 StratifiedKFold,将良好的验证数据作为正标签。
  • 损失函数使用了皮尔逊相关系数。XGBoost的实现如下所述。
  • TabNet 也进行了预训练。(在本次比赛中,预训练的准确率更高。)

🎨 基础模型

  • Citeseq
    • TabNet
    • Simple MLP
    • ResNet
    • 1D CNN
    • XGBoost
  • Multiome
    • 1D CNN

Citeseq 通过各种模型的集成获得了很好的分数。另一方面,Multiome 的 1D CNN 表现强劲,与其他模型的集成效果不佳,因此只使用了 1D CNN。

🚀 后处理

  • 由于评估指标是皮尔逊相关系数,因此在集成之前对每个推理结果(包括OOF结果)进行了归一化。
  • 使用 Optuna 优化集成权重。使用良好的验证数据作为评估指标。
  • 与 Public Notebook x2 和队友的提交结果进行了集成。

💡 技巧

XGBoost 的皮尔逊损失

XGBoost 没有提供皮尔逊损失函数,所以我按如下方式实现了它。但是,这种实现学习速度较慢,我希望能稍微改进一下。

from functools import partial
from typing import Any, Callable

import numpy as np
import torch
import torch.nn.functional as F
import xgboost as xgb

def pearson_cc_loss(inputs, targets):
    try:
        assert inputs.shape == targets.shape
    except AssertionError:
        inputs = inputs.view(targets.shape)

    pcc = F.cosine_similarity(inputs, targets)
    return 1.0 - pcc

# https://towardsdatascience.com/jax-vs-pytorch-automatic-differentiation-for-xgboost-10222e1404ec
def torch_autodiff_grad_hess(
    loss_function: Callable[[torch.Tensor, torch.Tensor