TensorFlow Data Validation: データの確認と分析
データが TFX のパイプラインに投入されると、データの分析と変換に TFX コンポーネント使用できるようになります。これらのツールは、モデルをトレーニングする前であっても使用することが可能です。
データを分析および変換する理由はいくつもあります。
データ内の問題を見つけるため。一般的な問題には次のようなものがあります。
値が空の特徴量があるなど、欠損したデータ
ラベルが特徴量として処理されている。この場合、モデルはトレーニング中に正解を確認してしまいます。
期待する範囲から外れた値のある特徴量
異常なデータ
転移学習で作成されたモデルには、トレーニングデータと一致しない前処理があります。
より効果的な特徴量を構築するため。たとえば、次の項目を特定できます。
特に有用な特徴量
冗長特徴量
広い値域に渡って分布しているため、学習速度が遅くなる可能性のある特徴量
予測情報がほとんどない、または一意でない特徴量
TFX ツールはデータ内のバグの検出と特徴量エンジニアリングの両方に役立ちます。
TensorFlow Data Validation
概要
TensorFlow Data Validation はトレーニングデータやサービングデータの特異点を特定し、そのデータの検査によって自動的にスキーマを作成することができます。データに含まれるさまざまな種類の特異点を検出するようにコンポーネントを構成することが可能で、次の項目を実行できます。
データの統計量を、ユーザーの期待を記述したスキーマと比較することで妥当性チェックを実行する。
トレーニングデータとサービングデータの例を比較して、トレーニング/サービングスキューを検出する。
データの系列を確認することで、データドリフトを検出する。
これらの機能について、個別に説明します。
スキーマに基づく Example の検証
TensorFlow Data Validation は、データの統計をスキーマと比較することで、入力データ内の特異点を特定します。このスキーマは、入力データが満たすと期待されるデータ型やカテゴリ値といったプロパティを記述したもので、ユーザーによる変更や置換が可能です。
Tensorflow Data Validation は通常、TFX パイプラインのコンテキストで (i) ExampleGen から取得されたすべての分割、(ii) Transform により使用されるすべての変換前データ、および (iii) Transform により生成されたすべての変換後データに対して複数回呼び出されます 。Transform (ii-iii) のコンテキストで呼び出される場合、統計オプションとスキーマベースの制約は、stats_options_updater_fn
を定義することで設定できます。これは、非構造化データ (テキストデータの特徴量など) を検証するときに特に役立ちます。例については、ユーザーコードを参照してください。
スキーマの高度な機能
このセクションでは特殊なセットアップに役立つ、高度なスキーマの構成について説明します。
スパースな特徴量
Example に現れるスパースな特徴量をエンコードすると、通常、すべての Example で同じ値を取ることが期待される複数の特徴量が導入されます。たとえば、次に示すスパースな特徴量があるとします。
WeightedCategories = [('CategoryA', 0.3), ('CategoryX', 0.7)]
この特徴量は、インデックスと値に個別の特徴量を使用することでエンコードできます。
WeightedCategoriesIndex = ['CategoryA', 'CategoryX']
WeightedCategoriesValue = [0.3, 0.7]
ただし、インデックスと値特徴量の価数はすべての Example で一致する必要があります。この制約は sparse_feature を定義することで、スキーマに明示的に指定できます。
sparse_feature {
name: 'WeightedCategories'
index_feature { name: 'WeightedCategoriesIndex' }
value_feature { name: 'WeightedCategoriesValue' }
}
スパースな特徴量の定義では、スキーマに存在する特徴量から、インデックスに1つ以上、値に1つを指定する必要があります。スパースな特徴量を明示的に指定すると、TFDV は参照されている特徴量の値がすべて一致することを確認できます。
いくつかのユースケースでは特徴量間に値に関する同様の制限が導入されることがありますが、必ずしもスパースな特徴量としてエンコードする必要はありません。そのようなケースでスパースな特徴量を用いることは妨げにはなりませんが、理想的ではありません。
スキーマの環境設定
データの検証において、デフォルトではパイプラインのすべての Example が単一のスキーマに準拠していると想定しています。場合によっては、スキーマにバリエーションが必要になるケースがあります。たとえば、ラベルとして用いられる特徴量はトレーニング時には与えられ (そして検証される必要があり) ますが、本番環境では与えられません。環境設定、特にdefault_environment()
、in_environment()
、not_in_environment()
はこのような要求を満たすために利用できます。
例として、'LABEL' という特徴量はトレーニング時には必要なものの、本番環境では欠損していることが期待される場合を考察しましょう。これは次のようにして表現できます。
スキーマで異なる 2 つの環境 ["SERVING", "TRAINING"] を定義し、'LABEL' を "TRAINING" 環境にだけ関連付けます。
トレーニングデータを "TRAINING" 環境に、サービングデータを "SERVING" 環境に関連付けます。
スキーマ生成
入力データのスキーマは TensorFlow Schema のインスタンスとして指定できます。
スキーマを初めから手動で構成する代わりに、TensorFlow Data Validation の自動スキーマ構成機能を利用することができます。具体的には、パイプラインで利用可能なトレーニングデータをもとに計算された統計量に基づいて、TensorFlow Data Validation が自動的に構築したスキーマを最初のバージョンとして利用することができます。ユーザーは単に、自動的に生成されたスキーマを確認し、必要であれば修正し、バージョン管理システムに登録して、さらなる検証のためにパイプラインに明示的に組み込むだけが必要となります。
TFDV にはスキーマを自動的に生成するための infer_schema()
が含まれています。これは次のようにして利用できます。
これは次のルールに従って自動的なスキーマ生成を実行します。
スキーマがすでに自動生成されている場合、それがそのまま使われます。
それ以外の場合、TensorFlow Data Validation は利用可能なデータの統計量を確認し、データにあったスキーマを計算します。
注意: 自動生成されたスキーマはベストエフォートのもので、データの基本的なプロパティだけを推論しようとします。ユーザーが確認し、必要に応じて修正することが期待されています。
トレーニング/サービングスキューの検出
概要
TensorFlow Data Validation は、トレーニングデータとサービングデータ間の分布の歪みを検出できます。分布の歪みは、トレーニングデータの特徴量値の分布がサービングデータのものと大幅に異なる場合に発生します。分布に歪みが生じる主な原因の 1 つに、対象のコーパスにおける初期データの欠落を克服するために、トレーニングデータの生成に完全に異なるコーパスが使用されることが挙げられます。また、トレーニングするサービングデータのサブサンプルのみを選択するという、仕組みに存在する欠陥が別の原因として挙げられます。
シナリオの例
注意: たとえば、データに出現しなかったスライスを補間するために、アップウェイティングもダウンサンプリングも適切に行われなかった、バイアスの生じたサンプリングが用いられた場合、トレーニングデータとサービングデータの間で特徴量の分布に大きな偏りが生じるでしょう。
トレーニング/サービススキュー検出に関する詳細は、TensorFlow Data Validation 入門ガイドをご覧ください。
ドリフト検出
ドリフト検出は、トレーニング日数が異なるなど、連続したスパンのデータ(スパン N とスパン N+1 間)でサポートされています。ドリフトは、カテゴリ特徴量については L-無限大距離 として表現され、数値特徴量については ジェンセン・シャノン情報量に近似されます。ドリフトが許容を超える際に警告を受け取れるよう、しきい値距離を設定することが可能です。正しい距離の設定は一般的に、ドメイン知識や事件が必要な反復プロセスになります。
ドリフト検出の構成に関する詳細は、TensorFlow Data Validation 入門ガイドをご覧ください。
データの確認のための可視化の利用
TensorFlow Data Validation は特徴量の分布を可視化するためのツールも提供しています。Facets を使って Jupyter ノートブック上でこれらの分布を確認することで、データに関する一般的な問題を確認することができます。
疑わしい分布の識別
Facets Overview の表示を用いて特徴量の疑わしい分布を探すことにより、データの一般的なバグを特定できます。
不均衡データ
不均衡な特徴量とは、単一の値のみが圧倒的に多いような特徴量を指します。不均衡な特徴量は自然に出現するものですが、ある特徴量が常に同じ値である場合は、データにバグがあるかもしれません。Facets Overview で不均衡な特徴量を検出するには、"Sort by" ドロップダウンから "Non-uniformity" を選択してください。
それぞれの特徴量の型ごとに、最も不均衡な特徴量がリストのトップに表示されます。一例として、次のスクリーンショットは "Numeric Feature" リストから、最初の特徴量はすべての値がゼロであること、2 番めの特徴量は極めて不均衡であることを示しています。
一様分布に従うデータ
一様分布に従う特徴量はすべての取りうる値が同じ程度の頻度で出現する特徴量です。不均衡データと同様に、この分布は自然に生じます。しかし、データのバグによっても引き起こされます。
Facets Overview を用いて一様分布に従う特徴量を検出するには、次のように "Sort by" ドロップダウンから "Non-uniformly" を選択し、"Reverse order" のチェックボックスをオンにします。
文字列データは、一意な値が 20 個以下の場合には棒グラフを用い、20 個を超える場合には累積分布グラフを用いて表されます。したがって文字列データの場合、一様分布は上の図のような平坦な棒グラフか、次のような直線として現れます。
一様分布を生成しうるバグの例
一様分布を生成する一般的なバグを次に示します。
日付のような文字列でないデータを文字列として扱っている。たとえば、datetime 型の特徴量が "2017-03-01-11-45-03" のように表現した、多くの一意な値が現れます。この一意な値は一様に分布されます。
"行数" などのインデックスが特徴量として含まれている。この場合も多くの一意な値が現れます。
データの欠損
特徴量の値が完全に欠落しているかを調べるには次を行います。
"Sort by" ドロップダウンから "Amount missing/zero" を選択します。
"Reverse order" チェックボックスをオンにします。
"missing" 列を見て、特徴量に含まれる欠損値の割合を確認します。
データのバグは特徴量に含まれる不完全な値の原因になりえます。たとえば、特徴量のリストには常に 3 つの値が入っていることを期待していたものの、実際には 1 つの値しか入っていないことを見つけたとします。ほかに不完全な値が発生していたり、特徴量のリストに期待するだけの数の要素が含まれていないものを見つける場合には、次のようにします。
右側の "Chart to show" ドロップダウンから、"Value list length" を選択します。
それぞれの特徴量の行の右側に表示されたグラフを確認します。グラフはその特徴量に含まれるリストの長さの範囲を表しています。たとえば、次のスクリーンショットの中でハイライトされている行は、特徴量中に長さゼロのリストが含まれていることを示しています。
特徴量間のスケールの大きな違い
特徴量のスケールが大きく異なる場合、モデルの学習が困難である可能性があります。たとえば、ある特徴量は 0 から 1 の間の値を取り、別の特徴量は 0 から 1,000,000,000 の間の値を取るような場合、スケールに大きな違いがあると言えます。大きく異なるスケールを見つけるには、 "max" や "min" 列を特徴量間で比較してください。
このような幅広い変動を減らすには、特徴量の正規化を検討してください。
無効な値のあるラベル
TensorFlow Estimator でラベルとして用いることのできるデータの型には制約があります。たとえば、二値分類器は通常 {0, 1} のラベルでのみ動作します。
Estimator の要件を満たしているか確認するには、Facets Overview のラベルの値を確認してください。