前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何确保机器学习最重要的起始步骤"特征工程"的步骤一致性?

如何确保机器学习最重要的起始步骤"特征工程"的步骤一致性?

作者头像
用户1737318
发布2018-10-22 11:47:26
6940
发布2018-10-22 11:47:26
举报

大家好,我是为人造的智能操碎了心的智能禅师。

关于特征工程,业界有这么一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。

机器学习模型需要数据来训练,但是通常需要对这些数据进行预处理,以便在训练模型时发挥作用。这种预处理,也就是我们熟知的 “特征工程”,采用多种形式,例如:规范化和缩放数据,将分类值编码为数值,形成词汇表,以及连续数值的分级。

特征工程是指从原始数据转换为特征向量的过程。 特征工程是机器学习中最重要的起始步骤,会直接影响机器学习的效果,并通常需要大量的时间。 典型的特征工程包括数据清理、特征提取、特征选择等过程。

本文由 ML6 首席执行官 Matthias Feys 撰写,介绍了如何使用 tf.Transform 对TensorFlow 管道模式进行预处理。

ML6 是 Google Cloud 钦定的全球服务伙伴,利用机器学习促进商业项目,例如金融、医疗、图像、NLU 等。

全文大约1500字。读完可能需要好几首下面这首歌的时间

?

在生产过程中利用机器学习时,为了确保在模型的离线培训期间应用的特征工程步骤与使用模型用于预测时应用的特征工程步骤保持相同,这往往就成为一项极具挑战性的任务。

此外,放眼当今世界,机器学习模型会在超大型的数据集上进行训练,因此在训练期间应用的预处理步骤将会在大规模分布式计算框架(例如 Google Cloud Dataflow 或 Apache Spark)上实现。

由于训练环境通常与服务环境大相径庭,在训练和服务期间执行的特征工程之间可能会产生不一致的情况。

幸运的是,我们现在有了 tf.Transform,这是一个 TensorFlow 库,它提供了一个优雅的解决方案,以确保在训练和服务期间特征工程步骤的一致性。 在这篇文章中,我们将提供在 Google Cloud Dataflow 上使用 tf.Transform,以及在 Cloud ML Engine 上进行模型训练和服务的具体示例。

注:tf.Transform 链接

https://github.com/tensorflow/transform

变换用例

ecc.ai 是一个有助于优化机器配置的平台。 我们模拟物理机器(例如瓶灌装机或饼干机)以便找到更优化的参数设置。 由于每个模拟的物理机器的目标是具有与实际机器相同的输入/输出特性,我们称之为 “数字孪生”。

这篇文章将展示这个 “数字孪生” 的设计和实现过程。 在最后一段中,您可以找到有关我们之后如何使用这些数字孪生来优化机器配置的更多信息。

注:ecc.ai 链接

https://ecc.ai/

tf.Transform

tf.Transform 是 TensorFlow 的一个库,它允许用户定义预处理管道模式并使用大规模数据处理框架运行这些管道模式,同时还以可以作为 TensorFlow 图形的一部分运行的方式导出管道。 用户通过组合模块化 Python 函数来定义管道,然后 tf.Transform 随着 Apache Beam 一起运行。 tf.Transform 导出的 TensorFlow 图形可以在使用训练模型进行预测时复制预处理步骤,比如在使用 TensorFlow Serving 服务模型时。

注:Apache Beam 链接

https://beam.apache.org/

TensorFlow Serving 链接

https://ai.googleblog.com/2016/02/running-your-models-in-production-with.html

tf.Transform 允许用户定义预处理管道。 用户可以实现预处理数据以用于 TensorFlow 训练,还可以将转换编码为 TensorFlow 图形后导出。然后将该变换图形结合到用于推断的模型图中

建立数字孪生

数字双模型的目标是能够根据其输入预测机器的所有输出参数。 为了训练这个模型,我们分析了包含这种关系的观察记录历史的日志数据。

由于日志的数据量可能会相当广泛,理想的情况是应该以分布式方式运行此步骤。 此外,必须在训练和服务的时间之间使用相同的概念和代码,这样对预处理代码的改动最小。

开发伊始,我们在任何现有的开源项目中都找不到此功能。 因此,我们开始构建用于 Apache Beam 预处理的自定义工具,这使我们能够分配我们的工作负载并轻松地在多台机器之间切换。

但是不太幸运的是,这种方法不允许我们在服务时(即在生产环境中使用训练模型时)重复使用相同的代码作为 TensorFlow 图形的一部分运行。

在实践中,我们必须在 Apache Beam 中编写自定义分析步骤,计算并保存每个变量所需的元数据,以便在后续步骤中进行实际的预处理。

