使用 MLTransform 预处理数据
此页面介绍如何使用 MLTransform
类为机器学习 (ML) 工作流预处理数据。Apache Beam 提供了一组数据处理转换,用于预处理用于训练和推理的数据。MLTransform
类将各种转换封装在一个类中,简化了您的工作流。有关可用转换的完整列表,请参阅本页上的 转换 部分。
为什么要使用 MLTransform
- 使用
MLTransform
,您可以对训练和推理使用相同的预处理步骤,从而确保结果一致。 - 使用大型语言模型 (LLM) 生成文本数据的 嵌入。
MLTransform
可以对数据集进行全面的处理,这在您需要在分析完整个数据集后才转换单个元素时很有用。例如,使用MLTransform
,您可以完成以下任务- 使用整个数据集的最小值和最大值对输入值进行归一化。
- 根据观察到的数据分布,通过为它们分配桶将
floats
转换为ints
。 - 通过在整个数据集上生成词汇表将
strings
转换为ints
。 - 计算所有文档中单词的出现次数,以计算 TF-IDF 权重。
支持和限制
- 在 Apache Beam Python SDK 版本 2.53.0 及更高版本中可用。
- 支持 Python 3.8、3.9、3.10 和 3.11
- 仅适用于使用 默认窗口 的管道。
转换
您可以使用 MLTransform
生成文本嵌入并执行各种数据处理转换。
文本嵌入转换
您可以使用 MLTranform
生成嵌入,您可以使用这些嵌入将数据推送到向量数据库或运行推理。
转换名称 | 描述 |
---|---|
SentenceTransformerEmbeddings | 使用 Hugging Face sentence-transformers 模型生成文本嵌入。 |
VertexAITextEmbeddings | 使用来自 Vertex AI 文本嵌入 API 的模型生成文本嵌入。 |
使用 TFT 的数据处理转换
MLTransform
类中提供的以下转换集来自 TensorFlow Transforms (TFT) 库。TFT 提供了针对机器学习任务的专门处理模块。有关这些转换的信息,请参阅 TensorFlow 文档中的 模块:tft。
转换名称 | 描述 |
---|---|
ApplyBuckets | 请参阅 TensorFlow 文档中的 tft.apply_buckets 。 |
ApplyBucketsWithInterpolation | 请参阅 TensorFlow 文档中的 tft.apply_buckets_with_interpolation 。 |
BagOfWords | 请参阅 TensorFlow 文档中的 tft.bag_of_words 。 |
Bucketize | 请参阅 TensorFlow 文档中的 tft.bucketize 。 |
ComputeAndApplyVocabulary | 请参阅 TensorFlow 文档中的 tft.compute_and_apply_vocabulary 。 |
DeduplicateTensorPerRow | 请参阅 TensorFlow 文档中的 tft.deduplicate_tensor_per_row 。 |
HashStrings | 请参阅 TensorFlow 文档中的 tft.hash_strings 。 |
NGrams | 请参阅 TensorFlow 文档中的 tft.ngrams 。 |
ScaleByMinMax | 请参阅 TensorFlow 文档中的 tft.scale_by_min_max 。 |
ScaleTo01 | 请参阅 TensorFlow 文档中的 tft.scale_to_0_1 。 |
ScaleToGaussian | 请参阅 TensorFlow 文档中的 tft.scale_to_gaussian 。 |
ScaleToZScore | 请参阅 TensorFlow 文档中的 tft.scale_to_z_score 。 |
TFIDF | 请参阅 TensorFlow 文档中的 tft.tfidf 。 |
I/O 要求
MLTransform
类的输入必须是字典。MLTransform
输出一个带有转换元素的 BeamRow
对象。- 输出
PCollection
是一个模式PCollection
。输出模式包含转换后的列。
工件
工件是数据转换创建的附加数据元素。工件示例包括来自 ScaleTo01
转换的最小值和最大值,或来自 ScaleToZScore
转换的平均值和方差。
在 MLTransform
类中,write_artifact_location
和 read_artifact_location
参数决定 MLTransform
类是创建工件还是检索工件。
写入模式
当您使用 write_artifact_location
参数时,MLTransform
类将在数据集上运行指定的转换,然后从这些转换创建工件。工件存储在您在 write_artifact_location
参数中指定的 location 中。
当您想要存储转换结果以备将来使用时,写入模式很有用。例如,如果您对不同的数据集应用相同的转换,请使用写入模式以确保转换参数保持一致。
以下示例演示了写入模式的工作原理。
ComputeAndApplyVocabulary
转换会生成一个词汇表文件,其中包含在整个数据集上生成的词汇表。词汇表文件存储在write_artifact_location
参数值指定的路径中。ComputeAndApplyVocabulary
转换将词汇表的索引输出到词汇表文件。ScaleToZScore
转换计算整个数据集的均值和方差,然后使用均值和方差对整个数据集进行归一化。当您使用write_artifact_location
参数时,这些值将作为tensorflow
图存储在write_artifact_location
参数值指定的路径中。您可以在读取模式下重新使用这些值,以确保将来的转换使用相同的均值和方差进行归一化。
读取模式
当您使用 read_artifact_location
参数时,MLTransform
类期望工件存在于 read_artifact_location
参数中提供的路径中。在这种模式下,MLTransform
会检索工件并在转换中使用它们。由于转换在使用读取模式时存储在工件中,因此您无需指定转换。
工件工作流
以下场景提供了一个工件的使用案例示例。
在训练机器学习模型之前,您将 MLTransform
与 write_artifact_location
参数一起使用。当您运行 MLTransform
时,它会应用对数据集进行预处理的转换。转换会生成工件,并存储在 write_artifact_location
参数值指定的路径中。
预处理完成后,您使用转换后的数据来训练机器学习模型。
训练完成后,您运行推理。您使用新的测试数据并使用 read_artifact_location
参数。通过使用此设置,您可以确保测试数据经过与训练数据相同的预处理步骤。在读取模式下,运行 MLTransform
会从 read_artifact_location
参数值指定的路径中获取转换工件。MLTransform
将这些工件应用于测试数据。
此工作流程为训练和测试数据提供了预处理步骤的一致性。这种一致性确保模型能够准确评估测试数据并保持模型性能的完整性。
使用 MLTransform 预处理数据
要使用 MLTransform
转换来预处理数据,请将以下代码添加到您的管道中
import apache_beam as beam
from apache_beam.ml.transforms.base import MLTransform
from apache_beam.ml.transforms.tft import <TRANSFORM_NAME>
import tempfile
data = [
{
<DATA>
},
]
artifact_location = tempfile.mkdtemp()
<TRANSFORM_FUNCTION_NAME> = <TRANSFORM_NAME>(columns=['x'])
with beam.Pipeline() as p:
transformed_data = (
p
| beam.Create(data)
| MLTransform(write_artifact_location=artifact_location).with_transform(
<TRANSFORM_FUNCTION_NAME>)
| beam.Map(print))
替换以下值
- TRANSFORM_NAME:要使用的 转换 的名称。
- DATA:要转换的输入数据。
- TRANSFORM_FUNCTION_NAME:您在代码中为转换函数分配的名称。
有关更多示例,请参阅 MLTransform 用于数据处理,位于 转换目录 中。
上次更新于 2024/10/31
您找到所需的所有内容了吗?
所有内容都实用且清晰吗?您想更改任何内容吗?请告诉我们!