测试是任何软件系统开发的重要方面,包括机器学习 (ML) 系统。ML 模型旨在从数据中学习并随着时间的推移提高其性能,这使它们成为解决各种应用程序中复杂问题的强大工具。然而,ML 系统需要专门的算法和技术来处理数据和执行学习过程,这使得确保其可靠性和有效性具有挑战性。以下是测试在 ML 系统中很重要的原因:
- 质量保证:测试有助于确保 ML 模型按预期运行并能够做出准确的预测。
- 模型验证:测试有助于验证模型,确保它们能够处理不同类型的数据并在看不见的数据上表现良好。
- 改进的性能:测试有助于确定可以改进模型的区域,从而实现更好的性能和更准确的预测。
- 降低风险:测试有助于在部署模型之前识别和解决潜在问题,从而降低实际应用程序中失败或错误预测的风险。
- 更好地理解系统:测试提供了有关 ML 模型行为的宝贵信息,有助于加深对系统的理解。
- 增强用户信任:通过测试 ML 系统,利益相关者可以对模型充满信心,从而提高系统的信任度和采用率。
传统软件与机器学习
软件和机器学习之间的区别
普通软件和 ML 系统之间的主要区别在于它们处理数据和做出预测或决策的方法。
普通软件遵循一组预定义的规则和逻辑来执行特定的任务或操作。例如,计算器应用程序根据一组固定的规则和算法执行算术运算。
另一方面,ML 系统旨在从数据中学习并随着时间的推移提高其性能。ML 模型不是遵循一组固定的规则,而是使用算法来分析数据并找到模式,它们可以用来做出预测或决策。ML 系统在大型数据集上进行训练,这使它们能够识别人类可能难以检测的复杂模式和趋势。
机器学习系统需要专门的算法和技术来处理数据和执行学习过程。他们还需要大量的计算资源来处理数据并实时做出预测。另一个重要区别是普通软件通常设计用于执行特定任务,而 ML 系统可用于广泛的应用,从图像和语音识别到欺诈检测和推荐系统。总的来说,虽然普通软件遵循一套固定的规则,但机器学习系统从数据中学习并随着时间的推移提高性能,使其成为解决广泛应用中复杂问题的强大工具。
Jupyter 笔记本
数据科学家在开发过程中在 Jupyter notebooks(基本上是包含文本、源代码和元数据的 JSON 文件)中编写代码,但它们有一些用户应该注意的潜在问题:
- 可重现性:Jupyter notebooks 可能很难重现,尤其是当它们依赖于特定版本的库或包时。这会使其他人难以重现相同的结果或理解结果是如何获得的。
- 版本控制:Jupyter notebook 对版本控制具有挑战性,尤其是在协作使用时。这可能会导致版本控制问题,不同版本的笔记本保存在不同的地方,从而难以跟踪更改和有效协作。
- 代码组织:Jupyter notebook 会使组织代码变得具有挑战性,尤其是对于大型项目或工作流程。这会使维护和修改代码变得困难,从而导致技术债务和生产力下降。
- 安全性:如果 Jupyter notebook 包含敏感数据或在不安全的服务器上执行,则它们可能存在安全风险。应仔细考虑数据安全、服务器配置和访问控制。
- 缺乏可扩展性:Jupyter notebooks 可能是资源密集型的,并且可能无法很好地扩展以应对大型数据集或计算量大的任务。这可能会导致执行时间变慢以及管理内存和计算资源方面的挑战。
在我看来,最佳实践是在 Python 模块中实现模型功能。尽管 Jupyter 笔记本在开发阶段很有用,但在出于生产和测试目的维护它们时,它们可能会带来困难。因此,我不建议使用 Jupyter notebook 进行自动化测试,因为按单元执行它们会使将来几乎不可能有效地管理更改。
机器学习系统的测试自动化框架 (TAF) 看起来如何?
部署测试
一旦您开发了模型的新版本,您需要确保所做的更改不会破坏任何内容。为此,您需要在每个拉取请求 (PR) 上理想地触发测试。测试应包括涵盖模型功能和实用程序的单元和集成测试,以及不变性、方向期望和最小功能等模型测试,这些测试可以在预先准备好的测试数据上执行。这种方法有助于在将代码部署到生产管道之前识别任何问题。
CI / CD 流程
单元测试
单元测试是一种软件工程实践,涉及隔离测试软件应用程序的各个单元或组件,以确保它们按预期运行。在 ML 中,单元测试用于验证 ML 模型的各个组件,例如数据预处理、模型架构和训练算法。
ML 中的单元测试对于确保管道的每个组件按预期工作至关重要。例如,数据预处理单元测试可以检查丢失的数据是否得到正确处理,或者数据是否被适当地规范化。模型架构单元测试可以验证模型是否正确构建以及输入和输出形状是否符合预期。
单元测试有助于在开发过程的早期检测错误并降低部署错误模型的风险。它们还可以通过确保对模型一部分的更改不会影响其他组件来帮助防止回归。总体而言,单元测试是 ML 开发中确保高质量和可靠模型的基本实践。
集成测试
集成测试是一种软件测试技术,用于测试软件应用程序的不同模块或组件之间的集成。在 ML 中,集成测试涉及测试 ML 管道的不同组件之间的交互,例如数据预处理、模型训练和模型评估。
ML 中的集成测试有助于验证 ML 管道的不同组件是否可以正确协同工作。例如,集成测试可以检查数据在输入模型之前是否已正确预处理,或者在模型训练后是否正确计算了评估指标。
集成测试在 ML 中很重要,因为它有助于确保整个 ML 管道按预期工作。它还有助于识别管道中的潜在问题或瓶颈,这些问题或瓶颈在单独测试单个组件时可能并不明显。
集成测试通常比单元测试更复杂,因为它们涉及测试不同组件之间的交互。他们可能需要使用模拟或真实世界的数据在现实条件下测试管道。总的来说,集成测试是 ML 开发的重要组成部分,以确保最终模型可靠并在生产中按预期执行。
不变性测试
不变性测试是 ML 中的一种测试,用于检查模型是否对某些转换或输入数据的变化具有不变性。换句话说,不变模型将为相似但经历了一些变化或转换的输入产生相同的输出。此属性在 ML 中很重要,因为它确保模型的预测对输入数据的变化具有鲁棒性。
例如,图像分类模型应该对光照条件、图像中对象的位置或对象的方向的变化保持不变。不变性测试将涉及评估模型在将这些转换应用于输入图像的数据集上的性能。如果模型对于这些变换是不变的,那么它在变换后的图像上的表现应该与在原始图像上的表现一样好。
不变性测试很重要,因为它确保模型的性能不受输入数据中某些变化的影响。它可以帮助识别模型中的潜在弱点,并为有关数据增强或其他可以提高模型稳健性的技术的决策提供信息。
总体而言,不变性测试是 ML 测试和评估的一个重要方面,可确保模型的预测在一系列条件下稳健可靠。
定向期望测试
定向期望检验是 ML 中使用的一种统计检验方法,用于确定模型的预测是否与先前的期望或假设一致。这种类型的测试在预先知道模型的预期结果的情况下特别有用,例如在 A/B 测试或控制组实验中。
在定向期望检验中,零假设是模型的预测与预期结果没有差异,备择假设是。预期结果可以基于先验知识或控制组。例如,在 A/B 测试中,预期结果可能是两组之间的转化率没有差异。
定向期望测试涉及根据观察值和期望值之间的差异计算测试统计量,并根据预定义的显着性水平将其与临界值进行比较。如果检验统计量落在临界值之外,则拒绝原假设,并得出模型的预测与预期结果不同的结论。
假设我们有一个 ML 模型,它根据卧室数量、建筑面积和位置等几个特征来预测房价。我们可以使用定向期望测试来评估模型的预测是否符合我们的期望。
例如,我们可以断言增加浴室数量(保持所有其他特征不变)不应导致房价下降。同样,减少房屋的面积(保持所有其他特征不变)不应导致价格上涨。
通过设置这些特征对房价没有显着影响的原假设,并使用定向期望检验,我们可以确定模型的预测是否符合我们的预期。
定向期望测试是 ML 评估中的一项重要技术,因为它提供了一个统计框架来确定模型的预测是否与先验知识或期望一致。它有助于确保模型的性能与预期结果保持一致,并可以为有关模型选择或参数调整的决策提供信息。
最低功能测试
最小功能测试是 ML 中的一种测试,侧重于评估模型是否具有部署所需的基本功能。最低限度功能测试的目标是确保模型能够以最低质量水平(例如准确性或性能)执行预期任务。
最小功能测试通常涉及一组测试用例,这些用例涵盖了模型的基本特征,例如输入处理、推理和输出生成。这些测试用例可能包括典型用例、边缘用例和故障场景,以确保模型能够处理一系列输入和情况。
例如,在文本分类模型中,最低限度的功能测试可能包括:
- 输入处理:测试模型是否可以处理不同的输入格式,例如不同语言的文本或带有特殊字符的文本。
- 推理:测试模型是否能够以最低准确度将文本正确分类到预期类别中。
- 输出生成:测试模型是否可以生成预期的输出格式,例如标签或概率分数。
最小功能测试在 ML 中很重要,因为它确保模型可以在添加其他功能或复杂性之前执行其基本任务。它有助于在开发过程的早期发现问题,并可以为有关模型部署和维护的决策提供信息。
生产测试
在存储库中测试模型代码后,需要为生产使用做好准备。该模型可能会以一定的周期在生产流水线中持续运行。为确保模型按预期运行,应对其进行监控。这可以通过在与模型模块并行运行的生产管道中实施数据验证测试来完成。这些测试确保模型输入和输出正确并监控模型性能。
生产流水线 (Kubeflow)
数据验证测试
数据验证测试是 ML 中的一种测试,侧重于确保用于训练或评估模型的输入数据以及模型训练和模型推理部分产生的输出数据的质量和完整性。数据验证测试的目标是识别和解决可能影响模型预测的准确性或可靠性的数据潜在问题。
数据验证测试在 ML 中很重要,因为用于训练或评估模型的数据的质量和完整性可能对其性能和准确性产生重大影响。通过进行数据验证测试,可以在数据影响模型预测之前识别并解决数据的潜在问题,从而获得更可靠和准确的结果。
静态分析
检测安全漏洞、代码气味和错误对于确保 ML 系统的可靠性和有效性至关重要。实现这一目标的一种方法是利用 SonarQube 等静态分析工具。这些工具可以帮助在潜在问题成为问题之前识别它们,从而提高代码质量。
除了使用静态分析工具外,确保代码覆盖率对于 ML 系统至关重要。代码覆盖率让您可以确定是否所有模型功能都经过彻底测试,确保全面的测试覆盖率并将错误风险降至最低。
结论
与任何其他软件一样,测试是 ML 系统开发的基本要素。正确的测试实践有助于确保这些系统的可靠性和有效性,并在开发过程中发挥关键作用。测试 ML 系统的最佳实践包括:
- 为每个拉取请求运行测试;
- 通过进行数据验证测试来监控生产中的模型性能;
- 使用不同类型的测试;
- 使用静态分析工具来提高代码质量。
- 确保全面的代码覆盖率。
通过遵循这些实践,开发团队可以提高机器学习系统的整体性能和可靠性。