表形式データのデータ分割

データセットを使用して AutoML モデルをトレーニングすると、データはトレーニング、検証、テストの 3 つに分割されます。データ分割を作成する際の主な目標は、テストセットが本番環境のデータを正確に表すようにすることです。この目標が達成されると、評価指標は、モデルが実際の環境でどのような結果を出せるかを正確に示すようになります。

このページでは、Vertex AI がデータのトレーニング、検証、テストセットを使用して AutoML モデルをトレーニングする方法と、これらの 3 つのセット間でデータを分割する方法をどのように制御するかについて説明します。分類と回帰のデータ分割アルゴリズムは、予測のデータ分割アルゴリズムとは異なるものです。

分類と回帰のためのデータ分割

データ分割の用途

データ分割は、トレーニング プロセスで次のように使用されます。

  1. モデルの試行

    トレーニング セットは、さまざまな前処理、アーキテクチャ、ハイパーパラメータ オプションの組み合わせを使用してモデルをトレーニングするために使用されます。これらのモデルは検証セットに基づいて品質が評価され、さらに別のオプションの組み合わせの探索につながります。この検証セットは、トレーニング中の定期的な評価から最適なチェックポイントを選択するためにも使用されます。以下で説明するように、並列調整フェーズで決定された最適なパラメータとアーキテクチャが 2 つのアンサンブル モデルのトレーニングに使用されます。

  2. モデルの評価

    Vertex AI は、トレーニング データと検証セットをトレーニング データとして使用して、評価モデルをトレーニングします。Vertex AI は、テストセットを使用して、このモデルの最終モデル評価指標を生成します。このプロセスでテストセットが使用されるのはこれが初めてです。この方法により、最終的なトレーニング済みモデルが本番環境でどの程度的確な結果を出せるかを、最終的な評価指標が偏りなく反映しているかが確認されます。

  3. モデルのサービング

    トレーニング データの量が最大になるように、トレーニング セット、検証セット、テストセットを使用してモデルがトレーニングされます。このモデルは、オンライン予測バッチ予測のリクエストに使用するモデルです。

デフォルトのデータ分割

デフォルトでは、Vertex AI はランダム分割アルゴリズムを使用して、データを 3 つのデータ分割に分割します。Vertex AI はトレーニング データの 80% をトレーニング セット、10% を検証セット、10% をテストセットにランダムに選択します。次の場合は、デフォルトの分割をおすすめします。

  • 時間とともに変化しない。
  • 相対的にバランスが取れている。
  • 本番環境での予測に使用されるデータと同様に分布している。

デフォルトのデータ分割を使用するには、Google Cloud コンソールでデフォルト値をそのまま使用するか、API の split フィールドを空白のままにします。

データ分割を制御する方法

どの分割に対してどの行を選択するかを制御するには、次のいずれかの方法を使用します。

  • ランダム分割: 分割の割合を設定し、データ行をランダムに割り当てます。
  • 手動分割: データ分割列のトレーニング、検証、テストに使用する特定の行を選択します。
  • 時系列分割: [時間] 列の時間でデータを分割します。

このオプションからいずれか 1 つだけを選択します。選択はモデルのトレーニングの際に行います。 オプションによっては、トレーニング データ(データ分割列や時間列など)の変更が必要なものがあります。データ分割オプション用のデータ含める場合には、そうしたオプションを使用する必要はありません。モデルをトレーニングするときに別のオプションを選択することもできます。

以下の場合、デフォルトの分割は最適な選択ではありません。

  • 予測モデルをトレーニングしていないが、データが時間に依存している。

    この場合、時系列分割または手動分割を使用します。これにより、最新のデータがテストセットとして使用されます。

  • テストデータに、本番環境を代表していない集団のデータが含まれている。

    たとえば、多数の店舗の購入データでモデルをトレーニングするとします。このモデルは本来、トレーニング データに含まれない店舗について予測を行うために使用されるものです。モデルがデータにない店舗にも対応するように汎用性を持たせるには、店舗ごとにデータセットを分離する必要があります。つまり、テストセットには検証セットと異なる店舗だけを含め、検証セットにはトレーニング セットと異なる店舗だけを含める必要があります。

  • クラスの数が不均衡である。

    トレーニング データで特定のクラスの数が別のクラスの数より多い場合、テストデータに少数派の方のクラスのサンプルを手動で増やす必要があります。Vertex AI では層化サンプリングは行われないため、テストセットに含まれている少数派のクラスのサンプル数がわずか数個、場合によってゼロということもあります。

ランダム分割

ランダム分割は、「数学的分割」または「部分分割」とも呼ばれます。

デフォルトでは、トレーニング、検証、テストセットに使用されるトレーニング データの割合はそれぞれ 80、10、10 です。Google Cloud コンソールを使用している場合は、割合を合計で 100 までの任意の値に変更できます。Vertex AI API を使用する場合は、合計で 1.0 になるような分割値を使用します。

割合(比率)を変更するには、FractionSplit オブジェクトを使用して比率を定義します。

データ分割の行は、ランダムであっても確定的な方法で選択されます。生成されたデータ分割の構成が適切でない場合は、手動分割を使用するか、トレーニング データを変更する必要があります。同じトレーニング データを使用して新しいモデルをトレーニングしても、データ分割は同じになります。

手動分割

手動分割は「事前定義分割」とも呼ばれます。

データ分割列を使用すると、トレーニング、検証、テストのそれぞれに使用する行を選択できます。トレーニング データを作成する場合、列を追加して、そこに次のいずれかの値(大文字小文字の区別あり)を含めることができます。

  • TRAIN
  • VALIDATE
  • TEST
  • UNASSIGNED

