トレーニング データを作成するためのベスト プラクティス

このページでは、AutoML Tables のデータセット用にデータをまとめる際に考慮すべき基本コンセプトを説明します。すべてがここで網羅されているわけではありません。

はじめに

データセットを適切に設計することで、結果として得られる機械学習モデルの品質が高まります。このページのガイドラインを使用して、データセットとモデルの品質を向上できます。

機械学習モデル用のトレーニング データを作成した経験がある場合は、行わなくてよい作業のリストを確認してください。AutoML Tables が数多くのデータ準備作業を代わりに行います。

データ準備のベスト プラクティス

ターゲットの漏出を避ける

ターゲットの漏出が起きるのは、トレーニング データに、予測を求める際には利用できない予測情報が含まれているときです。ターゲットの漏出があると、モデルは優れた評価指標を示しますが、実際のデータではパフォーマンスが悪化します。

たとえば、明日どのくらいの量のアイスクリームが売れるか知りたいとします。ターゲットとする日の気温をトレーニング データに含めることはできません。未来の正確な気温は事前にはわからないからです。しかし、前日から予測した気温は使用でき、これを予測リクエストに含められます。

トレーニング / サービング スキューを避ける

トレーニング / サービング スキューは、予測をリクエストするために使用するデータを作成するのと異なる方法でトレーニング データを作成すると起こります。

たとえば平均値を使用する場合で、トレーニングの際は 10 日間の平均を出し、予測をリクエストするときは過去 1 か月の平均を出すなどです。

一般に、トレーニング データを作成する方法とサービング データ(予測を生成するために使用するデータ)を作成する方法の間に違いがある場合は、トレーニング / サービング スキューを防ぐために確認する必要があります。

トレーニング / サービング スキューとデータ分布

トレーニング / サービング スキューは、トレーニング、検証、テストのデータ分割におけるデータ分布に基づいて発生することもあります。本番環境にデプロイされたときにモデルに示されるデータ分布と、モデルのトレーニングに使用されるデータセットのデータ分布には、多くの場合違いがあります。たとえば、本番環境では、モデルは、トレーニング中に見られるのとはまったく異なるユーザーの集団に適用されたり、最終的なトレーニング データが記録されてから 30 日後に予測に使用されたりすることがあります。

最良の結果を得るには、モデルの作成に使用されるデータ分割の分布が、トレーニング データセットと本番環境での予測に使用されるデータとの違いを正確に反映するようにします。AutoML Tables は単調でない予測を生成する可能性があります。本番環境のデータがトレーニング データとは非常に異なる分布からサンプリングされる場合、単調でない予測はあまり信頼性がありません。

さらに、本番環境のデータとトレーニング データの違いは、検証データ分割とトレーニング データ分割の違い、およびテストデータ分割と検証データ分割の違いに反映される必要があります。

たとえば、今後 30 日間にわたってユーザー ライフタイム バリュー(LTV)の予測を行う場合は、検証データ分割のデータがトレーニング データ分割のデータの 30 日後のものであり、テストデータ分割のデータが検証データ分割の 30 日後のものであることを確認します。

同様に、モデルを調整して新しいユーザーに関する一般的な予測を行う場合は、特定のユーザーのデータがトレーニング データの 1 つの分割のみに含まれるようにします。たとえば、user1 に関連するすべての行はトレーニング データ分割に含まれ、user2 に関連するすべての行は検証データ分割に含まれ、user3 に関連するすべての行はテストデータ分割に含まれるようにします。

タイムシグナルを提供する

データ内の基礎となるパターンが時間の経過とともに変化する可能性がある場合(時間内でランダムに分布していない場合)、その情報を AutoML Tables に提供するようにしてください。タイムシグナルは、次のような方法で提供できます。

  • データの各行にタイムスタンプがある場合は、その列を含めるようにし、データ型が Timestamp であり、データセットを作成するときに [時間] 列として設定されるようにしてください。この順序付けは、データを分割して、最新のデータをテストデータにし、最古のデータをトレーニング データとするために使用されます。詳細

  • [時間] 列にある個別の値が多くない場合は、[時間] 列を使用するのではなく、手動分割を使用してデータを分割する必要があります。そうしないと、各データセットで十分な行が得られず、トレーニングが失敗する可能性があります。

  • 時刻情報が単一の列に含まれていない場合は、手動データ分割を使用して最新のデータをテストデータとして使用し、最も古いデータをトレーニング データとして使用できます。

情報を必要に応じて明確化する

通常、AutoML Tables を使用してモデルを作成するときに、特徴量エンジニアリングを実行する必要はありません。ただし、特定のデータ プリミティブでは、特徴を設計することによってモデルの品質を向上させることができます。

