【问题标题】:Tensorflow Data Validation does not identify anomalies in numerical featuresTensorflow 数据验证无法识别数值特征中的异常
【发布时间】:2020-05-22 14:30:00
【问题描述】:

我一直在测试 Tensorflow 数据验证(版本 0.22.0)以在我当前的 ML 管道中使用,我注意到它在数值特征方面没有任何异常。例如,

> import pandas as pd  
> import pyarrow 
> import tensorflow as tf 
> import apache_beam as beam 
> import apache_beam.io.iobase 
> import tensorflow_data_validation as tfdv 
> print('TFDV version: {}'.format(tfdv.version.__version__))
> 
> train_df = pd.DataFrame({
>     'FeatA' : ['A'] * 1000,
>     'FeatB' : ['B'] * 1000,
>     'FeatC' : [10] * 1000,
>     'FeatD' : [50.2] * 1000 })
> 
> eval_df = pd.DataFrame({
>     'FeatA' : ['A1'] * 1000,
>     'FeatB' : ['B1'] * 1000,
>     'FeatC' : [4] * 1000,
>     'FeatD' : [200.43] * 1000 })
> 
> train_stats  = tfdv.generate_statistics_from_dataframe(train_df)
> schema = tfdv.infer_schema(statistics = train_stats) 
> eval_stats = tfdv.generate_statistics_from_dataframe(eval_df) 
> anomalies = tfdv.validate_statistics(statistics = eval_stats, schema = schema)
> tfdv.display_anomalies(anomalies)

仅在分类异常的 FeatAFeatB 中检测到异常。但是在 FeatCFeatD 中,TFDV 没有检测到任何东西。

结果显示在这个image

我也尝试过设置偏斜和漂移比较器,但没有任何变化。我想这与自动生成的模式有关,它没有为数字特征映射域。

有人知道如何让 TFDV 用于数值特征吗?

【问题讨论】:

  • 这是一个很好的观察。将进一步调查并通知您。
  • 有关于这个问题的消息吗?谢谢!!
  • 它在 Github 问题中被跟踪,github.com/tensorflow/data-validation/issues/131
  • 相关评论:- github.com/tensorflow/data-validation/issues/… kennysong 回答:- “您需要在 Feature 中手动设置内联 FloatDomain。它不是由 infer_schema() 自动生成的。tfdv.get_feature(schema, 'FeatC ').float_domain.name = 'FeatC' tfdv.get_feature(schema, 'FeatC').float_domain.min = 0.0 tfdv.get_feature(schema, 'FeatC').float_domain.max = 100.0 之后,validate_statistics() 应该识别越界特征。”

标签: python-3.x tensorflow-data-validation


【解决方案1】:

我们需要对数值特征使用 jensen_shannon_divergence 偏斜比较器,对分类特征使用 infinity_norm

tfdv.get_feature(schema_updated,'SALES').skew_comparator.jensen_shannon_divergence.threshold = 0.001

skew_anomalies = tfdv.validate_statistics(statistics=new_dataset_stats, schema=schema, serving_statistics=old_dataset_stats) display_anomalies(skew_anomalies)

【讨论】:

    【解决方案2】:

    通常,tfdv 不会为数值推断域,您现在有 3 种可能的解决方案:

    1- 将数据框列的类型更改为 str,因此它将被视为字节功能。

    2- 为您的功能添加一个 int_domain(FeatD 的 float_domain)并确定您想要的最小值和最大值

    3- 仅对于 int 功能,您可以将 int_domain.is_categorical 设置为 True,然后使用漂移/偏斜比较器。您将能够在 Top k 值中检测到新值。

    【讨论】:

    • 我将feature.int_domain.is_categorical = True 添加到一个 INT 类型的分类特征中。然后使用feature.drift_comparator.infinity_norm.threshold = 0.01 检测漂移。它显示没有发现异常。但是当我将该特征转换为字符串时,它检测到一个具有高 Linfty 距离的异常。因此,解决方案 3 不起作用。有什么建议吗?
    【解决方案3】:

    正如@durga 所解释的,TFDV 添加了一个新功能,允许我们检测数字特征的偏差。在 skew_comarator 中指定 jensen_shannon_divergence 阈值而不是 infinity_norm 阈值。

    例子:

    tfdv.get_feature(schema, 'total_actions').skew_comparator.jensen_shannon_divergence.threshold = 0.01
    

    如果要检查最大值和最小值范围,则需要在 Feature 中手动设置内联 FloatDomain/IntDomain。它不是由 infer_schema() 自动生成的:

    例子:

    tfdv.get_feature(schema, 'total_actions').int_domain.name = 'total_actions'
    tfdv.get_feature(schema, 'total_actions').int_domain.min = 0
    tfdv.get_feature(schema, 'total_actions').int_domain.max = 1400
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2022-01-07
      • 2021-05-03
      • 2022-01-02
      • 2017-10-20
      • 1970-01-01
      • 2017-05-17
      相关资源
      最近更新 更多