如果你最近才开始使用Kaggle,或者你是这个平台的老用户,你可能想知道如何轻松地提高你的模型的性能。以下是我在Kaggle之旅中积累的一些实用技巧。建立自己的模型或只是从一个基线公共内核,并尝试实施这些建议!
回顾过去的比赛
虽然Kaggle的政策是永远不会出现两次相同的比赛,但经常会有非常相似的问题的重新制作。例如,一些举办方每年都会针对同一主题提出定期的挑战(NFL’s Big Data Bowl ),只有很小的变化,或者在某些领域(比如医学成像)会有很多比赛,目标不同,但思路非常相似。
因此,回顾获胜者的解决方案(多亏了不可思议的Kaggle社区,他们总是在比赛结束后公开)是一个很好的加分项,因为它给了你开始的想法,以及一个获胜的策略。如果你有时间去回顾它们,你很快就会发现,即使在非常不同的比赛中,一些流行的基线模型似乎总是做得足够好:
- 卷积神经网络或更复杂的ResNet或EfficientNet在计算机视觉挑战中,
- 在音频处理挑战中的WaveNet(也可以通过图像识别模型很好地处理,如果你只是使用Mel谱图),
- BERT及其衍生物(RoBERTa等)在自然语言处理挑战,
- 对表格数据LGB(或其他梯度增强树策略)…
你可以直接在Kaggle平台上寻找类似的比赛。
回顾过去的比赛还可以帮助您获得关于下面解释的所有其他步骤的提示。例如,提示和技巧对预处理类似的问题,人们如何选择hyperparameters,什么额外的工具中实现他们的模型让他们赢得比赛,或者如果他们只专注于装袋的类似版本最好的模型或者将所有可用的公共内核进行堆叠。
数据准备上时间是永远不够的
这还远远不是这份工作中最令人兴奋的部分。然而,这一步骤的重要性怎么强调也不过分。
清理数据:永远不要认为举办方致力于为您提供最干净的数据。大多数时候,它是错的。填补nan,消除异常值,把数据分割成类别的齐次观察……做一些简单的探索性数据分析,以获得您正在进行的工作的概述(这将帮助您获得见解和想法)。这是这个阶段最重要的一步。如果不了解数据是如何构建的、您拥有哪些信息、针对目标可能具有哪些单独或集体的一般行为特征,那么您将会失去对如何构建模型的直觉。绘制图表,直方图,相关矩阵。增加数据:这可能是提高性能的最好方法之一。但是,要注意不要把它弄得太大,以至于您的模型无法再处理它。你可以在互联网上找到一些额外的数据集(版权问题需要特别注意),或在Kaggle平台上(在过去类似的比赛!),或者只是在你提供的数据:翻转和作物图像叠加录音,back-translate或同义词替换文本…
预处理也是您必须仔细考虑将要使用的交叉验证方法的步骤。Kaggle的座右铭基本上是:信任您的CV。处理数据将帮助您知道如何分割数据:对目标值或样本类别进行分层?您的数据不平衡吗?如果您有一个聪明的CV策略,并且仅依靠它而不是靠排行榜得分(尽管这可能很诱人),那么您很可能会在私人最终得分上获得惊喜。
尝试hyperparameter搜索
超参数搜索可帮助您找到模型应具有的最佳参数(学习率,softmax的温度等),以获得最佳的性能,而无需手动进行数千次无聊的实验。
最常见的超参数搜索策略包括:
网格搜索(请永远不要这样做):就我而言,这是性能最差的方法,因为对于某些值,您可能会完全错过某个模式或性能的局部峰值,它包含或测试按您可能的值间隔平均分布的超参数值定义;
随机搜索(及其蒙特卡洛衍生物):您尝试参数的随机值。它的主要问题在于,它是一种并行方法,并且随着所测试的参数的增加,很快会变得非常昂贵。但是,它的优点是可以让您在测试中包括先验知识:如果您想在1e-4和1e-1之间找到最佳学习率,但是您假设它必须在1e-3附近,则可以绘制样本来自以1e-3为中心的对数正态分布。
贝叶斯搜索:基本上是随机搜索,但在迭代方面有所改进,因此成本更低。它基于当前模型迭代评估有前途的超参数配置,然后对其进行更新。这是三者中表现最好的。
其他方法(包括基于梯度的搜索或进化优化)更具危害性,通常不适用。在某些特殊情况下可以推荐使用它们。
有许多AutoML工具可以很好地为您完成这项工作。但是耗费资源,如果计算资源充沛的话可以试试。
简单的做法可以改变游戏规则
我发现有一些模型包装器可以用来获得更好的结果。它们在不同级别上工作:
在优化过程中,请不要忘记添加学习速率调度程序,以帮助获得更精确的训练(从小开始,当模型学习良好时逐渐增加,例如减少平稳的步伐)。
仍然在优化过程中,您可以将Lookahead包裹在优化器中;先行算法包括前进k个优化步骤,找到最佳性能的位置,然后朝该最佳方向退后一步并从此处重新开始训练。从理论上讲,您可以获得更好的性能,尽管我从未发现这是真的。但是它可以稳定训练,这在数据非常嘈杂时很有用。
在开始训练之前,为权重找到一个很好的初始化方法:如果您使用的是流行的体系结构,请从基线权重(例如图像识别中的ImageNet)开始,如果不是,请尝试分层顺序单位方差初始化(LSUV,最好的初始化方法-理论上)。它包括将权重初始化为正交,并在所有可训练层上初始化单位方差。
最后,我经常发现从神经网络的最后一层权重训练LGBM,而不是添加softmax作为输出层,效果会非常好。
Bagging集成!
除了数据扩充之外,没有什么技术比混合(也称为装袋)来提高性能更有效。
我的个人建议是,我总是将自己的分袋后的最终模型中保存的每一个模型预测保存下来,然后将它们平均化(只是基本平均,我从未发现过任何“巧妙”整合的证据,例如权重)模特的独奏表现会在最终得分中添加任何内容)。别忘了混合公共内核。
集成策略中拥有的模型越多,您越有可能幸免于私人排行榜的变化。确实,使模型多样化可以使最终结果更加可靠。这与金融中的一项基础投资组合多元化的想法相同:代替具有给定收益和给定方差的一项资产,而是选择具有相同收益和方差的许多不同资产,因为它们都不太可能全部同时提款,一个人的损失将由另一个人的胜利来补偿。以同样的想法,而不是仅仅依靠一个模型,而是进行许多不同的模型投票:大多数模型预测的目标(分类)或每个模型预测的目标均值(回归)很可能是更接近真实答案。
希望您喜欢这篇文章,希望你在比赛中获得更好的成绩。