机器学习数据预处理:选项和建议

本文档是探讨机器学习 (ML) 数据工程和特征工程主题的两部分系列中的第一部分,重点介绍监督学习任务。第一部分讨论了在 Google Cloud 上的机器学习管道中预处理数据的最佳实践。本文档重点介绍了使用 TensorFlow 和开源 TensorFlow Transform (tf.Transform) 库来准备数据、训练模型以及为预测服务模型。本文档重点介绍了机器学习数据预处理的挑战,并描述了在 Google Cloud 上有效执行数据转换的选项和场景。

本文档假设您熟悉 BigQueryDataflowVertex AI 以及 TensorFlow Keras API。

第二篇文档 使用 Google Cloud 进行机器学习数据预处理 提供了有关如何实现 tf.Transform 管道的分步教程。

简介

机器学习可以帮助您自动在数据中找到复杂且可能有用模式。这些模式浓缩在机器学习模型中,然后可以应用于新的数据点,这个过程称为“进行预测”或“执行推断”。

构建机器学习模型是一个多步骤过程。每个步骤都面临着自身的技术和概念挑战。本两部分系列重点介绍监督学习任务以及选择、转换和增强源数据以创建强大预测信号以供目标变量使用的过程。这些操作将领域知识与数据科学技术相结合。这些操作是 特征工程 的核心。

现实世界机器学习模型的训练数据集大小很容易达到或超过 1 TB。因此,您需要大规模数据处理框架才能高效且分布式地处理这些数据集。当您使用机器学习模型进行预测时,您必须对新数据点应用与训练数据相同的转换。通过应用相同的转换,您可以以模型期望的方式向机器学习模型呈现实时数据集。

本文档讨论了针对不同特征工程操作粒度级别的这些挑战:实例级、全通和时间窗口聚合。本文档还描述了在 Google Cloud 上执行机器学习数据转换的选项和场景。

本文档还概述了 TensorFlow Transform (tf.Transform),这是一个用于 TensorFlow 的库,可让您通过数据预处理管道定义实例级和全通数据转换。这些管道使用 Apache Beam 执行,并创建工件,使您能够在模型服务时,在预测期间应用与训练期间相同的转换。

机器学习数据预处理

本节介绍数据预处理操作和数据准备阶段。它还讨论了预处理操作的类型及其粒度。

数据工程与特征工程的比较

为机器学习预处理数据涉及数据工程和特征工程。数据工程是将原始数据转换为准备好的数据的过程。然后,特征工程调整准备好的数据以创建机器学习模型期望的特征。这些术语具有以下含义

