佛罗伦萨ai:重塑Humana的数据科学

2021年5月26日下午04:25(太平洋时间)

下载幻灯片

Humana致力于帮助我们所服务的社区和我们的个人成员实现他们的最佳健康——在过去的一年里,这是一个不小的任务!我们有机会重新思考我们现有的运营,并重新想象数百名数据科学家的协作ML平台可能会是什么样子。bob体育客户端下载我们名为FlorenceAI的ML平台的主要目标是大规bob体育客户端下载模自动化和加速数据科学解决方案的交付生命周期。在本演示中,我们将通过一个端到端示例演示如何在FlorenceAI上构建大规模模型并将其部署到生产环境中。重点介绍的工具包括Azure Databricks、MLFlow、AppInsights和Azure Data Factory。

我们将使用幻灯片、笔记本和代码片段,涵盖问题框架和设计、初始特征选择、模型设计和实验,以及集中生产代码的框架,以简化实现。现在有数百名数据科学家使用我们的特征存储,该存储在几年的历史数据中每天和每月都会更新数万个特征。我们已经有几十个模型在生产中,每天也为我们的企业临床运营模式提供新的见解。每天,数十亿行的数据被生成,为我们提供及时的信息。

我们已经有这样的例子:团队的运行速度快了几个数量级,而且规模是使用固定的内部资源无法达到的。鉴于该平台在前5个月内从12个试点用户迅速发展到100多MAU,我们还将分享一些关于该平台早期成功的趣闻轶事。bob体育客户端下载我们希望FlorenceAI能够让Humana的数据科学家专注于他们能带来最大价值的地方,这样我们就可以继续提供高质量的解决方案,在不断变化的世界中保持新鲜、相关和公平。

在本节中请注意:
David Mack, Humana, Inc.的认知/机器学习负责人

成绩单

