漂移:在生产环境中测试ML模型

2021年5月27日上午11:35(太平洋时间)

下载幻灯片

部署机器学习模型已经成为一个相对无摩擦的过程。然而,正确部署具有健壮测试和监视框架的模型是一项复杂得多的任务。在生产ML模型时,没有一种万能的解决方案,通常需要使用多个库和工具进行自定义实现。然而,有一组核心的统计测试和指标应该在适当的地方来检测数据和概念漂移等现象,以防止模型在不知不觉中变得陈旧并对业务有害。

结合我们与Databricks客户合作的经验,我们深入探讨了如何使用MLflow、SciPy和statmodels等开源工具在生产环境中测试您的ML模型。bob下载地址通过这次演讲,您将掌握在生产环境中测试模型和数据有效性的关键原则,以及一个使用MLflow来辅助该过程重现性的可推广演示。

在本节中请注意:
Eng Chengyin, Databricks数据科学顾问
Niall Turbitt, Databricks的高级数据科学家

成绩单

英格:大家好。欢迎来到我们的演讲,在生产中测试机器学习模型。在本次演讲结束时,您将获得一套测试和开源包选项,以在生产中测试您的模型和数据的有效性。bob下载地址让我先自我介绍一下。我的名字是Eng Chengyin。我是Databricks的数据科学家。我为客户实施数据科学解决方案,也教授机器学习。我的背景是计算机科学、统计学和环境研究。在加入数据库之前,我在人寿保险行业工作。

尼尔·特比特:大家好。我叫尼尔·特比特。我也是Databricks的高级数据科学家。与Chengyin类似,我在欧洲的EMEA ML实践团队工作。因此,我把时间花在与客户合作,构建和部署可扩展的机器学习解决方案,以及交付课程,重点是使用Spark进行数据科学和机器学习。在加入Databricks之前,我的背景是在多个领域构建可扩展的数据驱动和机器学习解决方案,如供应链预测、物流优化和推荐系统。

engchengyin Eng:酷。在这次演讲中,我们将讨论机器学习的生命周期,为什么我们应该关心漂移和测试,以及我们不仅应该监控什么,而且应该如何监控。最后,我们还将向您展示我们已经实现的工作流的演示。目前,我们看到许多公司在该业务中采用了机器学习,但根据gardener分析,令人惊讶的是,85%的数据科学项目实际上失败了。另一项技术研究分析显示,只有4%的公司成功部署了他们的机器学习模型。这里的失败比例相当惊人。让我们来探究一下原因。机器学习项目失败的原因有很多,这里我们只关注生产阶段。机器学习模型在长期生产环境中无法发挥作用的主要原因是,大多数数据科学家忽视了在部署后维护机器学习模型的重要性。
我们中的许多人认为,在将模型交付到生产环境之后,我们的工作就完成了。因此,我们忽略了在生产中重新训练和测试我们的模型和数据以确保模型质量随时间一致的重要性。也许这并不令人惊讶,考虑到ML运维是机器学习的一组最佳实践,操作化是一个相对新兴的观点。关于在哪里应用统计测试有很多困惑。特别是,要用什么测试。这就是我们最希望揭示的区域。我们希望在这里回答你的第一个问题。我们应该使用哪些统计测试来监视生产中的模型?有一些专有软件可以部分地解决这个问题,但是我们想要收回专有软件的层次,并从统计的角度进行检查。
我们想回答的第二个问题是,我可以使用什么工具来协调数据和模型的监控,我们想演示如何仅使用开源工具来设置这一点。bob下载地址在这次演讲中,我们将重点讨论在批处理场景中测试表格数据,但统计测试也与流媒体和实时场景相关。您还可以借用相同的总体框架来适应其他类型的数据,例如图像和文本。在这次演讲中,我们不会涉及模型部署的任何策略。我们将不涉及代码的单元测试或集成测试。因为测试和监视对于每个用例和领域都是独一无二的。这篇演讲绝不是关于何时更新模型的规定性模型。相反,我们将介绍如何检测这些特征变化和运动静止。在我们深入讨论测试之前,尼尔,你能谈谈MLS周期和为什么我们应该监测它吗?