原始数据(或仅为数据
原始数据,未经任何机器学习准备。在这种情况下,数据可能处于原始形式(在数据湖中)或转换后的形式(在数据仓库中)。数据仓库中的转换数据可能已从原始形式转换为用于分析的形式。但是,在本例中,原始数据是指数据尚未专门为您的机器学习任务准备。如果数据是从最终调用机器学习模型进行预测的流式系统发送的,则该数据也被视为原始数据。
准备数据
以适合您的机器学习任务的形式呈现的数据集:数据源已解析、合并并以表格形式呈现。准备好的数据已聚合并汇总到正确的粒度 - 例如,数据集中的每一行代表一个唯一的客户,每一列代表客户的汇总信息,例如过去六周的总支出。在准备好的数据表中,已删除不相关的列,并已过滤掉无效记录。对于监督学习任务,目标特征存在。
工程特征
包含模型预期调整后的特征的数据集 - 也就是说,通过对准备好的数据集中的列执行某些特定于机器学习的操作来创建的特征,并在训练和预测期间为您的模型创建新特征,如后文预处理操作中所述。这些操作的示例包括将数值列缩放到 0 到 1 之间的值、剪切值以及对分类特征进行独热编码

下图(图 1)显示了准备预处理数据所涉及的步骤。

Flow diagram showing raw data moving to prepared data moving to engineered features.
图 1. 数据从原始数据到准备好的数据到工程特征到机器学习的流程。

实际上,来自同一来源的数据通常处于不同的准备就绪阶段。例如,数据仓库中表中的一个字段可以直接用作工程特征。同时,同一表中的另一个字段可能需要经过转换才能成为工程特征。类似地,数据工程和特征工程操作可能在同一个数据预处理步骤中组合。

预处理操作

数据预处理包括多个操作。每个操作都旨在帮助机器学习构建更好的预测模型。这些预处理操作的详细信息超出了本文档的范围,但本节简要介绍了一些操作。

对于结构化数据,数据预处理操作包括以下内容

  • 数据清洗:从原始数据中删除或更正具有损坏或无效值的记录,并删除缺少大量列的记录。
  • 实例选择和分区:从输入数据集中选择数据点以创建训练集、评估(验证)集和测试集。此过程包括可重复随机抽样、少数类过采样和分层分区技术。
  • 特征调整:提高机器学习特征的质量,包括缩放和规范化数值、插补缺失值、剪切异常值以及调整具有偏斜分布的值。
  • 特征转换:将数值特征转换为分类特征(通过分箱),并将分类特征转换为数值表示(通过独热编码、计数学习、稀疏特征嵌入等)。一些模型仅适用于数值特征或分类特征,而另一些模型可以处理混合类型特征。即使模型处理两种类型,它们也可以从同一特征的不同表示(数值和分类)中获益。
  • 特征提取:使用诸如PCA嵌入提取和哈希等技术,通过创建低维、更强大的数据表示来减少特征数量。
  • 特征选择:使用过滤或包装方法,选择输入特征的子集来训练模型,并忽略不相关或冗余的特征。特征选择还可以包括在特征缺少大量值时简单地删除特征。
  • 特征构建:使用典型技术创建新特征,例如多项式扩展(通过使用单变量数学函数)或特征交叉(以捕获特征交互)。特征也可以通过使用机器学习用例领域中的业务逻辑来构建。

当您处理非结构化数据(例如图像、音频或文本文档)时,深度学习通过将基于领域知识的特征工程折叠到模型架构中来代替它。一个卷积层是一个自动特征预处理器。构建正确的模型架构需要一些关于数据的经验知识。此外,还需要进行一定程度的预处理,例如以下内容

  • 对于文本文档:词干提取和词形还原TF-IDF 计算和n-gram 提取、嵌入查找。
  • 对于图像:剪切、调整大小、裁剪、高斯模糊和金丝雀过滤器。
  • 对于所有类型的数据(包括文本和图像):迁移学习,它将完全训练的模型的所有层(最后一层除外)视为特征工程步骤。

预处理粒度

本节讨论数据转换类型的粒度。它展示了为什么这种观点在使用应用于训练数据的转换来准备新的数据点进行预测时至关重要。

根据操作粒度,可以将预处理和转换操作分类如下

  • 训练和预测期间的实例级转换。这些是简单的转换,其中仅需要来自同一实例的值才能进行转换。例如,实例级转换可能包括将特征的值剪切到某个阈值、对另一个特征进行多项式扩展、将两个特征相乘或比较两个特征以创建布尔标志。

    这些转换必须在训练和预测期间以相同的方式应用,因为模型将根据转换后的特征进行训练,而不是根据原始输入值进行训练。如果数据没有以相同的方式进行转换,那么模型的行为会很差,因为它会接收到与训练时具有不同值分布的数据。有关更多信息,请参阅预处理挑战部分中关于训练服务偏差的讨论。

  • 训练期间的全通转换,但预测期间的实例级转换。在这种情况下,转换是有状态的,因为它们使用一些预先计算的统计信息来执行转换。在训练期间,您分析整个训练数据主体以计算数量,例如最小值、最大值、平均值和方差,以在预测时转换训练数据、评估数据和新数据。

    例如,要规范化训练的数值特征,您需要计算其在整个训练数据中的平均值 (μ) 和标准差 (σ)。此计算称为全通(或分析)操作。当您为预测提供服务时,新数据点的值将被规范化以避免训练服务偏差。因此,在训练期间计算的 μ 和 σ 值用于调整特征值,这是以下简单的实例级操作

    $$ value_{scaled} = (value_{raw} - \mu) \div \sigma $$

    全通转换包括以下内容

    • 使用从训练数据集中计算的最小值最大值对数值特征进行 MinMax 缩放。
    • 使用在训练数据集中计算的 μ 和 σ 对数值特征进行标准缩放(z 分数规范化)。
    • 使用分位数对数值特征进行分箱。
    • 使用中位数(数值特征)或众数(分类特征)插补缺失值。
    • 通过提取输入分类特征的所有不同值(词汇表)将字符串(名义值)转换为整数(索引)。
    • 计算所有文档(实例)中术语(特征值)的出现次数以计算 TF-IDF。
    • 计算输入特征的 PCA 以将数据投影到低维空间(具有线性相关特征)。

    您应该仅使用训练数据来计算 μ、σ、最小值最大值等统计信息。如果您将测试和评估数据添加到这些操作中,那么您正在泄露信息从评估和测试数据到训练模型。这样做会影响测试和评估结果的可靠性。为了确保您对所有数据集应用一致的转换,您使用从训练数据计算的相同统计信息来转换测试和评估数据。

  • 训练和预测期间的历史聚合。这涉及创建业务聚合、推导和标志作为预测任务的输入信号 - 例如,为客户创建最近度、频率和货币价值 (RFM)指标以构建倾向模型。这些类型的特征可以预先计算并存储在特征存储中,以便在模型训练、批次评分和在线预测服务期间使用。您还可以对这些聚合进行额外的特征工程(例如,转换和调整),然后再进行训练和预测。

  • 训练期间使用历史聚合,预测期间使用实时聚合。这种方法涉及通过随时间汇总实时值来创建特征。在这种方法中,要聚合的实例是通过时间窗口子句定义的。例如,如果您想训练一个模型,该模型根据过去 5 分钟、10 分钟、30 分钟和其他时间间隔内路线的交通指标来估计出租车行程时间,则可以使用这种方法。您还可以使用这种方法根据过去 3 分钟内计算出的温度和振动值的移动平均值来预测发动机部件的故障。虽然这些聚合可以在离线情况下为训练准备,但它们是在服务期间从数据流中实时计算的。

    更准确地说,当您准备训练数据时,如果聚合值不在原始数据中,则该值会在数据工程阶段创建。原始数据通常存储在格式为 (entity, timestamp, value) 的数据库中。在前面的示例中,entity 是出租车路线的路线段标识符和发动机故障的发动机部件标识符。您可以使用窗口操作来计算 (entity, time_index, aggregated_value_over_time_window),并将聚合特征用作模型训练的输入。

    当为实时(在线)预测服务的模型时,该模型期望从聚合值派生的特征作为输入。因此,您可以使用 Apache Beam 等流处理技术从流入系统的实时数据点计算聚合。流处理技术根据时间窗口对实时数据进行聚合,因为新的数据点会不断到达。您还可以对这些聚合进行额外的特征工程(例如,转换和调整),然后再进行训练和预测。

Google Cloud 上的 ML 管道

本节讨论使用托管服务在 Google Cloud 上训练和服务 TensorFlow ML 模型的典型端到端管道的核心组件。它还讨论了您可以在何处实现不同类别的数据预处理操作,以及在实现此类转换时可能遇到的常见挑战。TensorFlow Transform 工作原理 部分展示了 TensorFlow Transform 库如何帮助解决这些挑战。

高级架构

下图(图 2)显示了用于训练和服务 TensorFlow 模型的典型 ML 管道的高级架构。图中的标签 A、B 和 C 指的是管道中数据预处理可以进行的不同位置。有关这些步骤的详细信息,请参阅下一节。

Architecture diagram showing stages for processing data.
图 2. Google Cloud 上 ML 训练和服务的架构概述。

该管道包含以下步骤

  1. 导入原始数据后,表格数据将存储在 BigQuery 中,其他数据(如图像、音频和视频)将存储在 Cloud Storage 中。本系列的第二部分以存储在 BigQuery 中的表格数据为例。
  2. 使用 Dataflow 大规模执行数据工程(准备)和特征工程。此执行会生成存储在 Cloud Storage 中的 ML 就绪训练集、评估集和测试集。理想情况下,这些数据集应存储为 TFRecord 文件,这是 TensorFlow 计算的优化格式。
  3. 将 TensorFlow 模型 训练器包 提交给 Vertex AI Training,它使用来自先前步骤的预处理数据来训练模型。此步骤的输出是训练好的 TensorFlow SavedModel,它被导出到 Cloud Storage。
  4. 训练好的 TensorFlow 模型被部署到 Vertex AI Prediction,作为具有 REST API 的服务,以便可以将其用于在线预测。同一模型也可以用于批处理预测作业。
  5. 在模型被部署为 REST API 后,客户端应用程序和内部系统可以通过发送包含一些数据点的请求并从模型接收包含预测的响应来调用 API。
  6. 为了编排和自动化此管道,您可以使用 Vertex AI Pipelines 作为调度程序来调用数据准备、模型训练和模型部署步骤。

您还可以使用 Vertex AI Feature Store 来存储输入特征以进行预测。例如,您可以定期从最新的原始数据中创建工程特征,并将它们存储在 Vertex AI Feature Store 中。客户端应用程序从 Vertex AI Feature Store 中获取所需的输入特征,并将它们发送到模型以接收预测。

在何处进行预处理

在图 2 中,标签 A、B 和 C 显示数据预处理操作可以在 BigQuery、Dataflow 或 TensorFlow 中进行。以下部分描述了每种选项的工作原理。

选项 A:BigQuery

通常,在 BigQuery 中实现以下操作的逻辑

  • 采样:从数据中随机选择子集。
  • 过滤:删除不相关或无效的实例。
  • 分区:拆分数据以生成训练集、评估集和测试集。

BigQuery SQL 脚本可以用作 Dataflow 预处理管道的源查询,Dataflow 预处理管道是图 2 中的数据处理步骤。例如,如果一个系统在加拿大使用,并且数据仓库包含来自世界各地的交易,那么最好在 BigQuery 中过滤以获取仅加拿大的训练数据。在 BigQuery 中进行特征工程既简单又可扩展,并且支持实现实例级和历史聚合特征转换。

但是,我们建议您仅在将模型用于批处理预测(评分)时,或在特征在 BigQuery 中预先计算但在 Vertex AI Feature Store 中存储以在在线预测期间使用时,才使用 BigQuery 进行特征工程。如果您计划将模型部署用于在线预测,并且您没有在线特征存储中的工程特征,则必须复制 SQL 预处理操作以转换其他系统生成的原始数据点。换句话说,您需要实现两次逻辑:一次在 SQL 中以预处理 BigQuery 中的训练数据,另一次在使用模型的应用程序的逻辑中以预处理在线数据点以进行预测。

例如,如果您的客户端应用程序是用 Java 编写的,则需要在 Java 中重新实现该逻辑。这可能会由于实现差异而导致错误,如本文档后面 预处理挑战 部分的训练服务偏差部分所述。维护两种不同的实现也是额外的开销。每当您更改 SQL 中的逻辑以预处理训练数据时,都需要相应地更改 Java 实现以预处理服务时的数据。

如果您仅将模型用于批处理预测(例如,使用 Vertex AI 批处理预测),并且您的评分数据来自 BigQuery,则可以将这些预处理操作实现为 BigQuery SQL 脚本的一部分。在这种情况下,您可以使用相同的预处理 SQL 脚本准备训练数据和评分数据。

全通状态转换不适合在 BigQuery 中实现。如果您在 BigQuery 中使用全通转换,则需要辅助表来存储状态转换所需的量,例如用于缩放数值特征的均值和方差。此外,使用 BigQuery 上的 SQL 实现全通转换会增加 SQL 脚本的复杂性,并会在训练和评分 SQL 脚本之间创建复杂的依赖关系。

选项 B:Dataflow

如图 2 所示,您可以在 Apache Beam 中实现计算量大的预处理操作,并使用 Dataflow 大规模运行它们。Dataflow 是一种完全托管的自动扩展服务,用于批处理和流数据处理。当您使用 Dataflow 时,您还可以使用外部专门库进行数据处理,这与 BigQuery 不同。

Dataflow 可以执行实例级转换以及历史和实时聚合特征转换。特别是,如果您的 ML 模型期望一个名为 total_number_of_clicks_last_90sec 的输入特征,则 Apache Beam 窗口函数 可以根据实时(流式)事件数据(例如,点击事件)的时间窗口的聚合值来计算这些特征。在前面关于 转换粒度 的讨论中,这被称为“训练期间使用历史聚合,预测期间使用实时聚合”。

下图(图 3)显示了 Dataflow 在处理流数据以进行近实时预测中的作用。

Architecture for using stream data for prediction.
图 3. 使用 Dataflow 中的流数据进行预测的高级架构。

如图 3 所示,在处理过程中,称为数据点的事件被摄取到 Pub/Sub 中。Dataflow 使用这些数据点,根据时间段的聚合计算特征,然后调用已部署的 ML 模型 API 以进行预测。然后将预测发送到出站 Pub/Sub 队列。从 Pub/Sub,预测可以被下游系统(如监控或控制)使用,或者可以被推回(例如,作为通知)到最初请求的客户端。预测还可以存储在低延迟数据存储中(如 Cloud Bigtable)以进行实时获取。Cloud Bigtable 还可以用于累积和存储这些实时聚合,以便在需要进行预测时可以查找它们。

相同的 Apache Beam 实现可用于批处理来自离线数据存储(如 BigQuery)的训练数据,以及流处理实时数据以服务在线预测。

在其他典型架构中(例如图 2 中所示的架构),客户端应用程序直接调用已部署的模型 API 以进行在线预测。在这种情况下,如果在 Dataflow 中实现预处理操作以准备训练数据,则这些操作不会应用于直接发送到模型的预测数据。因此,此类转换应在服务期间集成到模型中以进行在线预测。

Dataflow 可用于执行全通转换,方法是按比例计算所需的统计信息。但是,这些统计信息需要存储在某个地方,以便在预测期间用于转换预测数据点。通过使用 TensorFlow Transform (tf.Transform) 库,您可以直接将这些统计信息嵌入模型中,而不是将它们存储在其他地方。这种方法将在后面的 TensorFlow Transform 工作原理 部分进行解释。

选项 C:TensorFlow

如图 2 所示,您可以在 TensorFlow 模型本身中实现数据预处理和转换操作。如图所示,您为训练 TensorFlow 模型而实现的预处理在模型被导出和部署以进行预测时成为模型的组成部分。TensorFlow 模型中的转换可以通过以下几种方式完成

  • input_fn 函数和 serving_fn 函数中实现所有实例级转换逻辑。input_fn 函数使用 tf.data.Dataset API 准备数据集以训练模型。serving_fn 函数接收并准备数据以进行预测。
  • 通过使用 Keras 预处理层创建自定义层,将转换代码直接放入 TensorFlow 模型中。

位于 serving_fn 函数中的转换逻辑代码定义了您的 SavedModel 用于在线预测的服务接口。如果您在 serving_fn 函数的转换逻辑代码中实现了与准备训练数据时相同的转换,则可以确保在提供新预测数据点时对它们应用相同的转换。

但是,由于 TensorFlow 模型独立地或以小批次处理每个数据点,因此您无法计算所有数据点的聚合。因此,无法在 TensorFlow 模型中实现全通转换。

预处理挑战

以下是实现数据预处理的主要挑战

  • 训练服务偏差训练服务偏差 指的是训练期间和服务期间有效性(预测性能)之间的差异。这种偏差可能是由于您在训练和服务管道中处理数据的方式存在差异造成的。例如,如果您的模型是在对数转换后的特征上训练的,但在服务期间呈现原始特征,则预测输出可能不准确。

    如果转换本身成为模型的一部分,则可以像之前在 选项 C:TensorFlow 中所述的那样,直接处理实例级转换。在这种情况下,模型服务接口(serving_fn 函数)期望原始数据,而模型在内部转换此数据,然后计算输出。转换与应用于原始训练和预测数据点的转换相同。

  • 全通转换。您无法在 TensorFlow 模型中实现全通转换,例如缩放和归一化转换。在全通转换中,必须事先在训练数据上计算某些统计信息(例如,用于缩放数值特征的 maxmin 值),如 选项 B:Dataflow 中所述。然后,必须将这些值存储在某个地方,以便在模型服务期间用于预测,以将新的原始数据点转换为实例级转换,从而避免训练服务偏差。您可以使用 TensorFlow Transform (tf.Transform) 库将统计信息直接嵌入到 TensorFlow 模型中。这种方法将在后面的 tf.Transform 的工作原理 中进行解释。

  • 提前准备数据以提高训练效率。将实例级转换作为模型的一部分来实现可能会降低训练过程的效率。这种降低是由于在每个 epoch 上对相同训练数据重复应用相同的转换造成的。假设您有 1,000 个特征的原始训练数据,并且您应用了混合的实例级转换来生成 10,000 个特征。如果您将这些转换作为模型的一部分来实现,并且您随后将原始训练数据提供给模型,则这 10,000 个操作将在每个实例上应用 N 次,其中 N 是 epoch 的数量。此外,如果您使用加速器(GPU 或 TPU),它们会在 CPU 执行这些转换时处于空闲状态,这并非对昂贵的加速器的有效利用。

    理想情况下,训练数据会在训练之前进行转换,使用 选项 B:Dataflow 下面描述的技术,其中 10,000 个转换操作仅在每个训练实例上应用一次。然后将转换后的训练数据提供给模型。不会应用任何进一步的转换,并且加速器始终处于繁忙状态。此外,使用 Dataflow 可以帮助您使用完全托管的服务来大规模预处理大量数据。

    提前准备训练数据可以提高训练效率。但是,在模型之外实现转换逻辑(选项 A:BigQuery选项 B:Dataflow 中描述的方法)并不能解决训练服务偏差问题。除非您将工程特征存储在特征存储中,以便用于训练和预测,否则必须在某个地方实现转换逻辑,以便将其应用于用于预测的新数据点,因为模型接口期望转换后的数据。TensorFlow Transform (tf.Transform) 库可以帮助您解决此问题,如下一节所述。

tf.Transform 的工作原理

对于需要全通的转换,tf.Transform 库非常有用。tf.Transform 库的输出以 TensorFlow 图的形式导出,该图表示实例级转换逻辑和从全通转换计算的统计信息,用于训练和服务。在训练和服务中使用相同的图可以防止偏差,因为在两个阶段都应用相同的转换。此外,tf.Transform 库可以在 Dataflow 上的批处理管道中大规模运行,以提前准备训练数据并提高训练效率。

下图(图 4)显示了 tf.Transform 库如何对训练和预测数据进行预处理和转换。该过程将在以下部分中进行描述。

Diagram showing flow from raw data through tf.Transform to predictions.
图 4. tf.Transform 用于预处理和转换数据的行为。

转换训练和评估数据

您使用在 tf.Transform Apache Beam API 中实现的转换来预处理原始训练数据,并在 Dataflow 上大规模运行它。预处理在以下阶段进行

  • 分析阶段:在分析阶段,使用全通操作在训练数据上计算有状态转换所需的统计信息(如均值、方差和分位数)。此阶段会生成一组转换工件,包括 transform_fn 图。 transform_fn 图是一个 TensorFlow 图,其中包含转换逻辑作为实例级操作。它包含在分析阶段计算的统计信息作为常量。
  • 转换阶段:在转换阶段,将 transform_fn 图应用于原始训练数据,其中使用计算的统计信息以实例级方式处理数据记录(例如,对数值列进行缩放)。

这种两阶段方法解决了 预处理挑战,即执行全通转换。

当预处理评估数据时,仅应用实例级操作,使用 transform_fn 图中的逻辑和从训练数据分析阶段计算的统计信息。换句话说,您不会以全通方式分析评估数据以计算新的统计信息,例如 μ 和 σ,以对评估数据中的数值特征进行归一化。相反,您使用从训练数据计算的统计信息以实例级方式转换评估数据。

使用 Dataflow 大规模准备转换后的训练和评估数据,然后将其用于训练模型。这种批处理数据准备过程解决了 预处理挑战,即提前准备数据以提高训练效率。如图 4 所示,模型内部接口期望转换后的特征。

将转换附加到导出的模型

如前所述,tf.Transform 管道生成的 transform_fn 图存储为导出的 TensorFlow 图。导出的图包含转换逻辑作为实例级操作,以及在全通转换中计算的所有统计信息作为图常量。当训练后的模型导出以供服务时, transform_fn 图将作为其 serving_fn 函数的一部分附加到 SavedModel。

在为预测提供模型服务时,模型服务接口期望数据点采用原始格式(即,在任何转换之前)。但是,模型内部接口期望数据采用转换后的格式。

现在是模型一部分的 transform_fn 图将在传入数据点上应用所有预处理逻辑。它在预测期间使用实例级操作中存储的常量(如 μ 和 σ 用于对数值特征进行归一化)。因此, transform_fn 图将原始数据点转换为转换后的格式。转换后的格式是模型内部接口为了生成预测而期望的格式,如图 4 所示。

这种机制解决了 预处理挑战,即训练服务偏差,因为用于转换训练和评估数据的相同逻辑(实现)将应用于在预测服务期间转换新的数据点。

预处理选项摘要

下表总结了本文讨论的数据预处理选项。在表中,“N/A”代表“不适用”。

数据预处理选项 实例级
(无状态转换)

训练期间全通,服务期间实例级(有状态转换)

训练和服务期间的实时(窗口)聚合(流式转换)

BigQuery  (SQL)

批处理评分:可以—在训练和批处理评分期间对数据应用相同的转换实现。

在线预测:不推荐—您可以处理训练数据,但这会导致训练服务偏差,因为您使用不同的工具处理服务数据。

批处理评分:不推荐.

在线预测:不推荐.

虽然您可以使用使用 BigQuery 计算的统计信息进行实例级批处理/在线转换,但这并不容易,因为您必须维护一个统计信息存储,以便在训练期间填充并在预测期间使用。

批处理评分:N/A—这些聚合是根据实时事件计算的。

在线预测:不推荐—您可以处理训练数据,但这会导致训练服务偏差,因为您使用不同的工具处理服务数据。

Dataflow (Apache Beam)

批处理评分:可以—在训练和批处理评分期间对数据应用相同的转换实现。

在线预测:可以—如果服务时的数据来自 Pub/Sub,以便 Dataflow 使用。否则,会导致训练服务偏差。

批处理评分:不推荐.

在线预测:不推荐.

虽然您可以使用使用 Dataflow 计算的统计信息进行实例级批处理/在线转换,但这并不容易,因为您必须维护一个统计信息存储,以便在训练期间填充并在预测期间使用。

批处理评分:N/A—这些聚合是根据实时事件计算的。

在线预测:可以—在训练(批处理)和服务(流式)期间对数据应用相同的 Apache Beam 转换。

Dataflow (Apache Beam + TFT)

批处理评分:可以—在训练和批处理评分期间对数据应用相同的转换实现。

在线预测:推荐—它可以避免训练服务偏差,并提前准备训练数据。

批处理评分:推荐.

在线预测:推荐.

两种用途都推荐,因为训练期间的转换逻辑和计算的统计信息将存储为 TensorFlow 图,该图将附加到导出的模型以供服务。

批处理评分:N/A—这些聚合是根据实时事件计算的。

在线预测:可以—在训练(批处理)和服务(流式)期间对数据应用相同的 Apache Beam 转换。

TensorFlow *
(input_fn & serving_fn)

批处理评分:不推荐.

在线预测:不推荐.

为了提高两种情况下训练的效率,最好提前准备训练数据。

批量评分:不可行.

在线预测:不可行.

批处理评分:N/A—这些聚合是根据实时事件计算的。

在线预测:不可行.

* 使用 TensorFlow,交叉、嵌入和独热编码等转换应以 feature_columns 列的形式声明式地执行。

下一步