たとえば、データに経度と緯度が含まれている場合、これらの列は数値として扱われ、特別な計算は行われません。場所や距離が問題のシグナルを出す場合は、その情報を明示的に提供する特徴を設計する必要があります。

特徴エンジニアリングが必要になることがある一部のデータ型を次に示します。

  • 経度 / 緯度
  • URL
  • IP アドレス
  • メールアドレス
  • 電話番号
  • その他の地理コード(郵便番号など)

計算データまたは集計データを行に含める

AutoML Tables は、1 行の入力データのみを使用して、その行のターゲット値を予測します。行の予測値の決定に役立つ他の行やソースの計算データまたは集計データがある場合は、そのデータをソース行に含めます。新しい列でターゲットの漏出トレーニング / サービング スキューが発生しないように注意してください。

たとえば、商品の翌週の需要を予測する場合、次の値を持つ列を含めることで予測の品質を改善できます。

  • 商品と同じカテゴリの在庫品目の合計数。
  • 商品と同じカテゴリの在庫品目の平均価格。
  • 予測がリクエストされたときから既知の休日までの日数。
  • その他

別の例では、特定のユーザーが商品を購入するかどうかを予測する場合、次の値を持つ列を含めることで予測の品質を改善できます。

  • 特定のユーザーの過去の平均コンバージョン率またはクリック率。
  • 現在ユーザーのショッピング カートにある商品の数。

null 値を空の文字列で表す

特殊文字や数字を使用してデータで null 値を表している場合、AutoML Tables はそれらが何を表しているかわからないため、問題が発生する可能性があります。CSV からインポートする場合、mull 値は空の文字列で表してください。BigQuery からインポートする場合は、NULL 値を使用してください。

可能であれば欠損値を避ける

データに欠損値がないか確認し、可能であれば修正します。それ以外の場合は、列が null 可能に設定されている場合、値を空白のままにできます。

スペースを使ってテキストを区切る

AutoML Tables はテキスト文字列をトークン化して、個々の単語からトレーニング シグナルを導き出すことができます。単語はスペースで区切られるため、他の文字で区切られている単語は 1 つのエンティティとして扱われます。

たとえば、テキスト「red/green/blue」を指定した場合、「red」、「green」、「blue」にトークン化されません。これらの個々の単語がモデルのトレーニングで重要になるかもしれない場合は、このテキストを「red green blue」に変換してからトレーニング データに含めてください。

カテゴリ型の特徴を正確かつクリーンにする

データの不整合が原因でカテゴリが誤って分割される可能性があります。たとえば、データに「Brown」と「brown」が含まれている場合、ユーザーがこれらを同じものと意図していたとしても、AutoML Tables はこれらの値を別々のカテゴリとして使用します。スペルミスも同様の結果になります。トレーニング データを作成する前に、こうした種類の不整合をカテゴリデータから削除しておいてください。

クラスの不均衡に十分注意をする

クラスが不均衡(めったに見られない、1 つ以上の結果に関連する分類上の問題)である場合は、次のヒントをご覧ください。

少数派のクラスに十分なトレーニング データを用意する

1 つのクラスでデータが数行しかないと、モデルの品質が低下します。可能であれば、すべてのクラスに 100 行以上のデータを用意してください。

手動分割の使用を検討する

AutoML Tables は、テスト データセットの行をランダムに(しかし確定的に)選択します。クラスが不均衡である場合、テスト データセットに少数派のクラスがごくわずかしか、あるいはまったく含まれず、トレーニングが失敗することがあります。

クラスが不均衡である場合は、手動分割を割り当てて、少数派の結果を含んだ十分な行数をすべての分割に含めることができます。

偏りを避ける

トレーニング データは、予測の対象となる潜在的データの全領域を表すものになるようにしてください。たとえば、顧客が世界中にいる場合は、1 つの国だけのトレーニング データを使用すべきではありません。

十分なトレーニング データを用意する

十分なトレーニング データ(行)を用意しないと、結果として得られるモデルのパフォーマンスが悪くなる場合があります。モデルのトレーニングに使用する特徴(列)が多いほど、より多くのデータ(行)を提供する必要があります。分類モデルの適切な目標としては、列数の少なくとも 10 倍の行数です。回帰モデルでは、列数の少なくとも 50 倍の行数を提供する必要があります。

データセットは必ず 1,000 行以上にしなければなりません。

他のすべての前処理と変換を AutoML Tables にまかせる

特に明記されない限り、AutoML Tables に特徴エンジニアリングを委ねます。AutoML Tables は、基になるデータにアクセスできると最良の性能を発揮します。AutoML Tables による自動データ準備をご覧ください。

AutoML Tables による自動データ準備

