在这篇文章中,我们将讨论一些有效的ML测试的策略。你将学习如何测试和评估模型,克服常见的瓶颈,以及更多。
ML测试的目标是什么?
首先,在进行ML测试以及任何软件测试时,我们要达到什么目的?
- 质量保证是需要的,以确保软件系统按照要求工作。所有的功能都按照约定实现了吗?程序的行为是否符合预期?你测试程序的所有参数都应该在技术规范文件中说明。
- 此外,软件测试有能力指出开发过程中的所有缺陷和瑕疵。你不希望你的客户在软件发布后遇到bug而挥舞着拳头来找你。不同种类的测试使我们能够捕捉到只有在运行时才能看到的bug。
然而,在机器学习中,程序员通常会输入数据和期望的行为,而逻辑则由机器来阐述。这对于深度学习来说尤其如此。因此,机器学习测试的目的首先是要确保这种学习的逻辑将保持一致,无论我们调用程序多少次。
机器学习测试中的模型评估
通常情况下,软件测试包括:
- 单元测试:程序被分解成若干块,每个元素(单元)都被单独测试。
- 回归测试:他们覆盖已经测试过的软件,看它是否会突然中断。
- 集成测试:这种类型的测试观察程序的多个组件如何一起工作。
此外,还有一些人们遵循的规则:在通过所有测试之前不要合并代码,总是测试新引入的代码块,当修复错误时,写一个捕获错误的测试。
机器学习为你的工作清单增加了更多的行动。你仍然需要遵循ML的最佳实践。此外,每个ML模型不仅需要被测试,而且需要被评估。你的模型应该有很好的泛化能力。这不是我们通常所理解的测试,但需要评估以确保性能令人满意。
_(1).jpg)
首先,你把数据库分成三个不重叠的集合。你用一个训练集来训练模型。然后,为了评估模型的性能,你使用两组数据:
- 验证集:如果你做了很多轮的超参数调整(总是这样),只有一个训练集和一个测试集是不够的。而这可能会导致过度拟合。为了避免这种情况,你可以选择一个小的验证数据集来评估一个模型。只有在你在验证集上获得最大的准确性之后,你才会让测试集进入游戏。
- 测试集(或暂缓集):你的模型可能完全适合训练数据集。但哪里能保证它在现实生活中也能做得很好?为了保证这一点,你从训练集中选择样本作为测试集--机器以前没有见过的例子。重要的是,在选择过程中要保持无偏见,随机抽取样本。另外,你不应该多次使用同一个集合,以避免在你的测试数据上进行训练。你的测试集应该足够大,以提供有统计学意义的结果,并能代表整个数据集。
_(1).jpg)
但是就像测试集一样,验证集在反复使用时也会 "磨损"。你使用相同的数据来决定超参数设置或其他模型改进的次数越多,你就越不相信模型会在新的、未见过的数据上有良好的概括性。因此,收集更多的数据来 "刷新 "测试集和验证集是个好主意。
交叉验证
交叉验证是一种模型评估技术,即使在有限的数据集上也可以进行。训练集被划分为小的子集,模型在这些样本中的每一个上进行训练和验证。
k-折交叉验证法
最常见的交叉验证方法被称为k-fold交叉验证。要使用它,你需要把数据集分成kk k个子集(也叫折),并使用它们kk k次。例如,通过将数据集分成10个子集,你将进行10次交叉验证。每个子集必须至少被用作验证集一次。
_(1).jpg)
这种方法对于测试机器学习模型在未见过的数据上的技能很有用。它之所以如此受欢迎,是因为它应用简单,即使是相对较小的数据集也能很好地工作,而且你得到的结果通常是相当准确的。如果你想了解更多关于如何交叉验证模型的信息,请查看Medium上更详细的解释。
撇除交叉验证
在这种方法中,我们在数据集中的所有数据样本上训练模型,只有一个数据点是用来测试模型的。通过反复地重复这个过程,每次留下一个不同的数据点作为测试集,你就可以测试所有数据的性能。
这种方法的好处是偏差小,因为所有的数据点都被使用。然而,它也导致了更高的测试差异,因为我们每次都是针对一个数据点测试模型。
交叉验证提供了对数据更有效的利用,有助于更好地评估模型的准确性。
使用指标评估模型
使用不同的指标来评估模型的性能是每个数据科学项目不可或缺的。以下是你必须关注的内容。
准确度
准确度是衡量模型所做预测的真实程度的指标。准确率越高,就越好。然而,当你估计性能时,它不是唯一重要的指标。
损失
损失描述了不良预测的百分比。如果模型的预测是完美的,损失为零;否则,损失更大。
精度
精度指标标志着模型在识别阳性结果时有多大的正确性。例如,模型对真正患有癌症的病人诊断出癌症的频率。
召回率
这个指标衡量正确预测的数量,除以应该被正确预测的结果数量。它指的是由你的算法正确分类的相关结果总数的百分比。
混淆矩阵
混淆矩阵是一个N×NN/timesN N× N的方表,其中 NNN是模型需要分类的类的数量。通常情况下,这种方法适用于每一列代表一个标签的分类。例如,如果你需要将水果分为三类:橙子、苹果和香蕉,你就画一个3×33\times3 3× 3的表格。一个轴将是实际的标签,另一个是预测的标签。
.jpg)
ML模型调试的最佳实践
在评估了性能之后,我们仍然要弄清楚错误发生的位置和原因。
ML的调试与其他软件系统的调试有些不同。由ML模型做出的预测质量差并不一定意味着有一个错误。你必须调查比传统编程中更广泛的原因:也许是数据包含错误,或者超参数没有调整好。这使得ML模型的调试相当具有挑战性。
数据调试
首先,你应该从数据调试开始,因为模型做出的预测的准确性不仅取决于算法,还取决于数据本身的质量。
数据库模式
帮助你检查数据是否包含预期的统计值的一个工具是数据模式。
数据库模式就像一张地图,描述了数据库的逻辑:数据是如何组织的,样本之间的关系是什么。它可能包括某些规则,如:
- 确保提交的数值在1-5范围内(以评分为例)。
- 检查所有的图片是否为JPEG格式。
该计划可以有两种类型:
- 物理的:它描述了数据将如何被存储,其格式等。
- 逻辑的:这种类型以表、标记或方案的形式表示数据库的逻辑组成部分。
_(1).jpg)
工程数据应该被单独检查。虽然原始数据可能没有问题,但工程数据经历了一些变化,可能看起来完全不同。例如,你可以写测试,检查离群值是否被处理,或者缺失值是否被平均值或默认值所取代。
模型调试
一旦你测试了你的数据,你就可以继续进行模型调试了。
建立一个基线
当你设置一个基线并将你的模型与之比较时,你就可以快速测试模型的质量。建立一个基线意味着你用一个简单的启发式方法来预测标签。如果你训练的模型的表现比它的基线差,你就需要改进你的模型。例如,如果你的模型解决了一个分类问题,基线就是预测最常见的标签。
一旦你验证了你的模型并更新了它,你就可以把它作为新版本模型的基线。一个更新的、更复杂的模型必须比一个不太复杂的基线表现得更好。
编写ML单元测试
这种ML测试更类似于传统的测试:你编写和运行测试,检查程序的性能。应用这些测试,你可以在ML程序的不同组件中捕捉到错误。例如,你可以测试神经网络中的隐藏层是否配置正确。如果你有兴趣深入了解不同模型的单元测试,请在Datacamp上学习如何。
调整超参数
调整不当的超参数可能是导致模型性能不佳的原因。以下是你通常应该检查的指标:
-
学习率:通常,ML库预设了一个学习率,例如,在TensorFlow中,它是0.05。然而,这可能不是你的模型的最佳学习率。因此,最好的选择是在0.0001和1.0之间手动设置,然后玩一玩,看看什么能给你带来最好的损失,而不需要花几个小时来训练。
-
正则化:只有在确定模型在没有正则化的情况下也能对训练数据进行预测之后,你才应该进行正则化。如果你需要减少你的模型的大小,L1正则化是有用的。如果你喜欢增加模型的稳定性,就应用L2正则化。而且,在神经网络的情况下,可以使用dropout正则化工作。
-
批量大小:在较小的批次上训练的模型通常具有更好的概括性。一个批次通常应该包含10-1000个样本,最小的规模取决于你的模型。
-
层的深度:深度描述了神经网络中的层数:层数越多,深度越深。从1层开始,如果你觉得模型应该更深入地解决你的问题,就逐渐增加层数。这种方法有助于从一开始就不使模型过度复杂化。
如何编写模型测试?
所以,要写模型测试,我们需要涵盖几个问题:
- 检查模型的一般逻辑(在深层神经网络的情况下不可能,所以如果使用DL模型,请进入下一个步骤)。
- 通过对随机的几个数据点进行手动测试来控制模型的性能。
- 评估ML模型的准确性。
- 确保达到的损失对你的任务来说是可以接受的。
- 如果你得到了合理的结果,跳到单元测试,检查模型在真实数据上的性能。
请阅读Medium上关于如何进行单元测试的详细解释。
有两种常见的测试。
预培训测试
这种类型的测试是在早期进行的,允许你在运行模型之前捕捉错误。它们不需要训练参数就可以运行。预训练测试的一个例子是检查训练和验证数据集中是否有任何标签丢失的程序。
训练后测试
这些测试是在训练好的模型上进行的,检查它的表现是否正确。它们允许我们调查算法背后的逻辑,看看那里是否有任何错误。有三种类型的测试可以报告程序的行为:
- 不变性测试。使用不变性测试,我们可以检查我们能在多大程度上改变输入而不影响模型的性能。我们可以把输入的例子配对起来,检查预测的一致性。例如,如果我们在两张不同的红苹果照片上运行一个模式识别模型,我们期望结果不会有太大变化。
- 方向性期望测试。与不变性测试不同,方向性期望测试需要检查输入的扰动将如何改变模型的行为。例如,当建立一个估计房屋价格的回归模型,并将平方米作为参数之一时,我们希望看到增加额外的空间使价格上升。
- 最小功能测试。这些测试使我们能够像传统的单元测试一样,分别测试程序的各个组成部分。例如,你可以在你的数据中发现的特定案例上评估该模型。
模型开发流水线
你的模型开发的 "议程 "应该包括评估、训练前测试和训练后测试。这些阶段应该被组织在一个流水线上,看起来像这样。
.jpg)
结论
如果你关心模型的质量,进行ML测试是必要的。ML测试有几个特点:它要求你测试数据的质量,而不仅仅是模型,并通过几次迭代调整超参数来获得最佳结果。然而,如果你执行了所有必要的程序,你可以确保它的性能。