TensorFlow 数据验证简介:大规模数据理解、验证和监控
2018 年 9 月 10 日
作者:Clemens Mewald(产品经理)和 Neoklis Polyzotis(研究科学家)

今天我们发布了 TensorFlow 数据验证 (TFDV),这是一个开源库,它可以帮助开发人员理解、验证和监控他们的大规模 ML 数据。学术界和工业界都非常关注 ML 算法及其性能,但是如果输入数据错误,所有这些优化工作都将付之东流。对于可以手动检查的少量数据,理解和验证数据可能看起来像是一项微不足道的任务。然而,在实践中,数据量太大,无法手动检查,而且通常是连续不断地以大块的形式到达,因此必须自动化和扩展数据分析、验证和监控任务。

TFDV 是 TFX 平台 的一部分,该技术每天用于分析和验证 Google 的 PB 级数据。它在早期发现数据错误方面具有良好的记录,从而帮助 TFX 用户维护 ML 管道的健康状况。
图 1:TensorFlow 数据验证 用于 TFX 中的数据分析和验证

笔记本中的 TensorFlow 数据验证

在设计 TFDV 的早期,我们决定使其能够从笔记本环境中使用。我们发现,让数据科学家和工程师尽早地在他们的工作流程中使用 TFDV 库非常重要,以确保他们能够检查和验证他们的数据,即使他们只用一小部分数据进行探索。这将使后续过渡到大规模生产部署变得更加容易。

计算和可视化描述性统计

TFDV 的基础是一个强大的库,用于计算 ML 数据的描述性统计。这些统计数据用于帮助开发人员调查和了解他们的数据,以及推断一个模式(稍后会详细介绍)。

TFDV API 旨在实现与不同数据格式的连接器,并提供灵活性和可扩展性。
  • 连接器:TFDV 使用 Apache Beam 定义和处理其数据管道。因此,现有的 Beam IO 连接器 以及用户定义的 PTransforms 可以用来处理不同格式和表示形式的数据。我们提供了用于 CSV 和序列化 tf.Examples 的 TF 记录的两个帮助函数。
# compute statistics for a CSV file
train_stats = tfdv.generate_statistics_from_csv(TRAIN_DATA)
# compute statistics for TF Record files
train_stats = tfdv.generate_statistics_from_tfrecord(TRAIN_DATA)
  • 灵活性:API 还允许计算自定义统计信息(除了 TFDV 计算的标准统计信息之外),只要该计算可以用 Apache Beam 转换来表示。这些自定义统计信息会序列化到相同的 statistics.proto 中,并且可以被下游库使用。
  • 可扩展性:TFDV 创建了一个 Apache Beam 管道,该管道在笔记本环境中使用 DirectRunner 执行。相同的管道可以与其他运行器一起分发,例如,可以在 Google Cloud Platform 上使用 DataflowRunner。Apache Flink 和 Apache Beam 社区也即将完成 Flink 运行器的开发。请关注相应的 JIRA 票证Apache Beam 博客邮件列表 以获取有关 Flink 运行器可用性的通知。