尼尔·特比特:当然。因此,在我们解决如何实现监控的主题之前,我认为我们需要首先确定监控在机器学习系统的整个生命周期中发挥作用的位置。如果我们从我们第一次遇到业务问题的基础开始,我们可能会有业务利益相关者带着他们认为可以用机器学习解决的问题来找我们。我们将与团队一起确定这个项目的成功是什么样子的。特别是,建立一个可测量的业务度量来评估我们模型的成功。确定范围后,我们希望开始与数据团队合作,确定我们是否有必要的数据来解决这样的问题。在一些工作之后,我们有必要的数据管道来开始进行一些探索性的数据分析,或者我们将开始创建一些特征,然后考虑,我们是否有一些预测特征,使我们能够预测目标?
然后,我们将进入对数据建模的有趣部分,并进入将模型拟合到数据的迭代反馈循环,评估我们的模型性能。当我们开始查看结果时,我们想要迭代地调整我们的数据收集过程,我们可能想要更新我们的特征生成过程并调整模型超参数,以达到我们最终满意的最终模型。在这个阶段,我们可能会觉得我们已经接近成功了。我们有一个表现良好的模型,它与我们持有的眼睛测试数据集相比表现良好。这只是一个按下部署按钮的问题。然而,在某些方面,这实际上只是模型生命周期的开始。以下模型部署和模型监控的组件通常是人们所说的MLS,正如Chengyin提到的那样。但事实上,这是在问,你如何操作一个ML模型?我们如何决定何时以及如何部署一个模型将高度依赖于许多因素。
从新数据到达的速度到我们的模型需要多长时间来训练?对于所有的机器学习部署来说,真的没有什么灵丹妙药。它最终将是非常贬低和具体的问题。在开发模型来解决给定的业务问题时,一旦模型投入生产,如何维护模型通常会被严重忽视。如果有一件事我希望你们能从这次演讲中得到特别的收获,那就是在开发MLS解决方案时,要花相当多的时间来考虑该解决方案的更高的生产版本,该解决方案将被测量和监控。为什么显示器?模型部署并不是真正的结束。如果我们认为预测模型的结果是模型识别预测目标上某些输入特征集之间模式的能力的结果,那么我们的模型只有在新数据与它最初训练的数据足够相似的情况下才会表现良好。
即使我们经常在合适的数据集上训练模型,传入数据的分布也会随着时间的推移而改变。这些变化可以从无数的来源中产生。举几个例子,如果我们考虑误差,上游误差是不可避免的。数据中的很大一部分更改将是来自上游数据生成过程的错误更改的结果。外部因素也是如此,我们可以考虑市场变化、人类行为变化,或者任何外部因素,这些因素可能会影响收集到的潜在数据。随着时间的推移,用户偏好的改变会对我们的模型产生巨大的影响。这些过多的更改来源会真正影响我们的模型的表现,最终导致模型性能下降。模型会随着时间的推移而退化,而不是模型是否退化的问题。这更多的是一个模型何时会退化的问题,以及我们是否能够在它发生之前或发生时识别它,这是在将模型部署到生产环境后持续监控模型的主要动机。
我开始提到它,但是模型退化的一个核心原因是一种叫做漂移的现象。为了让我们理解我们应该对生产模型进行哪些统计测试,我们首先必须了解可能发生的各种类型的漂移。最普遍的漂移形式如下,特征漂移你可能经常听到它被称为数据漂移或协变量漂移,这通常发生在潜在的输入数据以某种方式改变的时候。我们训练模型的特征分布发生了显著变化。标签漂移是指我们的标签分布因为外界的影响而发生了显著的变化。这通常是由实际底层特性本身的变化引起的。预测漂移,与标签漂移高度相关。但这与外界的影响无关,它实际上直接与模型的一个特征相关,而这个特征是我们模型预测的一个变化。
概念漂移的产生是由于一些外部影响的结果改变了我们模型学到的基本模式它不再有效。所以我们的特征和我们试图预测的标签之间的潜在本质是随着时间而进化的。然后双击其中一些。看看功能标签和产品漂移,这些都可以在非常相似的情况下出现,并且通常以一种受限的方式出现。所以一个可以导致另一个。一些文献经常将这些不同形式的漂移归入数据漂移的范畴。Chengyin将介绍我们如何使用相同的测试集来识别这些不同形式的漂移,但只是为了说明像特征漂移这样的东西是什么样的让我们先看看下面两个特征分布。在分类特征的上下文中,特征漂移可能是观察到的每个类的实例分布与我们预期的不同。
如果我们看一下数字特征的上下文,如果我们有一个特征,比如年龄,我们发现这个输入特征的均值和方差随着时间的推移而变化,特征漂移就会变得明显。另一方面,概念漂移可以以许多不同的方式表现出来,最终每一种不同的形式都需要不同的方法来检测它,这使得它有点棘手。如果我们仔细研究一下这些,突然的概念漂移就是数据漂移,抱歉,是由于一些不可预见的情况而突然发生的漂移。像去年新冠肺炎大流行这样的黑天鹅事件就是最好的例子。逐渐或增量的概念漂移是指我们的数据随着时间的推移逐渐演变。最后,周期性的概念漂移会周期性地发生,可能在一年中的某个时间发生,就像黑色星期五和零售是周期性概念漂移的典型例子。
现在我们已经掌握了漂移的各种形式,也许我们想要问自己的最重要的问题是,作为识别漂移的结果,我们想采取什么行动?特征漂移,其中底层输入数据已经改变,可能需要对实际的特征生成过程进行调查。我们可能想要重新训练我们的模型来捕捉底层数据中的这种变化,自由漂移,在这里我们看到标签的真实性不断增长的显著变化,可能是一个调查标签生成过程的标志,然后再调查输入特征中是否有潜在的变化。预测漂移,即我们的模型预测的分布随着时间的推移发生了显著的变化,然后对模型训练和数据生成过程进行一些调查,然后评估如果预测的变化对业务本身会产生什么影响。
最后,概念漂移,有一些外部因素影响了我们输入特征之间的关系。我们可能想看看我们如何以新的形式加入一些额外的信息并通过一些额外的特征工程来做到这一点,或者我们可能不得不考虑一个完全替代的方法来解决极端情况下的问题,或者另外,我们可以做一些重新训练或关闭她的模型。一旦我们知道了我们想要识别的不同类型的漂移以及我们想要采取的行动,如果我们发现了它们,Chengyin现在要做的是告诉我们,我们可以利用哪些统计测试来识别它们。

