此页面由 Cloud Translation API 翻译。
Switch to English

TensorFlow Data Validation: Checking and analyzing your data

一旦数据进入TFX管道,就可以使用TFX组件进行分析和转换。您甚至可以在训练模型之前使用这些工具。

分析和转换数据的原因很多:

  • 在数据中查找问题。常见问题包括:
    • 缺少数据,例如具有空值的要素。
    • 标签被视为特征,因此您的模型可以在训练期间窥视正确的答案。
    • 值超出您期望范围的功能。
    • 数据异常。
  • 设计更有效的功能集。例如,您可以识别:
    • 特别有用的功能。
    • 冗余功能。
    • 功能范围千差万别,可能会影响学习速度。
    • 具有很少或没有唯一预测信息的功能。

TFX工具既可以帮助发现数据错误,又可以帮助进行功能设计。

TensorFlow数据验证

总览

TensorFlow数据验证可识别训练和提供数据中的异常,并可以通过检查数据自动创建架构。可以将组件配置为检测数据中不同类别的异常。它可以

  1. 通过将数据统计信息与编写用户期望的架构进行比较,以执行有效性检查。
  2. 通过比较训练和提供数据中的示例来检测训练提供的偏斜。
  3. 通过查看一系列数据来检测数据漂移。

我们独立记录以下每个功能:

基于架构的示例验证

TensorFlow数据验证通过将数据统计信息与模式进行比较来识别输入数据中的任何异常。该架构将输入数据期望满足的属性(例如数据类型或分类值)进行编码,并且可以由用户修改或替换。

高级架构功能

本节介绍可以帮助进行特殊设置的更高级的架构配置。

稀疏特征

在示例中对稀疏特征进行编码通常会引入多个特征,这些特征预期对于所有示例都具有相同的化合价。例如,稀疏特征:


WeightedCategories = [('CategoryA', 0.3), ('CategoryX', 0.7)]
将使用单独的索引和值特征:

WeightedCategoriesIndex = ['CategoryA', 'CategoryX']
WeightedCategoriesValue = [0.3, 0.7]
进行编码,并限制所有示例的索引和值特征的效价均应匹配。通过定义sparse_feature,可以在架构中明确显示此限制:

sparse_feature {
  name: 'WeightedCategories'
  index_feature { name: 'WeightedCategoriesIndex' }
  value_feature { name: 'WeightedCategoriesValue' }
}

稀疏特征定义需要一个或多个索引和一个值特征,它们引用模式中存在的特征。明确定义稀疏特征使TFDV能够检查所有引用特征的化合价是否匹配。

某些用例在功能之间引入了相似的价位限制,但不一定对稀疏功能进行编码。使用稀疏功能应该可以解除对您的限制,但这并不理想。

模式环境

默认情况下,验证假定管道中的所有示例均遵循单个模式。在某些情况下,有必要引入轻微的模式变化,例如,在训练过程中需要使用用作标签的功能(并应进行验证),但在投放过程中会丢失这些功能。环境可以用来表达这种要求,特别是default_environment()in_environment()not_in_environment()

例如,假设需要一个名为“ LABEL”的功能进行培训,但预计该功能将丢失。这可以表示为:

  • 在模式中定义两个不同的环境:[“ SERVING”,“ TRAINING”]并将“ LABEL”仅与环境“ TRAINING”相关联。
  • 将训练数据与环境“ TRAINING”关联,将服务数据与环境“ SERVING”关联。
模式生成

输入数据模式被指定为TensorFlow Schema的实例。

开发人员可以依靠TensorFlow Data Validation的自动模式构建,而不必从头开始手动构建模式。具体来说,TensorFlow数据验证基于在管道中可用的训练数据上计算出的统计信息自动构建初始模式。用户可以简单地查看此自动生成的模式,根据需要对其进行修改,将其检入版本控制系统,然后将其显式推送到管道中以进行进一步的验证。

TFDV包含infer_schema()以自动生成模式。例如:

schema = tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)