この列の値は、次の 2 つの組み合わせのいずれかにする必要があります。

  • TRAINVALIDATETEST のすべて
  • TESTUNASSIGNED のみ

すべての行にはこの列の値が必要です。空の文字列にすることはできません。

たとえば、すべてのセットが指定されている場合:

"TRAIN","John","Doe","555-55-5555"
"TEST","Jane","Doe","444-44-4444"
"TRAIN","Roger","Rogers","123-45-6789"
"VALIDATE","Sarah","Smith","333-33-3333"

テストセットのみが指定されている場合:

"UNASSIGNED","John","Doe","555-55-5555"
"TEST","Jane","Doe","444-44-4444"
"UNASSIGNED","Roger","Rogers","123-45-6789"
"UNASSIGNED","Sarah","Smith","333-33-3333"

データ分割列には、任意の有効な列名を指定できます。変換タイプは、カテゴリ、テキスト、自動のいずれかです。

データ分割列の値が UNASSIGNED の場合、Vertex AI はその行を自動的にトレーニング セットまたは検証セットに割り当てます。

列は、モデルをトレーニングするときに、データ分割列として指定します。

時系列分割

時系列分割は、「タイムスタンプ分割」とも呼ばれます。

データが時間に依存する場合は、1 つの列を時間列として指定できます。Vertex AI は、時間列を使用してデータを分割します。最も時間の古い行はトレーニング用に、次の行が検証用に、最も時間の新しい行がテスト用に使用されます。

Vertex AI では、各行は独立した同一の分散型トレーニングのサンプルとして扱われます。時間列を設定してもこれは変わりません。時間列はデータセットの分割にのみ使用されます。

時間列を指定する場合は、データセットのすべての行に、時間列の値が入っている必要があります。検証セットとテストセットが空にならないように、時間列に十分な数の固有の値があることを確認してください。通常は、少なくとも 20 個の固有の値があれば十分です。

時間列のデータは、タイムスタンプ変換でサポートされている形式にする必要があります。ただし、時間列にはサポートされている任意の変換を行うことができます。変換は、トレーニングで列が使用される方法に影響しますが、データ分割に影響することはありません。

各セットに割り当てられるトレーニング データの割合を指定することもできます。

モデルをトレーニングするときに、列を時間列として指定します。

予測のためのデータ分割

デフォルトでは、Vertex AI は時系列分割アルゴリズムを使用して、予測データを 3 つのデータ分割に分割します。デフォルトの分割を使用することをおすすめします。ただし、どのトレーニング データ行をどの分割に使用するかを制御する場合は、手動分割を使用します。

データ分割の用途

データ分割は、トレーニング プロセスで次のように使用されます。

  1. モデルの試行

    トレーニング セットは、さまざまな前処理、アーキテクチャ、ハイパーパラメータ オプションの組み合わせを使用してモデルをトレーニングするために使用されます。これらのモデルは検証セットに基づいて品質が評価され、さらに別のオプションの組み合わせの探索につながります。この検証セットは、トレーニング中の定期的な評価から最適なチェックポイントを選択するためにも使用されます。以下で説明するように、並列調整フェーズで決定された最適なパラメータとアーキテクチャが 2 つのアンサンブル モデルのトレーニングに使用されます。

  2. モデルの評価

    Vertex AI は、トレーニング データと検証セットをトレーニング データとして使用して、評価モデルをトレーニングします。Vertex AI は、テストセットを使用して、このモデルの最終モデル評価指標を生成します。このプロセスでテストセットが使用されるのはこれが初めてです。この方法により、最終的なトレーニング済みモデルが本番環境でどの程度的確な結果を出せるかを、最終的な評価指標が偏りなく反映しているかが確認されます。

  3. モデルのサービング

    モデルは、トレーニング セットと検証セットを使用してトレーニングされます。モデルは、テストセットを使用して(最適なチェックポイントを選択するために)検証されます。損失計算の基本となるという意味では、テストセットはトレーニングされません。このモデルは、予測をリクエストするために使用するモデルです。

デフォルト分割

デフォルトの(時系列)データ分割は次のように機能します。

  1. トレーニング データは日付で並べ替えられます。
  2. 事前に定義された設定割合(80 / 10 / 10)を使用して、トレーニング データの対象となる期間が 3 つのブロック(トレーニング セットごとに 1 つ)に分割されます。
  3. 十分な履歴(コンテキスト ウィンドウ)がない行からモデルが学習できるように、各時系列の先頭に空の行が追加されます。追加される行数は、トレーニング時に設定したコンテキスト ウィンドウのサイズです。
  4. トレーニング時に設定した予測ホライズン サイズを使用して、将来のデータ(予測ホライズン)がデータセットのいずれかに完全に収まる各行が、そのセットに使用されます(データ漏洩を防ぐために、2 つのセットにまたがる予測ホライズンの行は破棄されます)。

    時系列分割図

手動分割

データ分割列を使用すると、トレーニング、検証、テストのそれぞれに使用する行を選択できます。トレーニング データを作成する場合、列を追加して、そこに次のいずれかの値(大文字小文字の区別あり)を含めることができます。

  • TRAIN
  • VALIDATE
  • TEST

すべての行にはこの列の値が必要です。空の文字列にすることはできません。

次に例を示します。

"TRAIN","sku_id_1","2020-09-21","10"
"TEST","sku_id_1","2020-09-22","23"
"TRAIN","sku_id_2","2020-09-22","3"
"VALIDATE","sku_id_2","2020-09-23","45"

データ分割列には、任意の有効な列名を指定できます。変換タイプは、カテゴリ、テキスト、自動のいずれかです。

列は、モデルをトレーニングするときに、データ分割列として指定します。

時系列間のデータ漏洩が発生しないように注意してください。