梯度提升树(GBDT)和AutoML

283 阅读11分钟

Gradient Boosted Trees and AutoML

尽管深度学习很受欢迎,但许多人工智能团队的问题最好用深度学习以外的方法解决。这可能是由于可解释性、现实世界数据的稳健性、监管要求、可用的计算能力或时间、批准的软件、可用的专业知识,或任何其他原因。

在这个项目中(以及配套的GitHub仓库),我们将利用梯度提升决策树(GBT)来训练一个模型,然后将该模型部署到生产中。与其说我们应用了深度学习技术,不如说我们将看到许多ML问题都可以用一个精心调优的GBT来解决。

我们为这个项目选择的软件是一个最先进的开源库,叫做H2O。它包括GBT模型、XGBoost模型和集合方法的高级功能,如通过AutoML超参数调整进行堆叠。

一旦模型训练完成,我们将展示如何使用Gradient将其作为REST API端点部署到生产中,并向其发送推理数据。

在配套的GitHub repo中,我们还将展示如何在项目的探索阶段使用Gradient Notebooks,以及在生产阶段使用Gradient Workflows

让我们开始吧!

让这个项目成为现实

在Gradient上运行

内容

  • 数据和模型
  • 梯度笔记本
  • 梯度工作流程
  • 模型部署
  • 结论
  • 接下来的步骤

附带材料

  • ML展示
  • GitHub资源库

数据和模型

我们这个项目的目的是在Gradient上展示端到端的经典机器学习(而不是深度学习)。

由于我们要解决的是一个典型的商业问题,非常适合GBT这样的方法,所以我们要的是混合数据类型的表格数据,而不是文本或计算机视觉数据。

因此,我们将使用著名的UCI普查收入数据集。一个典型的数据片段如下所示。我们的目标将是进行二元分类,以预测一个人的收入是低还是高。这些数据分别被标记为<=50K>50K

Gradient Boosted Trees and AutoML

用于模型训练的UCI人口普查收入数据集

我们看到,该数据集由混合数据类型的人口信息列组成:数字、分类、零等。幸运的是,决策树对于这种类型的数据往往是稳健的,我们不需要准备步骤,如规范化或一键编码。

其他的分析细节将在下面的章节中给出。

梯度笔记本

我们在梯度笔记本中的目标是,从最初的原始数据集到保存好的模型,准备部署。

H2O作为一个Java服务器运行,所以我们将从笔记本单元中初始化它。

import h2o
h2o.init()

在更大的范围内,这使得它可以在计算集群和单机上运行。

由于我们的数据很小,我们可以使用导入方法将它们作为CSV导入到H2O的数据框架中(类似于Pandas)。

df = h2o.import_file(path = "income.csv")

由于梯度笔记本允许任意的Python代码,其他探索性的数据分析和准备可以在这里添加。我们现在先不谈这个,因为这不是我们的重点,而且模型的表现也很正常。

数据被分离成特征列x 和标签列y ,并被分成不重叠的随机子样本,用于训练、验证和测试。然后,它们被传递到模型训练中。

我们将使用H2O的AutoML来训练模型。

from h2o.automl import H2OAutoML
aml = H2OAutoML(max_models=20, seed=1)
aml.train(x=x, y=y, training_frame=train)

尽管它很简单,但AutoML适合于许多问题,包括高级用户的使用。这是因为它可以搜索到广泛的模型和超参数--相当于甚至超过专家的搜索范围。

AutoML的梦想是,它可以在人工调整模型的一小部分时间内产生一个模型,提供足够的商业价值。

尽管如此,AutoML并不能解决所有问题。特别是,许多真实的商业问题都有可能不被支持的商业逻辑条件或不寻常的指标。

因此,这里需要注意的是,完全的手动调优(以及其他任何需要的任意代码)都可以用这个项目在Gradient上的方式完成。要手动调谐模型,我们只需将AutoML位与手动调谐方法如H2OGradientBoostingEstimator

