TensorFlowデータ検証:データのチェックと分析

データがTFXパイプラインに入ると、TFXコンポーネントを使用してデータを分析および変換できます。モデルをトレーニングする前でも、これらのツールを使用できます。

データを分析および変換する理由はたくさんあります。

  • データの問題を見つけるため。一般的な問題は次のとおりです。
    • 空の値を持つフィーチャなど、欠落しているデータ。
    • ラベルは機能として扱われるため、モデルはトレーニング中に正しい答えを確認できます。
    • 期待する範囲外の値を持つ機能。
    • データの異常。
    • 転送学習モデルには、トレーニングデータと一致しない前処理があります。
  • より効果的な機能セットを設計するため。たとえば、次のように識別できます。
    • 特に有益な機能。
    • 冗長機能。
    • スケールが非常に大きく異なるため、学習が遅くなる可能性がある機能。
    • 固有の予測情報がほとんどまたはまったくない機能。

TFXツールは、データのバグを見つけるのに役立つだけでなく、特徴エンジニアリングにも役立ちます。

TensorFlowデータの検証

概要

TensorFlow Data Validationは、データのトレーニングと提供における異常を識別し、データを調べることでスキーマを自動的に作成できます。コンポーネントは、データ内のさまざまなクラスの異常を検出するように構成できます。できる

  1. データ統計をユーザーの期待を体系化するスキーマと比較することにより、妥当性チェックを実行します。
  2. トレーニングとサービングデータの例を比較することにより、トレーニングサービングの偏りを検出します。
  3. 一連のデータを調べて、データのドリフトを検出します。

これらの各機能を個別に文書化します。

スキーマベースの検証例

TensorFlow Data Validationは、データ統計をスキーマと比較することにより、入力データの異常を識別します。スキーマは、データ型やカテゴリ値など、入力データが満たすことが期待されるプロパティを体系化しており、ユーザーが変更または置換できます。

Tensorflowデータ検証は通常、TFXパイプラインのコンテキスト内で複数回呼び出されます。(i)ExampleGenから取得されたすべての分割に対して、(ii)Transformによって使用されるすべての変換前データに対して、(iii)によって生成されたすべての変換後データに対して変身。 Transform(ii-iii)のコンテキストで呼び出されると、 stats_options_updater_fnを定義することにより、統計オプションとスキーマベースの制約を設定できます。これは、非構造化データ(テキスト機能など)を検証するときに特に役立ちます。例については、ユーザーコードを参照してください。

高度なスキーマ機能

このセクションでは、特別なセットアップに役立つ、より高度なスキーマ構成について説明します。

スパース機能

例でスパース機能をエンコードすると、通常、すべての例で同じ価数を持つことが期待される複数の機能が導入されます。たとえば、スパース機能:


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' }
}

スパースフィーチャ定義には、スキーマに存在するフィーチャを参照する1つ以上のインデックスと1つの値フィーチャが必要です。スパース機能を明示的に定義すると、TFDVは、参照されているすべての機能の原子価が一致することを確認できます。

一部のユースケースでは、機能間に同様の結合価制限が導入されますが、必ずしもスパース機能をエンコードする必要はありません。スパース機能を使用すると、ブロックが解除されますが、理想的ではありません。

スキーマ環境

デフォルトでは、検証では、パイプライン内のすべての例が単一のスキーマに準拠していると想定しています。場合によっては、わずかなスキーマのバリエーションを導入する必要があります。たとえば、ラベルとして使用される機能はトレーニング中に必要です(検証する必要があります)が、提供中に欠落しています。環境を使用して、このような要件を表現できます。特に、 default_environment()in_environment()not_in_environment()です。

たとえば、「LABEL」という名前の機能がトレーニングに必要であるが、提供されていないことが予想されるとします。これは次のように表すことができます。

  • スキーマで2つの異なる環境を定義します:["SERVING"、 "TRAINING"]そして、'LABEL'を環境"TRAINING"にのみ関連付けます。
  • トレーニングデータを環境「TRAINING」に関連付け、サービングデータを環境「SERVING」に関連付けます。
スキーマの生成

入力データスキーマは、TensorFlowスキーマのインスタンスとして指定されます。

開発者は、スキーマを最初から手動で構築する代わりに、TensorFlowDataValidationの自動スキーマ構築に依存できます。具体的には、TensorFlow Data Validationは、パイプラインで利用可能なトレーニングデータに対して計算された統計に基づいて初期スキーマを自動的に構築します。ユーザーは、この自動生成されたスキーマを確認し、必要に応じて変更し、バージョン管理システムにチェックインして、さらに検証するためにパイプラインに明示的にプッシュするだけです。

TFDVには、スキーマを自動的に生成するためのinfer_schema()が含まれています。例えば:

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

これにより、次のルールに基づいてスキーマの自動生成がトリガーされます。

  • スキーマがすでに自動生成されている場合は、そのまま使用されます。

  • それ以外の場合、TensorFlow Data Validationは利用可能なデータ統計を調べ、データに適したスキーマを計算します。

注:自動生成されたスキーマは最善の努力であり、データの基本的なプロパティを推測しようとするだけです。ユーザーは必要に応じてレビューおよび変更することが期待されます。