这些统计信息存储在 statistics.proto 中,并且可以在笔记本中可视化。
图 2:statistics.proto 可以可视化并在行内检查(使用 Facets 概述

推断模式

根据统计信息,TFDV 会推断出一个模式(由 schema.proto 描述),该模式旨在反映数据的稳定特征。我们将在下面解释模式如何在 TFDV 中驱动数据验证。此外,这种模式格式也被用作 TFX 生态系统中其他组件的接口,例如,它可以自动化 TensorFlow Transform 中的数据解析。
# Infer schema based on statistics
schema = tfdv.infer_schema(train_stats)
# Display schema inline in table format
tfdv.display_schema(schema)
图 3:schema.proto 可以可视化并在行内检查
类似于对少量数据计算描述性统计信息,对于少量特征,编写一个描述训练数据期望值的模式似乎也是微不足道的。然而,在实践中,训练数据可能包含数千个特征。infer_schema 帮助开发人员首先编写一个模式,然后他们可以手动细化和更新该模式。

验证新数据

给定一个模式,TFDV 可以针对模式中表达的期望值验证一组新数据。
# Compute statistics over a new set of data
new_stats = tfdv.generate_statistics_from_csv(NEW_DATA)
# Compare how new data conforms to the schema
anomalies = tfdv.validate_statistics(new_stats, schema)
# Display anomalies inline
tfdv.display_anomalies(anomalies)
图 4:异常报告概述了新数据与模式之间的差异
validate_statistics 的输出存储在一个 anomalies.proto 中,并描述了数据如何偏离模式中编码的约束。开发人员可以检查此输出并采取措施来修复数据中的错误,或者如果检测到的异常是数据的自然演化(例如,分类特征中的一个新的有效字符串值),则更新模式。

生产管道中的 TensorFlow 数据验证

在笔记本环境之外,相同的 TFDV 库可以用来大规模分析和验证数据。TFDV 在 TFX 管道中的两个常见用例是连续到达的数据验证和训练/服务偏差检测。此外,对于 TensorFlow Transform 的用户,推断的模式可以用来将数据解析成 预处理函数

连续到达的数据验证

对于连续到达的数据,需要根据模式中规定的期望值验证新数据。在典型的设置中,模式在时间上保持一致,统计信息是根据新数据计算出来的,并且这些统计信息用于根据原始模式验证这些数据。如上所述,模式最初是作为一种方便的手段推断出来的,但它可以随着时间的推移而演变。
图 5:使用 validate_statistics 验证新到达数据的示意图
还可以使用 visualize_statistics 命令直观地比较来自不同数据集(或不同日期的数据)的统计信息。
图 6:使用 Facets 概述可视化来比较两个数据集。在这里,我们比较了两个日期的特征“fare”。因为 DAY2 只有 DAY1 一半的示例数量,所以我们切换到百分比。然后,我们单击“expand”放大可视化。Quantiles 视图显示,除了 DAY1 数据集中的一个异常值之外,分布是相似的。
TFDV 还可以检测训练数据连续版本之间的分布漂移。与验证的其余部分一样,关于漂移的约束可以在模式中表达。TFDV 使用这些约束来比较连续数据版本之间的统计信息。如果检测到漂移,将在生成的异常中包含相应的消息。

训练/服务偏差检测

训练/服务偏差是指用于训练模型的数据和服务系统观察到的数据之间的特征值或分布的差异。与训练数据的连续验证类似,TFDV 可以计算服务日志的统计信息并执行验证,同时考虑训练数据和服务数据之间的任何预期差异(例如,标签在训练数据中存在,但在服务日志中不存在,或者分布可能发生少量变化)。此外,Facets 可以并排显示训练数据和服务数据的统计信息,从而突出潜在的错误或漂移。
图 7:使用 validate_statistics 比较训练数据和服务数据的示意图

TFDV 和 TensorFlow Transform

TensorFlow Transform (TFT) 是一个用于 TensorFlow 的开源库,它允许用户定义预处理管道并使用大规模数据处理框架运行这些管道,同时以可以在 TensorFlow 图中运行的方式导出管道。用户通过组合模块化 Python 函数来定义管道,然后 tf.Transform 使用 Apache Beam(一个用于大规模、高效、分布式数据处理的框架)执行这些函数。

TFT 需要指定一个模式来将数据解析成张量。与手动指定模式(通过指定每个特征的类型)相比,使用 TFDV 推断的模式极大地简化了 TFT 的使用。
feature_spec = schema_utils.schema_as_feature_spec(schema).feature_spec
schema = dataset_schema.from_feature_spec(feature_spec)

如何开始使用 TensorFlow 数据验证

我们已经开源了 TFDV,并在 GitHub 上发布了它,地址为 github.com/tensorflow/data-validation,并根据 Apache 2.0 许可证发布。此版本包括一个 示例笔记本,说明如何在笔记本中使用 TFDV 库。

我们还更新了我们的 端到端示例,展示了如何将 TFDV 与 TensorFlow Transform、TensorFlow Estimators、TensorFlow Model Analysis 和 TensorFlow Serving 一起使用。我们建议阅读并尝试此示例以开始使用 TFX。

我们要感谢 Sudip Roy、Paul Suganthan、Ming Zhong 和 Martin Zinkevich 的核心贡献。我们还要感谢以下同事:Ahmet Altay、Deepak Bhaduria、Robert Bradshaw、Mike Case、Charles Chen、Yifei Feng、Chuan Yu Foo、Robbie Haertel、Abhijit Karmarkar‎、Gus Katsiapis、Lak Lakshmanan、Billy Lamberta、Raz Mathias、Kester Tong、Zohar Yahav、Xing Yan、Paul Yang、Xin Zhang、Lana Webb、Jarek Wilkiewicz‎。

下一篇文章
Introducing TensorFlow Data Validation: Data Understanding, Validation, and Monitoring At Scale

由 Clemens Mewald(产品经理)和 Neoklis Polyzotis(研究科学家)发布

今天,我们发布了 TensorFlow 数据验证 (TFDV),这是一个开源库,可以帮助开发者大规模地理解、验证和监控其 ML 数据。学术界和工业界都非常关注 ML 算法及其性能,但如果输入数据存在问题,所有这些优化努力都会白费……