Eng Chengyin Eng:现在让我们看看实际测试和我们应该采取的统计检查。对于模型特征和目标,我们应该监控它们的基本摘要统计信息和分布。我们还应该监视业务度量,以防业务度量的更改会影响模型的相关性和影响。最后但并非最不重要的是,我们还应该监控模型的性能,只在生产中替换现有的模型。如果新的候选模型至少表现得同样好或更好。现在让我们转向数据上的特定监视测试。我们应该首先确定哪些特征是数值的或分类的。对于数字特征,我们可以计算中值或平均值,最小值,最大值,缺失值的百分比。我们可以用来检验均值的统计检验是两个样本Kolmogorov-Smirnov,也称为带Bonferroni校正的KS检验。曼-惠特尼检验。 And the test for variance here is Levene test. Before we cover any of those tests for the category of features, we’ll go through the basic concepts of this test that we’ll be incorporating in our demo.
首先,让我们用Bonferroni校正检查KS检验。当我们想要比较两个连续分布时,KS检验是有用的。零假设是X和Y分布来自同一总体。如果X和Y分布在某一alpha显著性水平的P值(通常为0.05)上有足够的差异,则我们拒绝原假设,并得出X和Y分布不是来自同一总体的结论。有时我们可能会遇到第一类错误,即当零假设为真时我们会拒绝它。我们重复这个KS多次,进行N次特征比较。那么假阳性的比率实际上增加了。这就是为什么我们需要Bonferroni校正来通过特征比较的总数来调整alpha值,以降低家族错误率。请注意,您将看到这种假设检验框架也会重复用于其他统计检验。
Levene检验专门比较两个连续分布之间的方差。它有一个零假设,即两个分布都来自方差相等的总体。如果Levene统计量的P值低于预设的alpha水平(例如0.05),则我们拒绝原假设,并得出两个总体或两个分布都具有不同的方差的结论。现在让我们转向分类特征的测试。与数值特征类似,我们还可以计算缺失值的百分比和其他汇总统计信息,包括我们的模式,这是最常出现的值和唯一级别的数量。在统计检验方面,我们可以利用单向卡方检验。
单向卡方检验比较类别变量的期望列分布和观察列分布。零假设是观察到的分布,也就是输入数据等于预期分布,也就是生产数据。与前面类似,如果卡方统计量的P值在α 0.05处降低,那么我们可以拒绝原假设。到目前为止,我们已经讨论了很多关于我们应该用来监控数据的测试。下一张幻灯片中,我们将讨论对模型有用的监测测试。关于模型,人们可能会关心许多不同的方面。首先是目标和特征之间的关系。我们可能想要调查输入和目标之间的相关性变化。
对于一个数值目标,我们可以用皮尔逊系数来计算系数,来计算相关性。对于分类目标,我们可以使用频率表,也称为列联表。第二部分是模型性能,这对你们很多人来说可能是最明显的。对于回归模型,我们可以检查均方误差,误差分布图,r平方等等。对于分类模型,我们可以查看ROC、混淆矩阵、F1-score等。如果我们想要更细粒度地评估一个模型,我们还可以在特定的数据片上调查模型的性能,可能是按月、按产品类型等等。最后,我们还应该认识到训练一个模型所花费的时间。即使是新模特也要花三倍的时间来训练,这可能是一个可疑的迹象。
让我们来看看我们可以用来测量和想要生产的工具。测量和监控生产中的模型。目前还没有一个单一的开源解决方案为我们提供了一个健壮的方法bob下载地址来做到这一点。我们决定从几个开源库中提取一些测试,并将这些测试合并到我们的演示工作流程中。bob下载地址特别地,我们使用MLflow进行模型跟踪,使用Delta进行数据跟踪。对于统计检验,我们分别使用SciPy和statmodel中的两个样本KS检验、Levene检验和卡方检验。对于可视化,我们使用海运库。对于初次接触MLflow的读者,我们将简要介绍MLflow是什么。它是一个开源工具,bob下载地址可以帮助mlop。
它共有四个组件:跟踪、项目、模型和现代注册表。所有这些组件都可以帮助我们的ML项目的可重复性。在演示中,我们将使用跟踪模型和模型注册表组件。它们帮助我们跟踪我们的模型参数、度量性能和工件。它们可以帮助我们保存模型以及依赖关系需求,并帮助我们管理模型生命周期。您将在我们的演示中看到所有这些功能,这些功能允许我们重现结果并检索历史汇率。