このセクションでは、AutoML Tables が自動的に行うトレーニング データの一般的な要件を紹介します。トレーニング データにこれらの計算を含める必要はありません。実際、これらの変換を手動で行い、トレーニング データに含めると、結果として得られるモデルの品質がかえって低下する場合があります。

次の自動変換は、列の型に応じて各特徴列に適用されます。

列の型 変換
数値
  • float32 に変換された値。
  • 値の z_score。
  • 分位に基づく値のバケット インデックス。バケットサイズは 100 です。
  • 値が 0 以上の場合は log(value+1)。それ以外の場合、この変換は適用されず、値は欠損値と見なされます。
  • 値が 0 以上の場合は log(value+1) の z_score。それ以外の場合、この変換は適用されず、値は欠損値と見なされます。
  • 値が null かどうかを示すブール値。
  • 無効な数値入力(たとえば、float32 に解析できない文字列)を含む行は、トレーニングと予測に含まれません。
  • 極端な値や外れ値には特別な処理はありません。
数値配列
  • 最後の N 個(N = {1, 2, 4, 8, all})のアイテムの平均に適用される数値型のすべての変換。そのため、最も重視されるのは、配列の先頭ではなく末尾に近いアイテムです。
  • 空の配列の平均はゼロとして扱われます。
カテゴリ
  • 大文字と小文字、句読点、スペル、時制などの変更がないそのままのカテゴリ文字列。
  • カテゴリ名を辞書ルックアップ インデックスに変換し、インデックスごとに埋め込みを生成します。
  • トレーニング データセットに 5 回未満しか表示されないカテゴリは、「不明」カテゴリとして扱われます。「不明」カテゴリは、固有の特別なルックアップ インデックスと結果の埋め込みを取得します。
カテゴリ配列
  • 最後の N 個(N = {1, 2, 4, 8, all})のアイテムの配列内の各要素について、カテゴリ名を辞書ルックアップ インデックスに変換し、インデックスごとに埋め込みを生成します。平均を使用して、すべての要素の埋め込みを 1 つの埋め込みに結合します。
  • 空の配列は、ゼロの埋め込みとして扱われます。
テキスト
  • 大文字と小文字、句読点、スペル、時制などの変更がないそのままのテキスト。
  • テキストを単語にトークン化し、単語から 1 グラムと 2 グラムを生成します。各 n グラムを辞書ルックアップ インデックスに変換し、インデックスごとに埋め込みを生成します。平均を使用して、すべての要素の埋め込みを 1 つの埋め込みに結合します。

    トークン化は、Unicode スクリプトの境界に基づいています。

  • 欠損値は、固有のルックアップ インデックスと結果としての埋め込みを取得します。
  • ストップワードは特別な扱いを受けず、削除されません。
テキスト配列
  • スペース(「 」)を区切り文字として使用して、配列内のすべてのテキスト値を単一のテキスト値に連結し、結果を単一のテキスト値として処理します。テキスト列の変換を適用します。
  • 空の配列は、ゼロの埋め込みとして扱われます。
タイムスタンプ
  • 数値列の変換を適用します。
  • 年、月、日、曜日を決定します。タイムスタンプの各値をカテゴリ列として扱います。
  • 無効な数値(たとえば、一般的なタイムスタンプ範囲外の値や極端な値)は特別な扱いを受けず、削除されません。
  • 無効なタイムスタンプ入力(たとえば、無効なタイムスタンプ文字列)を含む行は、トレーニングと予測に含まれません。
タイムスタンプ配列
  • 数値列の変換を配列の最後の N 個のアイテムの平均に適用します。N = {1, 2, 4, 8, all} です。つまり、最も重視されるのは配列の末尾に近いアイテムです。
構造体
  • 構造体の値は自動的にフィールドにフラット化されます。フラット化されたフィールドは、列の型に従って処理されます。

null 値または欠損値

データセット スキーマで列に null 値を許可するかどうかを設定することで、トレーニング データの null 値をどのように処理するかを選択できます。詳細については、データセットの作成をご覧ください。

null 値が許可されない列に null 値がある場合は、その行全体がトレーニングから除外されます。

null 値を指定できる列の null 値は、値が null 値または欠損値であることを示す特別なインジケーター変数で表されます。カテゴリ変換とテキスト変換の場合、インジケーターは埋め込みになります。

AutoML Tables は、以下を null 値として処理します。

  • BigQuery NULL 値

  • NaN または無限数値。

  • 空の文字列。AutoML Tables は文字列からスペースを削除しません。つまり、「 」は null 値と見なされません。

  • NaN または無限数値に変換できる文字列。

    • 「NAN」の場合: 大文字と小文字を区別せず、オプションのプラスまたはマイナス記号を先頭に付けます。
    • 「INF」の場合: 大文字と小文字を区別せず、オプションのプラスまたはマイナス記号を先頭に付けます。
  • 欠損値

次のステップ