トレーニング-スキュー検出の提供

概要

TensorFlow Data Validationは、トレーニングデータとサービングデータの間の分布の偏りを検出できます。分布スキューは、トレーニングデータの特徴値の分布がサービングデータと大幅に異なる場合に発生します。分布スキューの主な原因の1つは、データ生成のトレーニングに完全に異なるコーパスを使用して、目的のコーパスの初期データの不足を克服することです。もう1つの理由は、トレーニングするサービングデータのサブサンプルのみを選択するサンプリングメカニズムの欠陥です。

シナリオ例

トレーニングサービングスキュー検出の構成については、 TensorFlowデータ検証スタートガイドを参照してください。

ドリフト検出

ドリフト検出は、トレーニングデータの異なる日の間など、データの連続するスパン間(つまり、スパンNとスパンN + 1の間)でサポートされます。カテゴリの特徴についてはL-無限距離でドリフトを表現し、数値の特徴については近似イェンセンシャノン発散を表します。ドリフトが許容範囲を超えたときに警告を受け取るように、しきい値距離を設定できます。正しい距離を設定することは、通常、ドメインの知識と実験を必要とする反復プロセスです。

ドリフト検出の構成については、 TensorFlowデータ検証スタートガイドを参照してください。

ビジュアライゼーションを使用してデータを確認する

TensorFlowデータ検証は、特徴値の分布を視覚化するためのツールを提供します。ファセットを使用してJupyterノートブックでこれらの分布を調べることにより、データに関する一般的な問題を見つけることができます。

機能統計

疑わしい分布の特定

ファセット概要表示を使用して機能値の疑わしい分布を探すことにより、データの一般的なバグを特定できます。

不均衡なデータ

不均衡な機能は、1つの値が支配的な機能です。不均衡な機能は自然に発生する可能性がありますが、機能が常に同じ値である場合は、データのバグがある可能性があります。ファセットの概要で不均衡な機能を検出するには、[並べ替え]ドロップダウンから[不均一性]を選択します。

最も不均衡な機能は、各機能タイプリストの上部に一覧表示されます。たとえば、次のスクリーンショットは、「数値機能」リストの一番上に、すべてゼロである1つの機能と、非常に不均衡な2番目の機能を示しています。

不均衡なデータの視覚化

均一に分散されたデータ

一様分布の特徴とは、すべての可能な値がほぼ同じ頻度で現れる特徴です。不均衡なデータと同様に、この分布は自然に発生する可能性がありますが、データのバグによって生成される可能性もあります。

ファセットの概要で均一に分散されたフィーチャを検出するには、[並べ替え]ドロップダウンから[不均一]を選択し、[逆順]チェックボックスをオンにします。

均一なデータのヒストグラム

文字列データは、一意の値が20以下の場合は棒グラフを使用して表され、一意の値が20を超える場合は累積分布グラフとして表されます。したがって、文字列データの場合、一様分布は、上の図のような平らな棒グラフまたは下のような直線のいずれかとして表示されます。

折れ線グラフ:均一データの累積分布

均一に分散されたデータを生成できるバグ

均一に分散されたデータを生成する可能性のある一般的なバグは次のとおりです。

  • 文字列を使用して、日付などの非文字列データ型を表します。たとえば、「2017-03-01-11-45-03」のような表現を持つ日時機能には、多くの一意の値があります。一意の値が均一に分散されます。

  • 「行番号」などのインデックスを機能として含めます。ここでも、多くの固有の値があります。

欠測データ

機能に値が完全に欠落しているかどうかを確認するには、次の手順に従います。

  1. [並べ替え]ドロップダウンから[不足している量/ゼロ]を選択します。
  2. 「逆順」チェックボックスをチェックします。
  3. 「欠落」列を見て、機能の値が欠落しているインスタンスの割合を確認します。

データのバグにより、機能値が不完全になる可能性もあります。たとえば、機能の値リストには常に3つの要素が含まれていると予想し、場合によっては1つしかないことに気付く場合があります。不完全な値や、機能値リストに期待される要素数がないその他のケースをチェックするには、次のようにします。

  1. 右側の[表示するグラフ]ドロップダウンメニューから[値リストの長さ]を選択します。

  2. 各機能行の右側にあるグラフを見てください。グラフは、機能の値リストの長さの範囲を示しています。たとえば、以下のスクリーンショットで強調表示されている行は、長さがゼロの値リストを持つ機能を示しています。

長さがゼロのフィーチャ値リストを含むフィーチャを含むファセット概要表示

機能間のスケールの大きな違い

機能の規模が大きく異なる場合、モデルの学習が困難になる可能性があります。たとえば、一部の機能が0から1まで変化し、他の機能が0から1,000,000,000まで変化する場合、スケールに大きな違いがあります。機能全体の「最大」列と「最小」列を比較して、さまざまなスケールを見つけます。

これらの幅広い変動を減らすために、機能値を正規化することを検討してください。

無効なラベルのラベル

TensorFlowのEstimatorには、ラベルとして受け入れるデータのタイプに制限があります。たとえば、バイナリ分類器は通常、{0、1}ラベルでのみ機能します。

ファセットの概要でラベル値を確認し、それらがEstimatorの要件に準拠していることを確認します。