这将根据以下规则触发自动模式生成:

  • 如果已经自动生成模式,则按原样使用它。

  • 否则,TensorFlow数据验证将检查可用的数据统计信息并为该数据计算合适的模式。

注意:自动生成的架构是尽力而为的,仅尝试推断数据的基本属性。预期用户会根据需要对其进行检查和修改。

培训服务倾斜检测

总览

训练服务偏斜检测器作为TensorFlow数据验证的子组件运行,并检测训练数据和服务数据之间的偏斜。

偏斜类型

根据不同的生产后期说明,我们将各种类型的偏斜减少到四个关键类别。接下来,我们讨论这些类别中的每一个,并提供发生它们的示例场景。

  1. 当训练数据和服务数据不符合同一模式时,就会发生模式偏斜 。由于架构描述了数据的逻辑属性,因此训练数据和服务数据都应遵循相同的架构。两者之间的任何预期偏差(例如仅在训练数据中存在但在服务中不存在的标签功能)应通过架构中的环境字段指定。

    由于训练数据的生成是一个批量数据处理步骤,而(在线)服务数据的生成通常是对延迟敏感的步骤,因此通常会有不同的代码路径来生成训练和服务的数据。这是个错误。这两个代码路径之间的任何差异(由于开发人员错误或二进制版本不一致)都可能导致架构偏斜。

    示例场景

    鲍勃(Bob)想向模型添加一个新功能,并将其添加到训练数据中。离线培训指标看起来不错,但在线指标则差得多。经过数小时的调试,Bob意识到他忘记在服务代码路径中添加相同的功能。该模型对该新功能给予了高度重视,并且由于该功能在投放时间不可用,因此产生了较差的预测,从而导致较差的在线指标。

  2. 当模型训练的特征值与服务时看到的特征值不同时,就会发生特征偏斜 。发生这种情况有多种原因,其中包括:

    • 如果在训练和服务时间之间修改了提供某些功能值的外部数据源。

    • 用于在训练和服务之间生成功能的逻辑不一致。例如,如果仅在两个代码路径之一中应用某些转换。

    示例场景

    爱丽丝有一个连续的机器学习管道,其中记录了今天的服务数据并用于生成第二天的训练数据。为了节省空间,她决定只记录服务时间的视频ID,并在训练数据生成期间从数据存储中获取视频属性。

    这样一来,她无意中引入了一个偏斜,这对于新上传的和病毒式视频特别危险,因为它们的观看时间可能会在服务时间和训练时间之间发生很大变化(如下所示)。

    
     Serving Example           Training Example
     -------------------------  -------------------------
     features {                 features {
       feature {                  feature {
         key "vid"                  key "vid"
         value { int64_list {       value { int64_list {
           value 92392               value 92392
         } }                         } }
       }                          }
       feature {                  feature {
         key "views"               key "views"
         value { int_list {       value { bytes_list {
           value "10"                value "10000"  # skew
         } }                         } }
       }                          }
     }                          }
    

    这是特征偏斜的一个实例,因为训练数据看到的视图数量膨胀。

  3. 当训练数据的特征值分布与服务数据明显不同时,就会发生分布偏斜 。分布偏斜的主要原因之一是使用完全不同的语料库来训练数据生成,以克服所需语料库中缺少初始数据的情况。另一个原因是采样机制错误,该机制仅选择了要训练的服务数据的子样本。

    示例场景

    例如,为了补偿代表性不足的数据切片,如果在没有适当地对下采样示例进行适当加权的情况下使用偏向采样,则训练和服务数据之间的特征值分布会明显偏斜。

  4. 计分/服务偏斜更难检测,仅在实际打分的示例中有一部分会发生。由于标签仅适用于所提供的示例,而不适用于评分示例,因此仅将这些示例用于培训。这隐含地导致模型对打分的示例进行错误的预测,因为它们在训练数据中的代表性逐渐下降。

    示例场景

    考虑一个投放前10个广告的广告系统。在这10个广告中,用户只能点击其中一个。这些送达的示例中的所有10个都用于第二天的训练-1个阳性和9个阴性。但是,在投放时,训练有素的模型用于为100则广告打分。其余90个从未投放的广告会从训练数据中隐式删除。这会导致隐式的反馈循环,这会进一步错误预测排名较低的事物,因为在训练数据中看不到它们。

