今日のローカルTensorFlowEverywhereイベントの出欠確認!
このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorFlowデータ検証:データの確認と分析

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

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

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

TFXツールは、データのバグの発見と機能エンジニアリングの両方に役立ちます。

TensorFlowデータ検証

概要概要

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

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

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

スキーマベースの検証例

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

高度なスキーマ機能

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

スパース機能

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


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 スキーマのインスタンスとして指定されます。

開発者は、スキーマを最初から手動で構築する代わりに、TensorFlow DataValidationの自動スキーマ構築に依存できます。具体的には、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 Data Validationは、特徴値の分布を視覚化するためのツールを提供します。ファセットを使用して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要件に準拠していることを確認します