AutoML所探索的一些模型包括。

  • 常规GBT(也被称为GBM或梯度提升机
  • 带有超参数值网格的XGBoost模型
  • 一个深度学习模型
  • 随机森林
  • 堆叠的模型集合(堆叠=将模型的输出输入到下一个模型的输入中)。

有点令人惊讶的是,我们在这里确实包括了深度学习技术然而,这个项目的重点是经典的ML,所以我们坚持这样做。

对这个数据集来说,效果最好的模型是叠加集合。这是许多情况下的常见结果,在这些情况下,一个精心调教的GBT会从模型合集中受益。虽然合集可以提高准确性,但它也会增加计算时间并降低可解释性--所以它最终只在某些情况下有用。

一旦训练完成,大量的信息就会显现出来。例如,模型的 "排行榜 "显示了各种模型的表现。

Gradient Boosted Trees and AutoML

H2O AutoML模型排行榜

模型指标也是可用的。

Gradient Boosted Trees and AutoML

AutoML运行中的一些模型指标

这里我们使用了二元分类的默认指标:曲线下的面积,或AUC。这是真阳性率与假阳性率的关系图所包含的区域。可能的最佳值是1,这里我们在验证集上得到了大约0.92,所以模型似乎表现良好。

我们还可以从完整的排行榜上看到,深度学习任务所花的时间是其他方法的20倍以上,而且表现更差。这不一定是一个公平的比较,因为它没有被广泛地探索,然而尽管如此,我们看到,对于快速分析解决问题来说,经典的ML在这种情况下是足够的。

H2O记录了大量关于模型的信息,包括度量。Gradient有能力在实验和生产过程中记录这些指标。指标可以按原样使用,也可以后期处理成具有更大商业价值的东西,如预期收入。

训练结束后,我们可以在未见过的测试数据上测量模型的性能,以常规方式检查其泛化能力。

最后,我们可以保存模型,这样它就可以被部署到生产中。get_genmodel 参数输出模型部署所需的h2o-genmodel.jar Java依赖。

modelfile = model.download_mojo(path="/storage", get_genmodel_jar=True)

在Gradient目前的发展状态下,它与TensorFlow或ONNX集成了模型生产。因此,我们直接使用Java部署模型(见下面的模型部署)。我们认为这有展示的价值,因为(1)端到端的数据科学应该包括部署到生产中;(2)这种方法对Gradient上的任何H2O模型都是通用的,它包含了人们想用经典的ML解决商业问题的大部分内容。

Gradient工作流程

Gradient的两个主要组件是笔记本和工作流。

笔记本旨在帮助你快速启动和运行数据探索、模型实验和访问硬件加速器(如GPU)。

工作流程旨在使用现代MLOps原则,如Git、Kubernetes、微服务和YAML,将项目推向生产。用户不需要DevOps的专业知识就可以使用Gradient作为一个协调平台。

在这个项目中,我们展示了如何在笔记本以及工作流中完成上述分析。

有一个Python .py脚本,由包含工作流规范的YAML文件调用。这给出了一个完全版本化的步骤描述,Python和YAML的开发不受任何特定IDE或环境的影响。

工作流的YAML规范看起来像这样。

Gradient Boosted Trees and AutoML

梯度工作流YAML规范的一部分

工作流是通过命令行的调用来运行的,命令的类型如下。

gradient workflows run \
  --id         abc123de-f567-ghi8-90jk-l123mno456pq \
  --clusterId  cdefghijk \
  --path       ./Workflow/gbt_automl.yaml \
  --apiKey     ab12cd34ef56gh78ij90kl12mn34op

未来,GUI和SDK也将支持工作流的调用。工作流和输出数据集在完成后可以在GUI中看到。

Gradient Boosted Trees and AutoML

运行AutoML模型训练的梯度工作流

工作流被表示为一个有向无环图(DAG)。虽然这个例子很简单,但可以直接扩展这些步骤,例如增加一个单独的数据准备工作,多个模型,等等。

我们还可以从工作流中查看其他信息,如以前的运行和版本输出数据集。

工作流的输出与笔记本的输出是一样的--一个训练有素的模型,已经准备好被部署了。

模型部署

Gradient的目标之一是使模型的部署尽可能简单,即使在有硬件加速的情况下。

虽然深度学习模型与TensorFlow有相当广泛的集成,但目前这里的H2O经典ML模型是用Java部署的。尽管如此,由于上述原因(端到端的数据科学,而H2O/Java是非常通用的),这一点还是很有价值的,而且随着项目的发展,Gradient的集成度在未来还会增加。

这个设置是基于Spikelab的这篇博客文章中的例子,并做了一些修改。

笔记本和/或工作流项目部分输出MOJO(Model ObJect, Optimized)中的H2O模型。MOJO是保存模型的首选格式,因为它是可移植的,比POJO(Plain Old Java Object)更通用。

模型的命名如下。

StackedEnsemble_AllModels_AutoML_20210621_203855.zip

并且有一个相关的Java依赖性:h2o-genmodel.jar

我们使用简单的Web框架Javalin,用Maven建立一个Java项目,其中包含模型(Model.java )和一个应用(App.java ),将模型设置为REST端点。

我们在Gradient容器中使用命令行创建项目,而不是使用IntelliJ或Eclipse等IDE图形用户界面。我们还使用了一个稍新的H2O版本,3.32.1.3。

Java代码从网上的回归例子修改为我们的二元分类例子。这就是为什么我们改变了调用的类和数据类型。我们把H2O的artifactID从h2o-genmodel 改为h2o-genmodel-ext-xgboost ,以适应XGBoost模型。推理数据包含分类和数字数据类型。

关于如何部署的细节在项目的GitHub repo中,但在Gradient的终端中,部署是通过Java启动的,并在一个端口上监听。

Gradient Boosted Trees and AutoML

H2O模型部署到REST端点

推理数据可以通过curl发送。在这里,我们从收入数据集中提交了一行数据,模型返回其响应,即该行的预测标签。

Gradient Boosted Trees and AutoML

部署的模型对推理数据的正确响应

在这种情况下,这个人被预测为属于低收入阶层,<=50K

显然,这不是一个全面的企业生产部署,但让我们看一下我们在这里做什么。我们在REST端点上有一个模型,推理数据被发送到它,而模型正在返回响应。

Gradient有基础设施来扩大这个规模,并与其他工具(如模型监控)集成。

结论

我们已经表明,Gradient能够支持以深度学习为代表的领域子集之外的高级机器学习(ML)模型。正如我们所发现的那样,哪种方法最好--深度学习或经典ML--完全是情景性的。

这就是我们所做的。

  • 我们使用著名的开源ML库H2O训练梯度提升决策树和其他模型。
  • 我们使用它的AutoML自动机器学习功能来搜索一些模型的超参数组合和额外的设置,如通过堆叠的模型集合
  • 我们通过Java作为REST端点将生成的模型部署到生产中。

我们使用了以下工具。

  • 我们使用了梯度笔记本,它对应于数据科学项目的探索或实验阶段。
  • 我们使用了Gradient工作流,这相当于一个需要更严格和生产级实践的大型项目。

然后,我们通过命令行在Gradient上进行部署。

接下来的步骤

这里展示的笔记本、工作流和部署中的端到端设置可以适用于广泛的业务问题和其他应用。

下面是我们在本教程中提到的一些资源。

这里有一些额外的链接供进一步阅读。

感谢大家的关注!如果您有任何问题或意见,请联系我们。

今天就为您的机器学习工作流程增加速度和简单性吧

开始联系销售