你为什么要在乎呢?

偏斜很难检测,并且在许多ML管道中都很普遍。有几起事件导致性能下降和收入损失。

目前支持什么?

当前,TensorFlow数据验证支持模式倾斜,功能倾斜和分布倾斜检测。

漂移检测

对于分类特征和连续的数据跨度之间(即,跨度N和跨度N + 1之间),例如在训练数据的不同天之间,支持漂移检测。我们用L-infinity距离表示漂移,您可以设置阈值距离,以便在漂移高于可接受范围时收到警告。设置正确的距离通常是一个反复的过程,需要领域知识和实验。

使用可视化检查数据

TensorFlow数据验证提供了用于可视化特征值分布的工具。通过使用Facets在Jupyter笔记本中检查这些分布,您可以发现数据的常见问题。

功能统计

识别可疑的分布

通过使用“构面概述”显示来查找特征值的可疑分布,可以识别数据中的常见错误。

数据不平衡

不平衡特征是一个值占主导的特征。不平衡的功能可以自然发生,但如果功能始终具有相同的值,则可能会出现数据错误。要在“构面概述”中检测不平衡的特征,请从“排序依据”下拉列表中选择“非均匀性”。

最不平衡的功能将列在每个功能类型列表的顶部。例如,以下屏幕截图在“数值功能”列表的顶部显示了一个全为零的功能,以及另一个高度不平衡的功能:

可视化不平衡数据

均匀分布的数据

均匀分布的特征是所有可能的值都以接近相同的频率出现的特征。与不平衡数据一样,这种分布可以自然发生,但也可能由数据错误引起。

要在“构面概述”中检测均匀分布的特征,请从“排序依据”下拉列表中选择“非均匀性”,然后选中“逆序”复选框:

统一数据的直方图

如果唯一值少于20个,则使用条形图表示字符串数据;如果唯一值大于20个,则使用累积分布图表示。因此,对于字符串数据,均匀分布可以显示为扁平条形图(如上图)或直线(如下图):

折线图:统一数据的累积分布

可以产生均匀分布数据的错误

以下是一些可以产生均匀分布的数据的常见错误:

  • 使用字符串表示非字符串数据类型,例如日期。例如,对于日期时间功能,您将具有许多唯一的值,其表示形式为“ 2017-03-01-11-45-03”。唯一值将均匀分布。

  • 包括诸如“行号”之类的索引作为特征。同样在这里您有许多独特的价值。

缺失数据

要检查某个功能是否完全缺失值:

  1. 从“排序依据”下拉列表中选择“缺少的金额/零”。
  2. 选中“反向订单”复选框。
  3. 查看“缺失”列,以查看具有要素缺失值的实例的百分比。

数据错误也可能导致要素值不完整。例如,您可能希望某个要素的值列表始终包含三个元素,并且发现有时它只有一个。要检查不完整的值或要素值列表没有预期数量的元素的其他情况:

  1. 从右侧的“显示图表”下拉菜单中选择“值列表长度”。

  2. 查看每个功能行右侧的图表。该图表显示了功能值列表长度的范围。例如,下面的屏幕快照中突出显示的行显示了具有一些零长度值列表的功能:

具有零长度要素值列表的要素的构面概览显示

要素之间的比例差异很大

如果您的功能在规模上差异很大,则该模型可能难以学习。例如,如果某些功能的范围从0到1不等,而另一些功能的范围从0到1,000,000,000不等,那么您在规模上会有很大的差异。比较各个要素的“最大”和“最小”列,以找到变化范围很大的比例尺。

考虑将特征值标准化以减少这些较大的差异。

带有无效标签的标签

TensorFlow的估算器对他们接受为标签的数据类型有限制。例如,二进制分类器通常仅与{0,1}标签一起使用。

在“构面概述”中检查标签值,并确保它们符合估算器要求