演讲者1:大家好,欢迎来到佛罗伦萨,人工智能重塑数据科学在Humana。我叫戴夫·麦克,是数字健康和分析组织Humana的认知和机器学习负责人。今天,我将向您介绍在我过去18个月帮助创建的平台上构建模型的一些关键方面。bob体育客户端下载我希望你能学到一些新的东西,带回你的公司。Humana的大胆目标是满足整个人的需求。这种以会员为中心的观点是我们致力于帮助数百万会员实现最佳健康的一部分。作为财富50强企业,Humana拥有广泛的可用资源,我们最近投入了大量时间和资金,以应对COVID-19大流行、粮食不安全、孤独和社会隔离以及医疗保健不平等等问题。
Humana还对数字健康和分析做出了重大承诺,于2018年成立了由希瑟·考克斯(Heather Cox)领导的顶级组织,通过先进的分析、体验式设计、数据和技术,我们正在努力满足我们的同事、成员和我们所服务的社区,随时随地,无论如何。自2015年底以来,我一直很荣幸成为Humana的一员,当时我开始从事临床数据科学,然后帮助领导Humana向云转型。我们的平bob体育客户端下载台现在支持数百个用户,充分利用了云带来的灵活性。
FlorenceAI是一个云平台,用于在Azbob体育客户端下载ure中大规模自动化和加速数据科学解决方案的交付生命周期。它的名字的灵感来自意大利历史名城佛罗伦萨,以及文艺复兴时期那里发生的所有令人惊叹的事情。虽然我们没有像佛罗伦萨大教堂的圆顶那样构建创新的装置来将砖块和石头搬到新的高度,但我们确实可以使用Databricks、High Spark、ML Flow和Azure数据工厂构建一些很酷的东西,同时支持当今许多最流行的ML库。
生态系统使数据科学家能够解决复杂的问题,促进对开源创新的访问,通过单一接口简化模型消费,同时尝试转换工作流以提高性能。bob下载地址今天,我将涉及您在这里看到的许多关键的基础支柱。
这个模型加上糟糕的成分真的一无是处。所以我们必须从好的方面开始。从那里我们有了我们的特色商店。它有成千上万的功能可供训练和评分,数百个实例横跨多年,随时可供数据科学家使用。它可以灵活地涵盖大多数用例,但也足够具体,因此可以使用相同的代码,通过自助服务操作来处理自定义情况。我们在功能设计中投入了许多领域的专业知识,这是为整个人群预先计算的,并定期以每月和每天的节奏进行更新。我们为数据科学家准备了大量的元数据,以理解和学习特性、它们是如何创建的以及它们的含义。
我们在整个生命周期中支持他们,从队列设计,到最初的特征选择,然后进入模型训练实验,在那里他们循环并找到最佳模型。一旦完成,他们就会对模型进行评分和注册,并记录所有的训练工件,以确保他们的工作是可重复的。然后,我们与他们一起开发他们的模型所需的评分代码和测试,然后我们将其推广到生产并定期自动评分。
今天我想用一个示例问题来帮助跟踪这个平台的工作流,这样您就可以看到今天是如何构建模型的。bob体育客户端下载我们将在未来六个月内预测慢性肾病最严重的阶段。这是一种重要的慢性疾病,因为随着患者病情的发展,如果他们的崩溃在后期结束,他们可以更快地进行透析,生活质量也会降低。我们希望尽可能拖延,这就是为什么这是一个需要解决的重要问题。你可以看到我用来定义队列的一些标准,并建立了一组具有不同阶段的数字。你可以看到我们这里有一个相当不平衡的阶级设置,这是当今医疗保健领域的一个普遍问题。让我们看看如何在今天的平台上构建这个模型。bob体育客户端下载
首先,我们将从最初的特征选择开始,并做一些基本的模型训练。我会给你们看一个我们有的笔记本,这是一个模板数据科学家可以从这个模板开始进行特征选择。我们的目标是将我们在功能商店中拥有的数万个功能以及他们创建的任何自定义功能减少到几百个功能。
最初的特征选择模板是Databricks笔记本。我们已经安装了一些初始的东西,并进行了导入。我们还设置了一些不同的参数。从那里,他们可以加载特性故事数据和自定义特性的组合。在那里,我们将把它分成一个序列并进行测试,然后比较这两个东西的分布,以确保它们是相似的。在那之后,我们将做一些基本的准备工作来对它们进行分类,并研究一些基本的东西来尽早消除一些特征。所以我们会看一下,看看是否有单一值或高百分比的值,并排除那些。然后在我们准备做模型的管道之前,我们会做一些最后的格式化。在Spark 3.0之前,没有一种简单的方法可以同时对所有列进行字符串索引。由于有成千上万的潜在用户,我们不得不自己动手为我们的用户实现这一目标。
在索引步骤之后,我们进入一个典型的spark管道做准备,然后我们进入特征选择。我们索引我们的目标,学习如何编码我们的变量,连同我们的数值变量的imputation,然后把它们带入一个特征。从那里,我们为数据科学家提供了使用特征选择的不同方面的选项。我在这里选择了一个随机的25棵树的森林分类器,并将该模型适合于我的索引数据。在这之后,我们有一个辅助函数来帮助他们从随机森林分类器中提取这些特征的重要性,并在[听不清]数据帧中对它们进行排序,这样它们就从最重要的到最不重要的。
然后他们可以展示出来,浏览这些特征,看看它们是否有意义。然后,我们可以使用一个相当低的截断值,为我们的第一轮建模降低到数百个特征。转换特性中的过程名称略有不同,因此我们使用这段代码回到最初的特性描述。然后我们可以保存这些数据集,并进行下一步。
从那里,我们将使用SparkML进行第一轮建模。我们有一个简单的辅助函数,使ML流实验的创建与每个用户一致。我们还为Spark训练创建了一个单独的helper函数。我们以类似于初始特征选择的准备方式进行此操作。我们在这里可以看到,我们输入了一个交叉验证的估计器和一个参数网格来进行搜索。这为我们提供了各种各样的选项,可以为任何类型的交叉验证Spark模型进行参数化。
在我们做实验之后,我们就会得到一个最佳模型。我们可以在上面看到我们有不同的参数来自于最佳模型我们有它们的估计器。在我的例子中,逻辑回归是最好的模型。然后,我们有一个不同的辅助函数,它允许我们能够对我们的模型做一些更详细的事情,它甚至生成一个热图。这很重要,因为我们可以只使用多数类分类器并且有很高的准确率,但是这张热图告诉我们,当我们使用我们的类等待时,我们沿着对角线得到了很好的预测,我们在多数类中仍然有一点预测过度,在中间的一些中间阶段有一个小问题。
让我们来看看这些Spark helper函数的细节,看看幕后发生了什么。对于这个实验实用程序,我在前面的笔记本中提到了几个辅助函数,分别是ML流、实验创建和特征重要性提取。这里是SparkML设置与我们的交叉验证参数网格搜索。我们有这个函数在这里我们开始ML流运行,获取我们的模型和测试预测。从那里,我们将记录来自测试集的指标,然后我们还将从每个交叉验证的参数轮中获取我们的训练指标。我们也将获取这些参数,这样我们就可以用条形图的形式来绘制每一轮的不同准确度。然后,我们将把计算结果保存到ML流运行中,以及模型和模型对象本身的最佳参数。我们还将把它写入ATLs进行备份。
对于最好的模型,我们在这里进行类似的操作,开始ML流运行并拟合模型。然后我们会在完整的训练集和测试集上给它打分,记录这些指标和我们模型的最佳参数。然后如果这是一个二值分类器,我们可能会创建一个岩石曲线,但在这种情况下,它是一个多类分类器,所以我们将创建你之前看到的热图。从那里,我们将注销该模型,并将其备份到ATLS。
有了这个,我们就可以用这个可重用的代码来鼓励重现性。我们在ML流运行中自动保存许多项,这是所有的工作空间范围,可以在特定用户的工作空间中看到。我们还要求他们说出一些工件,以帮助他们的模型具有可重复性,比如输入模式、训练和测试集,以及与这些相关的分数,以及他们在[听不清]准备过程之外所做的任何事情。这些可以用于以后的评分。
这还没完。我们刚刚结束了第一轮建模,现在我们想看看深度神经网络是否能帮助我们改进模型。那些可能不熟悉深度神经网络的人。它们有我们引入的相似的输入和特征,但它们有一系列的隐藏层,帮助共同解释输入和目标之间的关系。这将产生我们的预测,这是通过被称为史诗的重复传递来实现的。每次我们都在继续学习,以使模型更好。
在使用深度神经网络时,我们还需要考虑一些额外的事情。我们是否希望使用早期停止来最小化我们的训练时间,而收益递减发生在多个史诗中?我们可以在每次史诗之后使用回调来记录内容,我们也可以在较小的数据块上执行此操作,以确保它以我们想要的方式工作,并允许我们在细化参数后扩大规模。
我们可以用一个叫做Hyper app的工具来进行初始搜索。这个工具允许我们定义一个参数空间来进行搜索,我们有几种不同的方法来进行搜索。我们可以一次做一个完全的[听不清],或者完全随机或介于两者之间。在我的案例中,我们将从每一轮中学习全部的[听不清]。可以看到,我们对模型进行了20次试验,每次模型都有所改进。但是当我们使用训练数据的样本时,我们可能想看看我们是否能了解哪种模型是最好的。
值得庆幸的是,MLFlow有一个方便的平行坐标图,我们可以将每个参数与每轮的最佳验证损失进行对比。在这个例子中,我们在第一层突出显示,这里有一组复杂的节点。如果我们把这个设置好了,再看看这一层,我们会看到这里复杂的节点集合,这对我们的模型不太适用。但是如果我们有一个更简单的节点集合它在很多次运行中都能很好地工作。此外,我们还看到低学习率和高批量是重要的。
现在我们已经在驱动程序上做了一些初步的探索,我们看到我们为每个史诗运行得非常快,但我们只使用了我们数据的一小部分。如果我们使用petstorm将数据量扩大到10倍,那么我们将运行大约10倍的时间,这可能需要很长时间。那就让霍洛维德来帮忙吧。Horovod允许我们使用所有的数据,我们有16个工作人员,我们可以把它缩短到和之前每部史诗差不多的时间,帮助我们更快地在所有数据上进行训练。它比单独使用“泥煤风暴”快四倍。
让我们看看如何设置Petastorm和Horovod在模板中运行。对于这个模板,我们在这里有所有的导入,并且我们有一个类似于我们如何在SparkML训练中进行初始特征选择的设置。我们创建了一个训练和验证集,并比较这些分布,然后做了很多我们在Spark中使用的相同的特性准备。事实上,我们使用SparkML管道,并将在创建ML Flow实验后对其进行转换。从那里,我们可以更容易地单独训练模型的其余部分。我们将应用我们的类权重,并通过编码我们的目标来做更多的特征准备,以便我们有适合TensorFlow的数据格式。我们还将设置我们的Petastorm文件,然后我们将在这里创建我们实际的神经网络模型,其中包含几个隐藏层和几个其他参数。用户可以根据自己的需要进行定制。
现在,我们有了帮助函数来设置我们的多类分类,TensorFlow和Horovod。你可以看到,我从之前学过的知识中选择了参数,我们有一个复杂的第一层和一个简单的第二层。我们的学习率小,批量大。他们也可以在每次运行中很容易地操作这些。让我们看看这个helper函数在这里为我们做了什么。我要跳下来了。
这个辅助函数的设置和我们之前看到的类似。我们将启动ML Flow,并为超参数记录一些基本参数。从那里,我们将使用Horovod runner来训练我们的模型。让我们跳下来看看它是如何工作的。但在这里,由于一些序列化要求,我们必须引入一些导入。然后你可以看到我们正在将数据转换成TensorFlow工作所需的格式。然后我们也在扩展我们的特征,并在这里使用编码标签,这样我们就可以让数据运行起来。我们将添加早期停止和优化器,然后在这里我们将添加一些用于多类分类的指标,比如在我们编译它们之前的精度和召回率。
之后,我们会创建检查点,然后是回调。回调函数很重要,因为它允许我们在每一轮之后记录内容。重要的是要将此设置为只发生在这里的一个worker上,因为否则它将被记录16次,我们不希望它被重复。然后,我们将遍历并拟合我们的模型。你可以看到我们只是在中间写信息每次我们看史诗一次。然后我们也会说我们的技术点只权重一次,并将该模型复制到DBFS。
跳起来。在这里你可以看到,在我们适合我们的模型之后,我们可以查看并获取参数历史,并记录每个史诗中的所有单个参数。这让我们能够在MLFlow上很容易地生成图表,查看我们的学习曲线或其他你想从模型训练中看到的东西。然后,我们将记录一些其他内容,如模型结构和模型对象本身。
切换回这里的另一个模板,您可以看到我们将在运行完成后继续,我们将读入该模型并对其进行评分,然后我们将获得预测和我们的指标。然后我们甚至可以生成我们之前看到的热图,并在事后将其应用到我们的跑步中。这将为人们省去很多头疼的事情,让那些可能不熟悉BioSpark和深度学习的人更容易开始学习。
在我们完成这个练习之后,你可以看到我们实际上改进了我们的模型一点点。我们没有改变F1的分数,但你可以在两个突出显示的区域看到,我们并没有过度预测大多数阶级。我们在后面的一些阶段看到了更好的精度。这让我们更有信心我们得到了一个更好的模型。好了,我们做完了,对吧?数据科学家的工作已经全部完成。我们可以继续下一个项目了。好吧,等一下。也许不是。
我们必须注册、评分并保存模型以使其可重复,并帮助将其部署到生产环境中。MLFlow的优点是我们可以使用Spark UDF对它进行评分并以这种方式读取它。这样我们就可以引入PI Spark数据帧来很容易地对它进行评分,只需要几行代码就可以了。因为我们有这么多的Databricks工作空间,因为我们的团队非常庞大,我们需要能够正确地设置它。从那里,我们在他们的工作区中完成了开发工作,他们在那里注册了那个模型。在那之后,当它准备好接受审查时,他们会把它提升到生产状态。从那里,我们将使用与该已注册模型关联的ML Flow运行,并使用它将其注册到我们的生产工作空间中,在那里我们将所有自动化作业都放在一个空间中。这将生成一个可供所有数据科学家使用的单一注册表。然后我们将使用它作为官方版本来进行评分。
我们还有一个帮助函数,允许他们为每个模型的元数据生成描述的标记集。我们将总结模型的版本和路径,这样我们就可以同时运行多个版本。为了集中事情,并使事情更可重用,我们为ADF建立了一个简单的框架来部署这些模型。我们有三个不同的笔记本,一个是功能工程,一个是评分,一个是评分验证。
我们还将检查这里的依赖关系,在这些开始之前,如果有任何其他进程需要完成。这可以防止坏数据流和发生丢失数据的错误。我们还将使用SQL服务器记录此过程的任何失败或成功。通过让数据科学家将他们的模型提交给[听不清],并允许我们使用ADO来部署这些模型,我们可以在各种环境中使用它们,并对我们输入的版本和参数有更多的控制,因此它将允许他们在不同类型的数据上运行。
数据科学bob体育外网下载家和人工智能工程师之间的合作是典型的。在生产计划之前,所有模型都对领域和技术精度进行同行评审。我们让团队通知我们新的模型,这样我们就可以和他们安排时间,以确保他们在正确的轨道上。当他们为生产模型做准备时,我们会有一份清单,让他们在部署前完成。然后我们会和它们一起创建pull request并把它放到repo中。从那里开始,工程师们将通过管道进行部署,并确保在投入生产之前一切正常。每个模型最初也由[听不清]审查,随后由[听不清]监控。我们是第一家主要的健康保险公司,这是我们监测和生产的一个重要方面。
我将在此列举我们在该平台上所取得的一些早期成就。bob体育客户端下载我们扩展并自动化了一个笨拙的预置手动过程,涉及创建40个不同的条件。我们现在在云中创建了三倍多的标志,并且已经有来自多个团队的贡献者遵循我们的模板。现在,我们每天仅在一个半小时内就为我们的全体成员更新超过10亿行数据。另一个团队经历了更快的准备、更多的迭代以及更好的调优和协作。我们能够将一个特征工程步骤从几个小时缩短到几分钟,并使他们的数据科学团队能够在一次运行中更快地迭代模型,在prem上花费5个小时,现在对于复杂模型只需半小时或更短的时间。我们还将透视数字的评分步骤从一周减少到30分钟。这使我们能够接触到数据科学过程的任何方面,从特征工程到评分和训练。
我们也有很多共享的资源来加速每个人。数百个特征意味着更少的过程重复和更多的时间来改进模型。我们也可以灵活地使用这些udf,我们的[听不清]udf进行大规模评分,不管算法包是什么。
非常感谢你的聆听。我希望你学到了一些新的东西,可以把它带回你的组织,改善你的组织的模型培训和评分,就像我们在Humana做的那样。非常感谢,感谢您的时间,希望您有时间复习这一环节,并享受接下来的会议。

大卫麦克

David是Humana数字健康和分析组织的认知和机器学习负责人。他于2015年底加入Humana,头几年专注于解决业务问题……
阅读更多