为你的机器学习实践增光添彩的5个简单技巧

138 阅读8分钟

为高水准的数据科学工作而努力

从我上高中开始,我就有一种奇怪的痴迷,就是把我所学的所有东西的关键概念压在一页纸上。现在回想起来,这可能是我懒惰的心态,为了通过考试,我只需要做最少的工作......但有趣的是,这种抽象化的努力也帮助我在更深的层次上学习这些概念,并能更长久地记住它们。现在,当我教机器学习时,我试图以两条平行的轨道来教它:a)主要概念和b)方法和理论细节,并确保我的学生可以通过相同概念的镜头来看待每个新方法。最近我有机会阅读了Andrew Ng的《机器学习的渴望》,这似乎是他对一些实用的ML概念进行抽象的版本,而没有进入任何公式或实施细节。虽然它们看起来如此简单和明显,但作为一名ML工程师,我可以证明,忽视这些简单的提示是导致ML研究在生产中失败的最常见原因之一,而注意这些提示是区分一个好的数据科学工作与一个平庸的工作的原因。在这里,我想把我从安德鲁的书中得到的收获总结在一页纸上,并分成5个重要的提示,所以不用多说,让我们开始吧。

1-你如何分割你的可用数据很重要......很重要!

图1.数据分割

即使你不是一个数据科学家,你可能已经知道,为了衡量你的算法的泛化能力,你应该把你的可用数据分成训练集、设计集(验证集)和测试集,你不应该使用测试集进行任何模型优化/调整。虽然听起来很明显,但我见过很多从业者使用他们的测试集来手动优化超参数,然后在同一集上报告最佳结果的泛化性能......你猜对了......这是作弊!而且当模型性能在部署后下降时,他们仍然会感到惊讶。你应该确保不使用测试集进行任何形式的优化,包括手动超参数优化,那是你的开发/验证集的作用。

还要注意从训练集到设计集或测试集的任何数据泄漏。数据泄漏的一个愚蠢的原因可能是你的数据中存在重复的实例,这可能会在训练集和测试集中出现。如果你正在做连接来编译你的最终数据集,要特别警惕这一点。

在经典的ML中,当数据集很小的时候,我们经常使用60%-20%-20%的比例来进行训练-开发-测试的分割,无论是在憋气还是交叉验证的情况下。Andrew Ng认为,如果数据集很大,你可以使用小得多的数据集进行开发和测试。然而,你的开发集应该足够大,以检测你的模型性能的有意义的变化,例如,在你的开发集中有100个例子,只允许你检测你的模型的1%或更大的错误变化。

你的测试集应该与你的模型在部署时遇到的实际人群有类似的分布,而且应该足够大,以便让你对你的模型性能估计有信心。

最后但并非最不重要的是,确保利用分层抽样,这可以通过scikit-learn或其他库中的内置函数轻松完成。假设你的可用数据是人口的无偏样本,分层抽样可以确保你在训练/开发/测试的分割中分配这种无偏性。

因此,总结一下,对于数据的分割:a)确保你的数据分割是完全隔离的,b)你的测试(和开发)集与你的目标人群有相似的分布,c)使用训练集来优化模型参数,开发集来优化超参数,测试集来测量最终的模型性能。

2 -_估计每一个偏差、方差和数据不匹配的误差_成分 组成部分,以便有效地调试你的模型

泛化误差=偏倚+方差+数据不匹配

你可能已经听说过前两个部分。偏误是指分类器缺乏学习产生数据的基础函数的能力,例如,当一个线性回归模型试图学习由多项式函数产生的关系时,它的偏误会很高。方差误差,类似于统计学中的抽样误差,是由有限的样本量引起的,当分类器对一个特定的训练样本学习得太好,结果失去了对未见过的数据的通用性时,就会发生这种情况。这些误差都有精确的统计学定义,但大致来说,偏差误差是你在训练集上得到的误差,而差异误差是你的训练集到设计(验证)集的误差增加。

图2.三个错误来源

第三个错误或数据不匹配错误来自于测试/推理数据的分布与训练和验证数据不同的事实。例如,你使用从互联网上收集的数据训练一个猫种分类器,并使用它来部署一个猫分类器的移动应用,在部署之前,你用来验证你的模型的互联网猫图像和你在部署中看到的实际移动应用图像之间的分类性能差异就是数据错配误差,即从设计集到推理/测试数据的误差增加。数据不匹配在不同的情况下也有不同的名称,例如协变量转移或模型漂移;虽然每一个术语的定义都有细微的差别,但总体思路是一样的,如果你的测试集和目标任务有类似的分布,你的测试集误差可以给你在实际模型部署前的数据不匹配误差的准确估计。

3-_缩小你的调试选项与你的错误来源有关_的范围

图3.按错误来源的错误缓解策略

如果你的训练数据(偏置)误差很高,你可以尝试增加你的模型大小。对于神经网络,它可以转化为增加层数或神经元的数量。如果设计集误差和训练集误差之间的差异很高(方差误差),你可以尝试向训练集添加更多的数据。为了有效地做到这一点,你可以使用错误分析来了解特征空间的哪些区域会导致最多失败,并相应地针对你的数据收集。虽然收集更多的数据是减少方差误差的最佳策略,因为它不影响Bias误差,但这并不总是可能的。减少方差误差的下一个最佳方法是正则化(例如在神经网络中增加辍学或早期停止)。同样,降维或特征选择可以导致一个更小的模型,这反过来又减少了方差误差。请记住,正则化和降维也可能导致偏误的增加。

根据错误分析的洞察力,增加更多的相关变量或特征,可以改善偏误和方差错误。改善模型的结构也是如此。

4-决定是否在你的ML系统中插入手工设计的特征/组件的关键因素是可用数据的数量

图4.传统学习与端到端学习

拥有更多手工设计的特征或组件通常可以让ML系统用更少的数据量来学习。领域知识补充了我们的算法从数据中获得的知识。当我们没有太多的数据时,这种手工设计的知识变得更加重要。另一方面,如果没有数据短缺,可以采用端到端的设计,绕过人工特征工程的需要。

5-在训练中是否使用补充/增强的数据取决于你的模型能力

图5.扩充/补充数据

补充数据是任何与你的目标任务相一致的数据,但不完全来自同一分布。假设对于猫咪分类器的移动应用,你有10k用户上传的图片和20k从互联网下载的图片。这里的2万张互联网图片将是你的补充数据,如果你的模型很小,包括这些可能会占用你的模型的容量,限制用户上传图片的可学习性。然而,如果模型足够大,它可以学习这两个分布,并利用这两个集合之间的共性来巩固学习和更好地泛化(这是元学习背后的主要想法)。虽然Andrew Ng的书中没有提到这一点,但我认为同样的推理适用于包括任何可以产生类似文本、图像或表格数据的数据增强技术(例如对抗性数据增强)。如果你的分类器容量小,包括这些增强的数据不会有什么奇迹,但是当我们使用高容量的深度学习时,它可以作为一个正则器。

参考文献

Andrew Ng的《机器学习的渴望》(http://www.mlyearning.org/)


5个简单的技巧来增强你的机器学习实践》最初发表在Medium上的Towards Data Science,在那里人们通过强调和回应这个故事来继续对话。