517. Open Problems - Multimodal Single-Cell Integration | open-problems-multimodal
大家好,距离我上次积极参与竞赛已经有一段时间了,这是一次很棒的体验!虽然我不再活跃,但我经常回Kaggle浏览新想法。我注意到,如果你没有积极参与那场比赛,仅仅阅读顶级解决方案并不是很容易学到新东西……其中一个原因可能是我们大多分享最终有效(或无效)的内容,而不是达成目标的思考过程。对于像我这样有点懒或有点忙而无法积极参与的人,或者可能有点缺乏经验的人来说,我认为分享“我是如何走到这一步的”比“我在这里”更有益。所以本着这种精神,我想开始以这种方式分享解决方案……
我的工作可能很忙,所以只要能把工作委托给计算机,我就会去做;如果不能,我会尽量减少编码所需的时间,以便尽可能利用碎片时间。我参加这次比赛主要是为了学习特征提取如何处理高维输入和输出。这些决定了我接下来决定尝试的实验,以及我在这个过程中犯下的错误,所以我认为分享这些很重要。
首先阅读讨论区以了解数据的内容,并浏览热门的公共内核以了解什么可以用作基线。我注意到主要使用 TruncatedSVD 来降低维度。
我觉得包含所有特征训练一个 MLP 模型可能是个好主意。而且我太懒了,不想建立本地验证流程,所以只是随机抽样了 10% 作为验证集。结果在公共榜单上与公共内核相比并不理想。
然后我在想,好吧,也许是因为 MLP 很差。但是在 CPU 上训练 xgboost/lightgbm 会花很长时间,而且在 GPU 上会内存不足。所以需要一个更好的神经网络模型。Tabnet 怎么样?(很糟糕)。好吧。我记得有一篇论文声称性能与 xgboost 相似。OK。找到了。https://arxiv.org/pdf/2112.02962.pdf(它叫 DANets)。好一点,但还是不够好……
现在回到公共内核作为基线。也许不用 SVD,我们可以用自编码器?OK,只有线性自编码器表现还可以,任何非线性都不起作用……无论使用什么技巧(例如交换噪声增强)。嗯……
再次回到 TSVD + MLP 作为基线……让我们先改进这个基线。首先用 DANets 替换 MLP。让我们只关注 Cite,因为它只有高维输入。对 Cite 有效的方法应该对 Multi 有效,对吧?(时光机:并不!)
让我们标准化数据,因为 PCA 喜欢它。OK。稍微好一点。解释方差似乎很低,但添加更多成分作为特征似乎没什么帮助。所以输入可能噪声很大。真的不知道该怎么办。好吧,如果没有更好的主意,我们可以总是添加不同的分解方法。添加了 NMF, FactorAnalysis, FastICA。OK。它们都起作用了。
现在让我们也训练一些 xgboost 模型,因为现在我们可以在 GPU 上训练。OK,酷。将 xgboost 与 DANets 平均显著改善了结果。
也许应该再试试自编码器……读了一些论文。OK。还是没用。
让我们尝试一些流行的非线性降维技术。UMAP, TriMAP, PaCMAP。似乎都不起作用。
XGBoost 或 LightGBM 为每个目标训练一个模型,这看起来很浪费,并且可能没有考虑输出之间的相关性。让我们看看有没有更好的方法。https://arxiv.org/abs/1909.04373 找到了这个 GBDT-MO。而且有代码。试过了。效果不是很好。
在讨论区读到我们可以通过匹配 Cite 的输入/输出名称来选择特征。试过了,很有效。不错。
还在讨论区读到输入中的 0 可能不是实际的 0,也可能是缺失值。OK。尝试通过将所有 0 视为缺失值来计算均值/标准差,然后计算 PCA。添加到特征中稍微改进了模型。
意识到如果 0 可以被视为缺失,那么我们也可以根据这篇旧论文以不同的方式计算 PCA (https://www.sciencedirect.com/science/article/abs/pii/S016974399600007X)。有一点帮助。
OK……停止懒惰,花周末时间为 Cite 建立适当的交叉验证流程并重新训练模型。不错。榜单分数从 0.812 大幅提升到 0.814。
看到一些关于补充原始数据的讨论。嗯,我相信主办方已经做了最好的预处理,可能没什么帮助,而且处理两个数据集很痛苦,所以忽略了。(时光机:大错误!)
接近比赛的最后一周,所以将 Cite 流程改用于 Multi