Path: blob/master/site/ja/tfx/tutorials/transform/census.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
TensorFlow Transform を使用したデータの前処理
TensorFlow Extended(TFX)の特徴量エンジニアリングコンポーネント
このコラボノートブックの例は、TensorFlow Transform(tf.Transform
)を使用して、データを前処理する方法のやや高度な例を提供します。モデルのトレーニングと本番環境での推論のサービングの両方に同じコードを使用します。
TensorFlow Transform は、トレーニングデータセットのフルパスを必要とする機能の作成など、TensorFlow の入力データを前処理するためのライブラリです。たとえば、TensorFlow Transform を使用すると、次のことができます。
平均と標準偏差を使用して入力値を正規化する
すべての入力値に対して語彙を生成することにより、文字列を整数に変換する
観測されたデータ分布に基づいて、浮動小数点数をバケットに割り当てることにより、浮動小数点数を整数に変換する
TensorFlow には、単一のサンプルまたはサンプルのバッチに対する操作のサポートが組み込まれています。tf.Transform
は、これらの機能を拡張して、トレーニングデータセット全体のフルパスをサポートします。
tf.Transform
の出力は、トレーニングとサービングの両方に使用できる TensorFlow グラフとしてエクスポートされます。トレーニングとサービングの両方に同じグラフを使用すると、両方の段階で同じ変換が適用されるため、スキューを防ぐことができます。
重要なポイント: tf.Transform
とそれが Apache Beam でどのように機能するかを理解するには、Apache Beam についての知識が少し必要です。Apache Beam の基本的なコンセプトについては Beam プログラミングガイドを参照してください。
##この例で何が行われているのか
この例では、国勢調査データを含む広く使用されているデータセットを処理し、分類を行うためのモデルをトレーニングします。また、tf.Transform
を使用してデータを変換します。
重要なポイント: モデラーおよび開発者の皆さんは、このデータがどのように使用されるか、モデルの予測が引き起こす可能性のある潜在的メリット・デメリットについて考えてください。このようなモデルは、社会的バイアスと格差を拡大する可能性があります。特徴量は解決しようとする問題に関連していますか、それともバイアスを導入しますか?詳細については、機械学習における公平性についてご一読ください。
注意: TensorFlow Model Analysis は、モデルが社会的バイアスや格差をどのように強化するかを理解するなど、モデルがデータのさまざまなセグメントをどの程度適切に予測するかを理解するための強力なツールです。
TensorFlow Transform のインストール
インポートとグローバル
まず、必要なものをインポートします。
次に、データファイルをダウンロードします。
列に名前を付ける
データセットの列を参照するための便利なリストをいくつか作成します。
以下は、データの簡易プレビューです。
テストデータには、スキップする必要のあるヘッダー行が 1 行と、各行の末尾に "." があります。
###特徴量とスキーマを定義します。 入力の列の型に基づいてスキーマを定義します。 これはそれらを正しくインポートするのに役立ちます。
[オプション]tf.train.Example proto のエンコードとデコード
このチュートリアルでは、いくつかの場所で、データセットの Example を tf.train.Example
との間で変換する必要があります。
以下の非表示の encode_example
関数は、データセットの特徴量のディクショナリを tf.train.Example
に変換します。
次に、データセットの Example を Example
proto に変換できます。
また、シリアル化された Example proto のバッチをテンソルのディクショナリに変換することもできます。
一部のケースでは、ラベルが渡されないことがあるため、ラベルがオプションとなるようにエンコード関数を記述します。
Example
proto を作成する際には、単にラベルキーが含まれません。
###ハイパーパラメータの設定と基本的なハウスキーピング
以下は、トレーニングに使用される定数とハイパーパラメータです。
##tf.Transform
による前処理
###tf.Transform
preprocessing_fnを作成します。前処理関数は、tf.Transform の最も重要な概念です。前処理関数では、データセットの変換が実際に行われます。テンソルのディクショナリーを受け入れて返します。ここで、テンソルは Tensor
または SparseTensor
を意味します。通常、前処理関数の中心となる API 呼び出しには 2 つの主要なグループがあります。
TensorFlow 演算子: テンソルを受け入れて返す関数。通常は TensorFlow 演算子を意味します。これらは、生データを一度に 1 つの特徴量ベクトルで変換されたデータに変換するグラフに TensorFlow 演算子を追加します。これらは、トレーニングとサービングの両方で、すべての例で実行されます。
Tensorflow Transform アナライザー/マッパー: tf.Transform によって提供されるアナライザー/マッパーのいずれか。これらもテンソルを受け入れて返し、通常は Tensorflow 演算子と Beam 計算の組み合わせを含みますが、TensorFlow 演算子とは異なり、分析中はビームパイプラインでのみ実行され、トレーニングデータセット全体を通じた処理が必要になります。Beam 計算は(トレーニング前、分析中に)1 回だけ実行され、通常はトレーニングデータセット全体を処理します。
tf.constant
テンソルが作成され、グラフに追加されます。たとえば、tft.min
は、トレーニングデータセットのテンソルの最小値を計算します。
注意: 前処理関数をサービング推論に適用する場合、トレーニング中にアナライザーにより作成された定数は変更されません。データに傾向または季節性の要素がある場合は、それに応じて計画します。
以下は、このデータセットの preprocessing_fn
です。以下のことを実行します。
tft.scale_to_0_1
を使用して、数値特徴量を[0,1]
の範囲にスケーリングします。tft.compute_and_apply_vocabulary
を使って、カテゴリカル特徴量ごとの語彙を計算し、各入力の整数 ID をtf.int64
として返します。これは、文字列と整数のどちらのカテゴリカル入力にも適用されます。標準の TensorFlow 演算を使ってデータに手動変換を適用します。ここでは、ラベルに対して演算を適用しますが、特徴量も変換することが可能です。TensorFlow 演算は以下を実行します。
ラベルのルックアップテーブルをビルドします(
tf.init_scope
は、関数が初めて呼び出された時にのみテーブルを作成します)。ラベルのテキストを正規化します。
ラベルをワンホットに変換します。
構文
これで、すべてをまとめて Apache Beam を使用して実行する準備がほぼ整いました。
Apache Beam は、特別な構文を使用して変換を定義および呼び出します。たとえば、次の行をご覧ください。
メソッド to_this_call
が呼び出され、pass_this
というオブジェクトが渡されます。この演算は、スタックトレースで name this step
と呼ばれます。to_this_call
の呼び出しの結果は、result
に返されます。 頻繁にパイプラインのステージは次のようにチェーンされます。
そして、新しいパイプラインで始まったので、以下のように続行できます。
データを変換する
Apache Beam パイプラインでデータを変換し始める準備が整いました。
tfxio.CsvTFXIO
CSV リーダーを使用してデータを読み取ります(パイプラインでテキストの行を処理するには、代わりにtfxio.BeamRecordCsvTFXIO
を使用します)。上記で定義した
preprocessing_fn
を使ってデータの分析と変換を行います。結果を
Example
プロトのTFRecord
として書き出します。これは、後でモデルのトレーニングに使用します。
パイプラインを実行します。
出力ディレクトリを tft.TFTransformOutput
としてラップします。
ディレクトリを確認すると、以下の 3 つの項目があります。
train_transformed
とtest_transformed
データファイルtransform_fn
ディレクトリ(tf.saved_model
)transformed_metadata
次のセクションでは、これらのアーティファクトを使ってモデルをトレーニングする方法を説明します。
##前処理されたデータを使用して、tf.keras を使用してモデルをトレーニングします
tf.Transform
を使用して、トレーニングとサービングの両方に同じコードを使用し、スキューを防ぐ方法を示すためにモデルをトレーニングします。モデルをトレーニングし、トレーニングしたモデルを本番用に準備するには、入力関数を作成する必要があります。トレーニング入力関数とサービング入力関数の主な違いは、トレーニングデータにはラベルが含まれ、本番環境のデータには含まれないことです。引数と戻り値も多少異なります。
###トレーニング用の入力関数を作成します
前のセクションのパイプラインを実行すると、変換済みのデータを含む TFRecord
ファイルが作成されました。
次のコードは、tf.data.experimental.make_batched_features_dataset
と tft.TFTransformOutput.transformed_feature_spec
を使用して、データファイルを tf.data.Dataset
として読み取ります。
以下では、変換済みのデータサンプルを確認できます。education-num
や hourd-per-week
などの数値カラムは範囲 [0,1] の浮動小数点数に、文字列カラムは ID に変換されていることに注目してください。
モデルのトレーニングと評価
モデルを構築する
データセットを構築します。
モデルをトレーニングして評価します。
新しいデータを変換する
前のセクションのトレーニングプロセスでは、transform_dataset
関数の tft_beam.AnalyzeAndTransformDataset
によって生成された変換済みデータのハードコピーを使用しました。
新しいデータを操作するには、tft_beam.WriteTransformFn
が保存した最終バージョンの preprocessing_fn
を読み込む必要があります。
TFTransformOutput.transform_features_layer
メソッドは、出力ディレクトリから preprocessing_fn
SavedModel を読み込みます。
以下は、新しい未加工のバッチをソースファイルから読み込む関数です。
tft.TransformFeaturesLayer
を読み込んで、このデータを preprocessing_fn
で変換します。
tft_layer
は、特徴量のサブセットのみが渡された場合でも変換を実行できるほどスマートな関数です。たとえば、2 つの特徴量のみを渡しても、変換済みの特徴量を得ることができます。
以下はより堅牢なバージョンで、特徴量の仕様に含まれない特徴量をドロップし、提供された特徴量にラベルが存在する場合に (features, label)
ペアを返します。
次に、Dataset.map
を使用して、その変換をオンザフライで新しいデータに適用できます。
モデルをエクスポートする
トレーニング済みのモデルと、新しいデータに preporcessing_fn
を適用するメソッドの準備ができました。これらを、シリアル化された tf.train.Example
proto を入力として受け取る新しいモデルにまとめます。
モデルをビルドし、シリアル化した Example のバッチでテストランを実行します。
モデルを SavedModel としてエクスポートします。
モデルを再読み込みし、同じ Example のバッチでテストします。
##この例では、tf.Transform
を使用して国勢調査データのデータセットを前処理し、クリーンアップおよび変換されたデータを使用してモデルをトレーニングしました。また、トレーニング済みモデルを本番環境にデプロイして推論を実行する際に使用する入力関数も作成しました。トレーニングと推論の両方に同じコードを使用することで、データのスキューに関する問題を回避します。その過程で、データのクリーンアップに必要な変換を実行するための Apache Beam 変換の作成について学習しました。また、この変換されたデータを使用して、tf.keras
を使用してモデルをトレーニングする方法も確認しました。これは、TensorFlow Transform でできることのほんの一部です。tf.Transform
についての知識を深めることをお勧めします。
###トレーニング用の入力関数を作成します
###サービングするための入力関数を作成します
本番環境で使用できる入力関数を作成し、トレーニング済みのモデルをサービングできるように準備します。
###入力データを FeatureColumns でラップします。モデルは TensorFlow FeatureColumns でデータを期待します。
###モデルをトレーニング、評価、エクスポートします
###すべてをまとめます。以上で国勢調査データを前処理し、モデルをトレーニングして、サービングする準備が完了しました。次に実行します。
注意: このセルからの出力をスクロールして、プロセス全体を表示します。結果は一番下に表示されます。