尼尔·特比特:太好了。谢谢Chengyin。我们这里有一系列笔记本电脑,我们将在其中模拟一个场景,我们想在生产中部署和维护一个模型。这将被要求每月进行预测。因为我们被封锁了一段时间,我们想看看我们下次可以去哪里度假。我们选择使用包含夏威夷Airbnb房源的数据集,我们的目标是预测新房源的价格,给定的属性包括卧室数量和房产,以及房产所在的社区。这里需要设置一些东西。我们已经包括了很多笔记本,包括我们将在下面这个位链接下浏览的这本。因此,如果您确实想自己运行它,并进一步详细地查看代码,请访问bit.ly/dais_2021_drifting_Hawaii。
你会发现这个笔记本和两个相关的设置笔记本一起,它将包括进行监控的实用函数,然后是实际的训练设置本身。训练设置将涉及一些训练函数,我们使用这些函数来实际训练模型本身。除了实际创建不同的数据集,我们用来复制不同月份的数据。我们在这里还概述了一些需求。特别是,我们正在Databricks上测试它,并将其运行到ML。你在这里看到的所有东西,我们都将使用开源库和包。bob下载地址我们使用MLflow来跟踪各种参数,delta来实际版本我们的数据本身。然后我们要做的实际基础统计测试,我们会特别使用SciPy。我们在这里要做的是模拟一个批量推理场景,我们要训练,我们要部署,然后在生产中维护一个实际的模型,以预测夏威夷每月最高的挂牌价格。
这些数据每月都会到达,一旦我们部署了初始模型,我们的工作流程将是加载新一个月的传入数据,应用任何传入数据检查,这将是做那种测试,就像Chengyin提到的做误差和漂移评估。然后,我们将识别并解决数据本身中的任何错误。然后,我们将训练一个新模型,然后在将模型转移到生产环境之前应用我们必须应用的任何模型验证检查。如果这些检查通过了,那么我们将把新的候选模型部署到生产环境中。如果这些检查失败,那么我们就不会部署候选模型。正如我们所说的,除了SciPy之外,我们还将使用MLflow Delta来进行实际测试,并对数据和模型本身进行版本控制。虽然我们专门在有监督ML问题本身的批处理设置中这样做,但就统计测试而言,我们使用的这些相同的测试也适用于流和实时设置。
其他几本笔记本包含,我说过,调整设置和实际实例化各种方法,我们将一直使用。我也会在一个新标签中打开这些,这样我们就可以在使用过程中看到它们。我要创建一些小部件。这些是Databricks实用程序,我们可以使用它们对笔记本进行参数化。我们会进一步使用这些变量,我会更详细地解释。让我们模拟第一个月的训练。接下来要发生的是,我们有一个月的数据,我们想要训练一个模型,然后将该模型部署到生产中。因为我们没有历史数据来与生产中的现有模型进行比较,也没有历史数据来与新的候选模型进行比较。在将该模型投入生产之前,我们不会通过您那种强大的检查和平衡。但是在现实环境中,您显然希望在将模型转移到生产环境之前确保它经过了可靠的测试。
让我们创建这个即将到来的月数据并开始模型训练。特别是在整个过程中,我们要做的是向这个金表追加数据。这就是我们要用来训练的Delta表,我们很高兴它自己已经清理了处理过的数据。特别是我们有这个金色的路径,我们在移动,而不仅仅是为了在那里创建一个干净的新版本的表。然后我们将加载这个月的0路径。在整个过程中,我们将使用这些变量中的一些,这些变量是在训练设置中创建的。让你们看看它是什么样的。您将看到不同数量的导入,一些笔记本冲突。这里执行的所有东西,也就是通过前两个命令完成的基本上都是在这个笔记本设置中实例化那些变量。
我们已经加载了那个月的数据,我们把它保存到这个黄金路径。我们要做的实际上是触发我们第一个月的数据我会详细分析这里到底发生了什么。而我们模型本身的实际跟踪通道流量和训练的房间满足,都来自于这种训练sklearn RF模型的方法。特别地,这将需要一个运行名,它将是MLflow运行。它会选择一条黄金路径,也就是到这个表的路径。它会取模型参数,这是一个参数字典我们想要把它放进我们将要使用的随机森林sklearn回归模型中。这个misc参数是我们最终想要追踪的任意参数当我们使用这个训练sklearn方法时,它会被用于预处理。
让我们看看这个方法中包含了什么来发现它,特别是,它会调用这个create sklearn RF pipeline,它会构建那个sklearn pipeline,它包含数值阶段,分类阶段,把它们组合在一起,加上一个随机森林渐进阶段加上我们的模型参数,我们要把它放进我们的函数中。特别地,这将在我们的sklearn RF模型中被调用。就像我说的,MLflow运行的runum,我们将使用的gold delta表的delta路径,模型参数和任何我们最终想要用来跟踪的任意参数,然后再输入到我们的预处理阶段。我不打算一行一行地讲,但我应该大致了解一下我们在做什么?
特别是在整个监控笔记本中,我要指导的不是一行一行的代码在做什么,而是从概念上讲,在哪里进行测试,在哪里进行训练,以及在每个阶段要做什么测试。特别地,我们将使用MLflow来跟踪和监视。跟踪并记录我们的模型参数。在我们最初训练模型本身之后,我们可能需要使用的任何工件。我们还将启用MLflow自动日志记录,这基本上将去掉我们需要跟踪MLflow的任何参数。此外,它将跟踪出实际的模型工件本身,然后我们将基本上跟踪出一些我们想要使用的附加参数。
首先,我们要做的是载入实际的Delta表本身,重要的是这里我们要记录为路径。我们用的那个金表的路径是什么?我们使用的表的版本是什么?这在我们研究接下来几个月的数据时很重要,因为最终我们想说的是给定这个版本的数据,数据是什么样子的?在接下来的几个月里,我们在这里看到的分布是什么,我们可以比较一下这两个东西吗?此外,这是什么,然后做的是注销各种参数,我们可能需要在网上看到,并有一个记录。实例数,月份是多少?使用的训练实例的数量是多少?使用的测试实例的数量是多少?
但重要的是,我们要追踪所有额外的信息。我们正在创建随机森林管道。我们正在将模型本身与我们的训练数据相匹配。这里我们也做了一个记录用来符合这个模型的实际模式是什么?该模型在预测时期望什么?另外,评估模型本身。我们可以记录指标吗,这也是很重要的,我们可以这样说,好吧,这个模型在这个特定的月份是这样表现的。当我们经历了这几个月,能够看到,好吧,随着时间的推移表现如何?
让我们执行这个单元格,如果我首先设置这个训练。让我们触发实际运行本身。就像我说的,我们将开始创建MLflow运行并触发实际的模型训练本身。一旦该模型被执行,我们要做的就是利用MLflow模型注册表。特别地,这将使我们能够跟踪我们模型的谱系。您将看到,当这个模型在训练时,它将以MLflow本身的运行形式出现。我们在这里所做的一切都是使用开源工具。bob下载地址尽管MLflow被很好地缝合到Databricks工作空间,这样每当我们执行MLflow运行时,我们都会在侧栏中看到它显示为run。如果我点击这个,我可以进行实际的MLflow实验。
特别地,我们看到我们现在运行了第一个MLflow。点击进入这个运行,我们可以看到运行名称是第0个月,我们可以看到我的各种参数都已经注销了。当我们说mlflow。autolog时很多都被自动去掉了。特别地,我们注销的一些自定义参数是路径和版本。随着时间的推移,这一点会变得很重要,这是在这个月的数据上创建的。在这个特定的月份,它使用的是什么版本的数据?此外,我们还为我们的培训测试提供了各种指标。重要的是,我们还有实际的模型工件本身。特别是,这将是我们用拟合的随机森林模型创建的管道。
我们可以在后面加载这个来看看,这些历史预测和这个模型的未来版本会有什么不同?我们还注销的其他东西是这个CSV,它捕获关于传入数据的一些汇总统计信息。我们只是创建了一个笨重的数据帧,把它设置成CSV格式,你可以看到,我们有平均值,标记,各种汇总统计数据,我们最终可能会用到这些数据。处理参数,Jason只是我们创建的一个以Jason为日志的字典,但只包含一些我们可能希望在一行中使用的任意杂项参数,例如月份是多少、在那个时间点上使用的各种分类列的目标列和数值列。
回到我们实际的笔记本上,我们有一个经过训练的模型,我们要使用的是这个模型注册表。就像我说的,这追踪了我们模型的谱系。我们可以说这个模型处于分期阶段。这是在生产中。并且能够看到,嗯,一个模型实际上在哪里,并帮助管理模型的整个生命周期的工作流程。特别地,我们要做的是在模型注册表中创建版本1。如果我实际导航到模型注册表本身,我将看到的是我有一个最近刚刚创建的版本,我们可以做的是将其迁移到登台或生产,然后在模型处于这些不同的阶段时开始使用我们的模型。特别是在第一个月,我们要做的只是直接过渡到生产阶段。
同样,您想要做的是严格检查这个模型是否按预期执行,对Chengyin提到的一些数据切片执行,但为了演示的目的,我们直接过渡到分期,以便在后面的几个月里,我们将看到我们可以与我们的生产模型进行比较。让我们复制到第一个月,当新数据到达时。特别是,我们在这里试图模拟的是一些真实世界的场景,你可能有上游数据问题,或者你实际上也可能有特征漂移。实际上我们把两件事结合起来了。值得注意的是,我们重新创建了一些上游数据清理过程更改,其中邻里清理丢失了一些条目。特别是,一些应该出现的社区现在没有出现。此外,我们正在做的是重新创建一些上游数据生成过程,这引入了我们的一个功能的缩放问题。
特别是,我们有复习分数阅读。对于一个给定的列表,评论的总体评分是多少,以前是在0到100之间。我们在笔记本设置中所做的实际上是将比例调整到0到5之间来重新创建一个新的星级评级系统我们的目标是通过一些检查比如我们之前提到的分布检查和错误检查我们能否在开始模型训练之前检测到这个问题?我们在这里要做的工作流程是,首先,摄取数据,对新进入的数据进行一些特征检查。一旦我们解决了任何问题,我们就会把它附加到我们的金表中,然后我们就会进行模型训练。一旦我们有了模型本身,我们就可以进行实际的模型检查,看看新模型与旧的历史模型相比如何?
然后,如果给定的模型通过了所有的检查和平衡,那么我们就将其移植到生产本身。在我们开始之前,我想回到我们的模型,我们有这个现有的模型。如果我刷新这个,你会看到我们有这个版本1,它不在生产中。我们在模拟什么?在这第一个月模拟特征漂移。因为我们的特征历史上是在0到100之间,现在漂移到0到5之间,然后是上游数据错误。高级社区的一些清洁问题出现了问题。至于将来我们会用到的各种检查,我们会把它分解成不同的子集,所以我们可以把检查应用到所有的特征上,比如缺少这个检查,我们会应用什么是空检查分类。对于空值,我们期望的是什么,一些数字特征检查,这将是一些简单的总结统计。这些数据与我们之前看到的数据有什么不同?
一些分布检验,回到那些Kolmogorov-Smirnov检验,即成音在街上走过的检验,还有Levene检验,我们也看到了连续变量在分类方面的检验。我们要做卡方检验看看,历史数据和新数据之间的每一层的期望是否有效?比较起来怎么样?然后还要检查历史模式是什么?现在新的电流模式是什么?我们要做的是载入本月的一个误差路径。我们实际上已经在设置中创建了这个delta表,它重新创建了一些错误。我们会把它加载进去,我们会创建一个汇总统计。这实际上很有趣,在训练函数中使用的是相同的汇总统计函数,然后我们退出。我们要做的就是从现有的生产模式中吸取经验。 What does that mean? Again, if I go back to my model registry where I see this first version, if I click into this first version, all that the MLflow registry is it’s really tracking the lineage of models.
其中,这是指向第0个月第一次记录的原始运行的指针。再一次,我们看到了版本是什么,路径是什么,第0个月。最终我们在这里能做的是,从生产模型中获得底层运行。然后我们可以说,我可以加载这个表,前提是我知道路径和版本。然后我要计算一些关于历史数据的汇总统计数据我们用这些数据来训练之前的模型。我们在这里比较的是,我有一个新的月的数据,但我想把它与我们之前训练过的历史数据进行比较。让我们开始做一些检查。这些都是非常基本的检查。看到这里,在这个新的数据中,空的比例是多少,我们已经设置了这个空的比例阈值。特别地,这种检查空比例的方法是我们在训练设置笔记本中定义的。 Again, I’m not going to go through, well, what is really going on in the underpinnings here, but we’re just going to loop through each of the different features and say, does the amount of nulls exceed a certain threshold?
这个阈值我们只是随意设置了2.5在现实环境中,你会想要做一些试验和错误来确定在一个任意的阈值中有多少null值是可以标记的。我们看到的是小区平面图显示的是空值,空值的比例超过了0.6。这就意味着我们要进一步研究什么是邻里净化?回想一下我们在这里试图复制的东西,一些上游数据问题,我们看到这个邻域被清理了,我们插入了缺失的值。我们真的能马上发现这一点。其次,我们要做的是应用一些统计检验,这将会说,我的历史数据是什么?我的新传入数据是什么?我基本上会说,对于我的数字列,根据一些统计阈值限制,也就是说,对于这个列表中的所有不同的统计数据,我想检查的是,这个新的传入数据与我们之前看到的相比,是否显著增加或减少了某个阈值限制?
为了详细分析,我们得到了这个新月份的汇总统计数据。我们有我们当前的生产模型汇总统计数据,这个模型是在这个模型上训练的。我们有一些数字列,我们必须要经历。特别地,这个目标列是我们想要在分析中包含的。我们说的是,如果任何东西超过了之前看到的50%的界限,就标记给我们。特别地,这是一种很幼稚的方法。你可以更聪明地实现这个,但这只是一个基本的检查,看看之前的汇总统计是什么?什么是新的汇总统计数据?仅仅就一个非常随意的阈值而言,是否有显著的增长?这里到底有什么? I know a couple of things standing out just terms of the median max for bedrooms has increased, the bedrooms and maximum nights already the thing that would flag an error here, or really warrant further investigation would be for review score rating and price. And basically we’re saying the price, the median, these have all for review score rating. These have all decreased substantially, from 95 to 3.48.
在价格方面也是如此。我们所看到的是一个显著的变化,所以这是全面的增长。我们想要看的是,这些特征的分布是什么它们显示了这些显著的变化?我们将创建一些箱形图,这将创建一种非常自动的视觉检测方法。有显著差异吗?我们之前看到的是回顾评分,这是针对我们当前的生产数据,我们使用的是0到100之间的数据。现在对于这个新的输入数据,这是在0到5之间。这是一种非常快速的测试,说明这里有些地方不正确。我们可以通过在KS测试上运行Levene测试来进一步验证这一点。这些是成荫带我们做的测试。 In particular Levene test to say, is there a significant difference in our variances and the KS test with the Bonferroni correction to say, does the Kolmogorov–Smirnov tests detect a significant change in those two distributions? Just to run through this, what we’re going to do is use the current production model, what is the data frame that it used versus the current incoming month of data? What are the numeric columns to basically look through and say, do you detect any difference?
P阈值设置在顶部。这句话的意思是我想把它设为什么显著性水平。类似于Kolmogorov-Smirnov检验,我们说的是将这些与历史数据和新传入的数据进行比较,我想经历的数字列是什么?我想检查的阈值是多少?这里出现的一件事是,对于KS测试,Bonferroni校正alpha水平,我们看到复习分数评级有一个重要的价值。这就是说,新的审查评分分布与以前有了很大的变化。这就很值得我们研究新的分布是什么?这些数据是如何在上游生成的?这一阶段值得关注的是,上游数据是什么?上游数据有问题吗? On the categorical feature side of things, we’re also going to implement a Chi-square test to see, well, do the levels of our categorical columns statistically, are they statistically different? In terms of expected count, we see that host is super host is significant, but only just significance.
同样,这也需要一些研究,但这并不是我们所做的任何事情或我们实际合成的结果。这里的选择是我们一开始就发现了这些问题。我们必须和我们的数据团队一起工作,好吧,有任何上游数据处理显著变化吗?在这种情况下,我们要重复的是,好吧,我们已经解决了这些问题,为复习评分评分在社区中清理干净。我们对所做的更改很满意,这个月我们有一个固定的delta路径,它将载入。然后我们要把它附加到我们的黄金路径上。我们现在有了这个带有新数据量的黄金delta表,现在我们可以进行第二个月的训练。在第一个月,我们将再次使用完全相同的模型参数,相同的杂参数。
你会注意到我们的实验中加入了第二次实验。然而,我首先要做的是注册这个模型,然后将其转换为登台。然后我可以展示给你们看。如果我们再次进行实验,这只是将我带到MLflow UI中的一个单独选项卡。特别地,我们看到的是我们有第二个月,如果我导航到那里,我们有路径,版本,以前的0现在是1,因为我们在第一个月使用了一个新版本的表,所有的参数都是我们之前见过的。度量标准,我们将看到的是测试,测试r平方实际上略有不同,我们仍然有那些相同的工件,我们之前看到过。特别是,我们现在在实际的模型注册表中看到的,如果我们导航到那里,我们有这个的第二个版本,它是9阶段。
这最终就是我们要比较的东西。我有一个上个月的模型制作。我有一个新模型目前在分期。在将新的候选模型迁移到生产环境之前,我可以比较这两个模型吗?我应该通过一系列的测试来验证,预测结果是什么?它在当前生产模型中表现如何?实际上有很多方法可以做到这一点。我们将在这里应用一个非常简单的测试,说我有当前的登台运行,我可以再次获得它,因为我们可以直接跟踪沿袭到底层MLflow运行。我可以得到底层的MLflow运行实体,然后说,取在登台的模型。运行是什么,并将运行与我当前的产品进行比较。
这是两次不同的MLflow运行。它将应用最小模型r平方阈值。也就是说,根据这个指标,在这两个不同的模型之间进行比较,应用这个指标来检查这个模型是否超过了一定的阈值我们要说的是,你可以进行从阶段到生产的过渡。我们在这里必须要捕捉的是模型性能是否有显著的退化。如果有像预测漂移这样的东西,我们想要抓住这些预测与我们之前看到的相比发生了重大变化的地方。最终,我们想要捕捉的是,在我们将模型投入生产之前,我们想说,好吧,我们的实际指标随着时间的推移表现如何?你需要长期跟踪这个过程。鉴于我们看到我们的分期运行,虽然它不是很好,我们的散布分数,我们真的只是试图展示你如何编排模型本身的方法。
我们看到,根据我们的阈值,它稍微好一些,这个阈值是我们最初根据小部件设置的,我们要做的是将我们的模型转换到生产环境,因为它现在的性能更好。如果我回到注册表中的模型,我们现在将看到版本2现在将被迁移到生产环境中。以前的生产模型将被存档。如果我导航到那个,我可以回到我的版本2。再一次,令人震惊的是回到我的第一个月,最终反馈到,这个我可以加载回去的底层模型本身。让我们转到最后一个场景,在第二个月,一些新数据到达。在这种情况下,我们复制的是我们的价格发生了显著变化,但我们的特征没有变化。
我们试图在这里综合的是某种季节性。我们说的是一些新的月份数据包含了在度假旺季记录的列表条目。结果,每一个上市的价格都被任意地提高了一些。我们在这里模拟什么?我们试图模拟一些标签漂移,因为之前我们的标签有一定的分布,但现在它发生了一点变化,还有概念漂移,因为功能和标签之间的潜在关系已经改变了,由于我们试图引入的季节性。回到我们刚才讨论的不同类型的概念漂移反复出现的概念漂移可以以某种节奏发生。
我们将使用和以前一样的特性检查。这些传入的数据,在我们开始模型训练之前,我们想要在开始训练之前通过一系列的检查来尝试和捕捉。和传入的新数据有什么不同吗?我们要做的是加载第二个月的数据,我们要创建一些关于它的汇总统计。我们将从当前生产模型中运行底层MLflow。我们将载入用于训练上个月数据的delta表。从第一个月开始,然后我们将载入从前四个月开始的汇总统计数据。
特别地,我们会从缺失开始再次检查,空的比例是多少?我们看到没有什么是好的,没有什么超过零比例阈值。同样,这是你可以任意选择的数字方面的东西。我们要检查的是所有数字特征,均值,中位数和标准差,最小值和最大值是否有明显变化值得注意的是,均值和中位数价格在拟合方面都发生了显著变化。比前一个月高出50%以上。总的来说,这会给我敲响警钟,好吧,我应该研究一下这个价格因为这个分布与我之前训练的上个月模型相比确实发生了变化。
看看这个方框,很快就会发现,对于所有超过这个阈值的功能,我们看到的是,以前的价格在0到25000之间,现在从0到75之间大幅上涨。目测的分布已经发生了变化。我们可以通过方差检验来对其进行严格的统计。最终,你希望KS检验能检测到分布的变化。k检验基本上是说这两个分布,两者之间有显著的变化吗?我们说的是价格,这两种分布在统计上确实有显著差异。在这个阶段,这可能会引起人们的关注,好吧,这些数据有一些差异。最终,你可以选择做的是继续前进,说,好吧,如果我重新训练这个模型,我能把这些新的变化融入到数据中并从中学到一些东西吗?
此外,你还可以尝试着手进行一些新的特征工程,其中包括一些季节性特征,比如,这个数据是在这个月记录的,等等,以整合一些季节性信息,使其适合你的模型本身。在分类方面,我们看到有一些分类上的差异分类变量在统计上是不同的预期种类。然而,看看这个,这没什么好担心的,但它再次向你展示,有时你提出这些错误,它可能不一定是重大的改变,但再次,你应该解决这些问题,并相应地对待它们。这里要做的是我们已经观察到了标签的转移我们要做的实际上是重新训练模型看看我们的表现如何?
我们会继续说,把这个月的新数据添加到我们的金表中,然后我们会训练一个新模型,尽管是在一个月的数据上。我们有第0个月,第1个月,第2个月,现在进来了,现在我们看到我们在实验中有了一个新模型。同样,我们要做的是,首先,注册那个模型然后我们要把那个模型转换到登台再次说明,我将回到实际注册的模型本身很好,我们有一个版本的登台和应用那些我们之前看到的相同的模型检查。我们将从当前登台模型获得底层MLflow的运行。我们将再次应用相同的统计检验,好吧,新候选模型的性能如何?
这个r平方测试r平方和之前的r平方值比较如何?我们看到这里有一个显著的性能不佳,尽管我们将它们与不同的进行比较。它们被应用于不同的测试集。我们看到当时的测试在减少百分比方面有很大的不同。再一次,这将是一个很好的理由去调查,为什么一个新模型表现不佳?另外,我可以解决这个问题吗?我能否用不同的超参数重新训练模型并进行混合初级训练?或者我是否会加入一些额外的新功能来捕捉季节性?在这种情况下,我们说当前的分期模型表现不佳,因此需要进一步研究。这确实向你们展示了端到端的过程如何使用开源工具,比如MLflow和delta这是关于可重复性的,真正捕获了三次时间,能够回到过去,说,好吧,这是bob下载地址我的模型。
在这个时间点上,这是我使用的数据版本,但是在测试和监控方面,你如何使用SciPy这样的包,好吧,把这些测试应用到这些数据集上,并且能够说,好吧,这里有一些变化,我的数据有一些明显的错误。希望这能让你们简单地了解如何把这些东西结合起来我把它传给Chengyin,让他给我们一个结论。谢谢。

