473. PetFinder.my - Pawpularity Contest | petfinder-pawpularity-score
公共榜排在400名开外,私有榜最终排名第13,让我们开始吧!
本次比赛中CV(交叉验证)与LB(排行榜)的相关性非常差,因此我决定专注于尽可能提高我的CV分数。我使用了10折分层交叉验证,目标值被分箱为20个bins,这比单纯使用KFold或基于目标的Stratified KFold提高了稳定性。
我在任何地方都没有使用早停,因为我担心这会给我带来严重偏差的OOF(袋外)分数,这会让我的CV更加不可靠。与其寻找OOF分数最好的模型,我更专注于寻找好的训练机制,以获得最佳且最稳定的平均CV分数。
在优化方面,使用带有余弦退火线性预热计划的AdamW效果不错。训练通常进行3-5个epoch。
像比赛中的许多人一样,我一开始使用Swin模型,但后来更多地关注集成,并尝试了不同的模型(包括Transformer和CNN)。最终的集成模型如下:
| 模型名称 | CV分数 (含水平翻转TTA) |
|---|---|
| swin_large_patch4_window7_224 | 17.520346 |
| swin_large_patch4_window12_384 | 17.459443 |
| swin_large_patch4_window12_384 CE loss | 17.434677 |
| vit_large_patch16_224 | 17.793921 |
| vit_base_patch16_384 | 17.803793 |
| ig_resnext101_32x8d | 18.08631 |
| tf_efficientnet_b4_ns | 18.158774 |
| Ridge OOF 集成 | 17.134049 |
最好的模型是使用交叉熵损失的swin_large_patch4_window12_384,加入ViT和ResNext确实提高了最终的集成分数。
最终集成是使用Ridge回归对OOF分数进行的。
我尝试了不同的损失函数——MSELoss、L1Loss和HuberLoss效果都很差,BCELoss总体上最好。我还尝试使用多类交叉熵损失,将目标分箱为20个bins,并预测每个bin的平均值/中心值。这种情况有时效果不错——最好的模型就使用了它,但总体上它需要相当多的额外训练机制调整,并且在其他模型上效果不佳(或者我只是找不到适合它们的好的训练机制)。此外,出于某种原因,这个损失函数非常讨厌mixup(我尝试了不同的方法来使用它,确实如此)。