我们在训练期间使用 Apache Beam 执行后续预处理步骤,并在服务期间作为 API 的一部分执行。 不幸的是,由于它不是 TensorFlow 图形的一部分,我们不能简单地使用 ML Engine 将我们的模型部署为 API,而我们的 API 总是由预处理部分和模型部分组成,这使得统一升级变得更加困难。

而且,对于所有想要使用的那些已有的和全新的转换,我们需要为此实施和维护分析并转换步骤。

TensorFlow Transform 解决了这些问题。 自发布以来,我们将其直接整合为我们完整管道模式的主要构建块。

简化数字孪生示例流程

我们现在将专注于构建和使用特定机器的数字孪生。 举个例子,我们假设有一个布朗尼面团机器。 这台机器对不同的原料进行加热、搅拌,直到面团产生完美的质地。 我们将从批次问题开始,这意味着数据在完整的生产批次中进行汇总,而不是在连续不断的生产线上进行汇总。

数据

我们有两种类型的数据:

输入数据:原料描述(绿色)和布朗尼面团机(蓝色)的设置。 您可以在下面找到列名称和 3 个示例行。

输出数据:带有这些原料的机器设置结果:消耗的能量,输出的质量度量和输出量。 您可以在下面找到列名称和 3 个示例行。

制作数字孪生

在这里,我们在云存储中根据两种不同类型文件的历史日志数据来训练系统的数字孪生。 该数字孪生能够基于输入数据预测输出数据。上图显示我们在此流程中使用的 Google 服务。

预处理

使用 tf.Transform 函数,Apache Beam 将完成预处理(制作训练示例)。

预处理阶段包括 4 个步骤,代码如下:

1. 组合输入/输出数据,并制作原始数据 PCollection

2. 定义将预处理原始数据的预处理功能。 此函数将组合多个 TF-Transform 函数,以生成 TensorFlow Estimators 的示例。

3. 使用预处理功能分析和转换整个数据集。这部分代码将采用预处理功能,首先分析数据集,即完整传递数据集以计算分类列的词汇表,然后计算平均值和标准化列的标准偏差。 接下来,Analyze 步骤的输出用于转换整个数据集。

4. 保存数据并将 TransformFn 和元数据文件序列化。

训练

使用预处理数据作为 TFRecords,我们现在可以使用 Estimators 轻松训练带有标准 TensorFlow 代码的 TensorFlow 模型。

导出训练的模型

在分析数据集的结构化方法旁边,tf.Transform 的实际功能在于可以导出预处理图。 您可以导出 TensorFlow 模型,该模型包含与训练数据完全相同的预处理步骤。

为此,我们只需要使用 tf.Transform 输入函数导出训练模型:

_make_serving_input_fn 函数是一个非常通用的函数,不管项目的逻辑如何,您都可以简单地在不同项目之间重用:

使用数字孪生

数字孪生示例流程的最后一部分使用保存的模型根据输入预测系统的输出。 这是我们可以充分利用 tf.Transform 的地方,因为这使得在 Cloud ML Engine 上部署 “TrainedModel”(包括预处理)变得非常容易。

要部署训练模型,您只需运行 2 个命令:

现在,我们可以使用以下代码轻松地与我们的数字孪生进行交互:

在 ecc.ai,我们使用数字孪生来优化物理机器的参数。

简而言之,我们的方法包括 3 个步骤(如下图 1 所示):

  1. 使用历史机器数据创建模拟环境。机器的这种 “数字孪生” 则将作为能够允许增强代理来学习最佳控制策略的环境
  2. 利用数字孪生使用我们的强化学习(RL)代理查找(新的)最佳参数设置
  3. 使用 RL 代理配置真实机器的参数

总结

通过 tf.Transform,我们现在已将我们的模型部署在 ML Engine 上作为一个 API,成为特定布朗尼面团机的数字孪生:它采用原始输入功能(成分描述和机器设置),并将反馈机器的预测输出。

好处是我们不需要维护 API 并且包含所有内容 - 因为预处理是服务图形的一部分。 如果我们需要更新 API,只需要使用最新的版本来刷新模型,所有相关的预处理步骤将会自动为您更新。

此外,如果我们需要为另一个布朗尼面团机器(使用相同数据格式的机器)制作数字孪生模型,但是是在不同的工厂或设置中运行,我们也可以轻松地重新运行相同的代码,无需手动调整预处理代码或执行自定义分析步骤。

您可以在 GitHub 上找到这篇文章的代码。

注:GitHub 链接

https://github.com/Fematich/tftransform-demo

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能头条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 变换用例
  • tf.Transform
  • 建立数字孪生
  • 简化数字孪生示例流程
  • 使用数字孪生
  • 总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档