Eng Chengyin:感谢Niall的演示。希望通过演示,我们在这张幻灯片中涵盖的概念变得更加清晰。回顾一下,只需记住模型部署并不是结束。在生产中持续监视和测量您的模型是确保您的机器学习模型与业务相关且有价值的关键。其次,没有一个适用于所有监控和测试的解决方案。希望您能够将我们的示例框架应用到您自己的领域和用例中。您还应该添加其他相关的测试,以捕获您感兴趣的指标。
最后,不管您正在构建的用例是什么,始终要确保您能够跟踪并重现您的模型结果。保持历史性能记录作为基线是至关重要的,并且在出现新的部署失败时,您的系统应该足够健壮以支持回滚。如果您有兴趣了解更多关于这个主题的知识,我们提供了一些文献和软件包供您在演讲后参考。希望你从今天的讲座中学到了一些有用的东西。别忘了给我们反馈,告诉我们你从我们今天的演讲中最大的收获。希望能再见到你。

Chengyin英格

Eng Chengyin Eng是Databricks的数据科学顾问,在那里她实施数据科学解决方案,并为跨职能客户提供机器学习培训。她在计算机专业获得了硕士学位。
阅读更多

尼尔Turbitt

Niall Turbitt是Databricks机器学习实践团队的高级数据科学家。与Databricks客户合作,他构建和部署机器学习解决方案,以及交付…
阅读更多